1
1
use web, fastcgi
2
2
import web/[Server, Application]
3
3
import fastcgi/fcgx
4
- import io/Writer
4
+ import io/[Reader, Writer]
5
5
6
6
7
7
/* *
@@ -31,7 +31,7 @@ FCGIServer: class extends Server {
31
31
// Begin listening for requests
32
32
while (FCGX accept (fcgi& ) == 0 ) {
33
33
// parse and setup request
34
- request := FCGIRequest new (fcgi envp)
34
+ request := FCGIRequest new (fcgi envp, fcgi in )
35
35
request path = FCGX getParam ("REQUEST_URI" , fcgi envp)
36
36
request method = FCGX getParam ("REQUEST_METHOD" , fcgi envp)
37
37
request remoteAddress = FCGX getParam ("REMOTE_ADDR" , fcgi envp)
@@ -50,14 +50,19 @@ FCGIServer: class extends Server {
50
50
51
51
FCGIRequest : class extends Request {
52
52
_envp : Pointer
53
+ stream : FCGXStream *
53
54
54
- init : func (= _envp ) {}
55
+ init : func (= _envp , = stream ) {}
55
56
56
57
getHeader : func (name : String ) -> String {
57
58
value := FCGX getParam ("HTTP_%s" format (name toUpper ()), _envp)
58
59
if (value ! = null ) return value clone ()
59
60
else return value
60
61
}
62
+
63
+ body : func -> Reader {
64
+ FCGIBodyReader new (stream)
65
+ }
61
66
}
62
67
63
68
FCGIResponse : class extends Response {
@@ -85,6 +90,42 @@ FCGIResponse: class extends Response {
85
90
}
86
91
}
87
92
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
+
88
129
FCGIBodyWriter : class extends Writer {
89
130
stream : FCGXStream *
90
131
0 commit comments