Commit 68e96823809e05a6338c56c3dd90ad6307bb771e
1 parent
90df11c0
now stuff seems to work correct even if read does not provide a complete request…
… (tested with telnet)
Showing
2 changed files
with
23 additions
and
7 deletions
@@ -9,7 +9,7 @@ | @@ -9,7 +9,7 @@ | ||
9 | typedef enum e_HttpRequestState { | 9 | typedef enum e_HttpRequestState { |
10 | HTTP_REQUEST_GARBAGE=0, | 10 | HTTP_REQUEST_GARBAGE=0, |
11 | HTTP_REQUEST_START, | 11 | HTTP_REQUEST_START, |
12 | - HTTP_REQUEST_REQEUST_LINE_DONE, | 12 | + HTTP_REQUEST_REQUEST_LINE_DONE, |
13 | HTTP_REQUEST_HEADERS_DONE, | 13 | HTTP_REQUEST_HEADERS_DONE, |
14 | HTTP_REQUEST_DONE | 14 | HTTP_REQUEST_DONE |
15 | } HttpRequestState; | 15 | } HttpRequestState; |
@@ -134,7 +134,7 @@ void | @@ -134,7 +134,7 @@ void | ||
134 | httpRequestParserParse(HttpRequestParser this) | 134 | httpRequestParserParse(HttpRequestParser this) |
135 | { | 135 | { |
136 | static HttpRequest request = NULL; | 136 | static HttpRequest request = NULL; |
137 | - char * data = this->buffer; | 137 | + static char * data; // static pointer to unprocessed data |
138 | char * line; | 138 | char * line; |
139 | int cont = 1; | 139 | int cont = 1; |
140 | static int header_idx; | 140 | static int header_idx; |
@@ -143,6 +143,7 @@ httpRequestParserParse(HttpRequestParser this) | @@ -143,6 +143,7 @@ httpRequestParserParse(HttpRequestParser this) | ||
143 | switch(this->state) { | 143 | switch(this->state) { |
144 | case HTTP_REQUEST_GARBAGE: | 144 | case HTTP_REQUEST_GARBAGE: |
145 | puts("==skip garbage=="); | 145 | puts("==skip garbage=="); |
146 | + data = this->buffer; // initialize static pointer | ||
146 | httpRequestSkip(&data); | 147 | httpRequestSkip(&data); |
147 | request = new(HttpRequest); | 148 | request = new(HttpRequest); |
148 | 149 | ||
@@ -188,10 +189,10 @@ httpRequestParserParse(HttpRequestParser this) | @@ -188,10 +189,10 @@ httpRequestParserParse(HttpRequestParser this) | ||
188 | } | 189 | } |
189 | 190 | ||
190 | header_idx = 0; | 191 | header_idx = 0; |
191 | - this->state = HTTP_REQUEST_REQEUST_LINE_DONE; | 192 | + this->state = HTTP_REQUEST_REQUEST_LINE_DONE; |
192 | break; | 193 | break; |
193 | 194 | ||
194 | - case HTTP_REQUEST_REQEUST_LINE_DONE: | 195 | + case HTTP_REQUEST_REQUEST_LINE_DONE: |
195 | puts("==read header=="); | 196 | puts("==read header=="); |
196 | if (NULL == (line = httpRequestLineGet(&data))) { | 197 | if (NULL == (line = httpRequestLineGet(&data))) { |
197 | cont = 0; | 198 | cont = 0; |
@@ -223,25 +224,40 @@ httpRequestParserParse(HttpRequestParser this) | @@ -223,25 +224,40 @@ httpRequestParserParse(HttpRequestParser this) | ||
223 | case HTTP_REQUEST_HEADERS_DONE: | 224 | case HTTP_REQUEST_HEADERS_DONE: |
224 | puts("==headers done=="); | 225 | puts("==headers done=="); |
225 | 226 | ||
227 | + /** | ||
228 | + * @TODO: here comes the body handling | ||
229 | + */ | ||
226 | this->state = HTTP_REQUEST_DONE; | 230 | this->state = HTTP_REQUEST_DONE; |
227 | break; | 231 | break; |
228 | 232 | ||
229 | case HTTP_REQUEST_DONE: | 233 | case HTTP_REQUEST_DONE: |
230 | puts("==request done=="); | 234 | puts("==request done=="); |
231 | 235 | ||
236 | + /** | ||
237 | + * enqueue current request | ||
238 | + */ | ||
239 | + this->request_queue->requests[(this->request_queue->nrequests)++] = | ||
240 | + request; | ||
241 | + | ||
242 | + /** | ||
243 | + * remove processed stuff from input buffer. | ||
244 | + */ | ||
232 | memmove(this->buffer, | 245 | memmove(this->buffer, |
233 | data, | 246 | data, |
234 | this->buffer_used - (data - this->buffer) + 1); | 247 | this->buffer_used - (data - this->buffer) + 1); |
235 | 248 | ||
236 | this->buffer_used -= data - this->buffer; | 249 | this->buffer_used -= data - this->buffer; |
237 | 250 | ||
251 | + /** | ||
252 | + * dont continue loop if input buffer is empty | ||
253 | + */ | ||
238 | if (0 == this->buffer_used) { | 254 | if (0 == this->buffer_used) { |
239 | cont = 0; | 255 | cont = 0; |
240 | } | 256 | } |
241 | 257 | ||
242 | - this->request_queue->requests[(this->request_queue->nrequests)++] = | ||
243 | - request; | ||
244 | - | 258 | + /** |
259 | + * prepare for next request | ||
260 | + */ | ||
245 | this->state = HTTP_REQUEST_GARBAGE; | 261 | this->state = HTTP_REQUEST_GARBAGE; |
246 | 262 | ||
247 | break; | 263 | break; |
Please
register
or
login
to post a comment