Skip to content

Commit d381e07

Browse files
committed
Request now supports reading the body content.
See example/echo.ooc
1 parent ded4fe1 commit d381e07

File tree

3 files changed

+68
-4
lines changed

3 files changed

+68
-4
lines changed

examples/echo.ooc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use web, fastcgi
2+
3+
import web/Application
4+
import fastcgi/Server
5+
import text/StringBuffer
6+
7+
EchoApplication: class extends Application {
8+
processRequest: func {
9+
response setHeader("Content-type", "plain/text; charset=utf-8")
10+
response body() write(request body())
11+
}
12+
}
13+
14+
main: func {
15+
server := FCGIServer new(":8000")
16+
server setApplication(EchoApplication new())
17+
server run()
18+
}

servers/fastcgi/fastcgi/Server.ooc

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use web, fastcgi
22
import web/[Server, Application]
33
import fastcgi/fcgx
4-
import io/Writer
4+
import io/[Reader, Writer]
55

66

77
/**
@@ -31,7 +31,7 @@ FCGIServer: class extends Server {
3131
// Begin listening for requests
3232
while (FCGX accept(fcgi&) == 0) {
3333
// parse and setup request
34-
request := FCGIRequest new(fcgi envp)
34+
request := FCGIRequest new(fcgi envp, fcgi in)
3535
request path = FCGX getParam("REQUEST_URI", fcgi envp)
3636
request method = FCGX getParam("REQUEST_METHOD", fcgi envp)
3737
request remoteAddress = FCGX getParam("REMOTE_ADDR", fcgi envp)
@@ -50,14 +50,19 @@ FCGIServer: class extends Server {
5050

5151
FCGIRequest: class extends Request {
5252
_envp: Pointer
53+
stream: FCGXStream*
5354

54-
init: func(=_envp) {}
55+
init: func(=_envp, =stream) {}
5556

5657
getHeader: func(name: String) -> String {
5758
value := FCGX getParam("HTTP_%s" format(name toUpper()), _envp)
5859
if (value != null) return value clone()
5960
else return value
6061
}
62+
63+
body: func -> Reader {
64+
FCGIBodyReader new(stream)
65+
}
6166
}
6267

6368
FCGIResponse: class extends Response {
@@ -85,6 +90,42 @@ FCGIResponse: class extends Response {
8590
}
8691
}
8792

93+
FCGIBodyReader: class extends Reader {
94+
stream: FCGXStream*
95+
96+
init: func(=stream) {}
97+
98+
read: func ~string(chars: String, length: Int) -> SizeT {
99+
bytesRead := FCGX getString(chars, length, stream)
100+
if (bytesRead == -1) Exception new("Error while reading string") throw()
101+
marker += bytesRead
102+
return bytesRead
103+
}
104+
105+
read: func(chars: String, offset: Int, count: Int) -> SizeT {
106+
skip(offset - marker)
107+
return read(chars, count)
108+
}
109+
110+
read: func ~char -> Char {
111+
c := FCGX getChar(stream)
112+
if (c == -1) Exception new("Error while reading byte") throw()
113+
marker += 1
114+
return c
115+
}
116+
117+
hasNext: func -> Bool {
118+
c := FCGX getChar(stream)
119+
if (c == -1) return false
120+
FCGX unGetChar(c, stream)
121+
return true
122+
}
123+
124+
rewind: func(offset: Int) { Exception new("Rewind not supported") throw() }
125+
mark: func -> Long { marker }
126+
reset: func(marker: Long) { Exception new("Reset not supported") throw() }
127+
}
128+
88129
FCGIBodyWriter: class extends Writer {
89130
stream: FCGXStream*
90131

web/Application.ooc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import io/Writer
1+
import io/[Reader, Writer]
22

33

44
Request: abstract class {
@@ -12,6 +12,11 @@ Request: abstract class {
1212
Returns the value for the HTTP request header for the given key.
1313
*/
1414
getHeader: abstract func(name: String) -> String
15+
16+
/**
17+
Returns a Reader object for reading the request body.
18+
*/
19+
body: abstract func -> Reader
1520
}
1621

1722
Response: abstract class {

0 commit comments

Comments
 (0)