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
| ... | ... | @@ -134,7 +134,7 @@ void |
| 134 | 134 | httpRequestParserParse(HttpRequestParser this) |
| 135 | 135 | { |
| 136 | 136 | static HttpRequest request = NULL; |
| 137 | - char * data = this->buffer; | |
| 137 | + static char * data; // static pointer to unprocessed data | |
| 138 | 138 | char * line; |
| 139 | 139 | int cont = 1; |
| 140 | 140 | static int header_idx; |
| ... | ... | @@ -143,6 +143,7 @@ httpRequestParserParse(HttpRequestParser this) |
| 143 | 143 | switch(this->state) { |
| 144 | 144 | case HTTP_REQUEST_GARBAGE: |
| 145 | 145 | puts("==skip garbage=="); |
| 146 | + data = this->buffer; // initialize static pointer | |
| 146 | 147 | httpRequestSkip(&data); |
| 147 | 148 | request = new(HttpRequest); |
| 148 | 149 | |
| ... | ... | @@ -188,10 +189,10 @@ httpRequestParserParse(HttpRequestParser this) |
| 188 | 189 | } |
| 189 | 190 | |
| 190 | 191 | header_idx = 0; |
| 191 | - this->state = HTTP_REQUEST_REQEUST_LINE_DONE; | |
| 192 | + this->state = HTTP_REQUEST_REQUEST_LINE_DONE; | |
| 192 | 193 | break; |
| 193 | 194 | |
| 194 | - case HTTP_REQUEST_REQEUST_LINE_DONE: | |
| 195 | + case HTTP_REQUEST_REQUEST_LINE_DONE: | |
| 195 | 196 | puts("==read header=="); |
| 196 | 197 | if (NULL == (line = httpRequestLineGet(&data))) { |
| 197 | 198 | cont = 0; |
| ... | ... | @@ -223,25 +224,40 @@ httpRequestParserParse(HttpRequestParser this) |
| 223 | 224 | case HTTP_REQUEST_HEADERS_DONE: |
| 224 | 225 | puts("==headers done=="); |
| 225 | 226 | |
| 227 | + /** | |
| 228 | + * @TODO: here comes the body handling | |
| 229 | + */ | |
| 226 | 230 | this->state = HTTP_REQUEST_DONE; |
| 227 | 231 | break; |
| 228 | 232 | |
| 229 | 233 | case HTTP_REQUEST_DONE: |
| 230 | 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 | 245 | memmove(this->buffer, |
| 233 | 246 | data, |
| 234 | 247 | this->buffer_used - (data - this->buffer) + 1); |
| 235 | 248 | |
| 236 | 249 | this->buffer_used -= data - this->buffer; |
| 237 | 250 | |
| 251 | + /** | |
| 252 | + * dont continue loop if input buffer is empty | |
| 253 | + */ | |
| 238 | 254 | if (0 == this->buffer_used) { |
| 239 | 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 | 261 | this->state = HTTP_REQUEST_GARBAGE; |
| 246 | 262 | |
| 247 | 263 | break; | ... | ... |
Please
register
or
login
to post a comment