--- a/src/server/daemon/httpparser.c Sat Oct 17 18:07:04 2015 +0200 +++ b/src/server/daemon/httpparser.c Sat Oct 17 21:17:34 2015 +0200 @@ -41,6 +41,8 @@ parser->state = 0; parser->start_line.ptr = (char*)request->netbuf->inbuf; parser->start_line.length = 0; + + parser->offset = 0; return parser; } @@ -75,16 +77,23 @@ while(buf->pos < buf->cursize) { unsigned char c = buf->inbuf[buf->pos]; if(c == '\n') { - if(buf->pos <= 1) { + size_t lnlen = buf->pos - parser->offset + 1; + if(lnlen <= 2) { + if(lnlen == 1 || buf->inbuf[buf->pos-1] == '\r') { + // skip empty line + buf->pos++; + parser->offset = buf->pos; + return 1; + } // insufficient chars for request, return error return 2; } if(buf->inbuf[buf->pos - 1] == '\r') { - parser->start_line.length = buf->pos; + parser->start_line.length = lnlen - 1; } else { - parser->start_line.length = buf->pos + 1; + parser->start_line.length = lnlen; } - parser->start_line.ptr = (char*)buf->inbuf; + parser->start_line.ptr = (char*)buf->inbuf + parser->offset; buf->pos++; return 0; } @@ -98,7 +107,9 @@ parser->offset = buf->pos; // line offset parser->name.ptr = NULL; + parser->name.length = 0; parser->value.ptr = NULL; + parser->value.length = 0; while(1) { if(buf->pos >= buf->cursize) { return 1; @@ -109,7 +120,7 @@ parser->wl = 0; if(c == ':' && parser->value.ptr == NULL) { parser->name.ptr = (char*)buf->inbuf + parser->offset; - buf->inbuf[buf->pos-1] = 0; + parser->name.length = buf->pos - parser->offset - 1; } else if(parser->name.ptr != NULL && parser->value.ptr == NULL) { parser->value.ptr = (char*)buf->inbuf + buf->pos - 1; } @@ -121,21 +132,24 @@ } else { parser->offset = buf->pos; if(parser->value.ptr != NULL) { - buf->inbuf[buf->pos-1] = 0; + parser->value.length = (buf->inbuf + buf->pos - 1) + - (unsigned char*)parser->value.ptr; if(buf->inbuf[buf->pos-2] == '\r') { - buf->inbuf[buf->pos-2] = 0; + parser->value.length--; } // add header header_add( parser->request->headers, - parser->name.ptr, - parser->value.ptr); + parser->name, + parser->value); } else { // error: no value return 2; } parser->name.ptr = NULL; parser->value.ptr = NULL; + parser->name.length = 0; + parser->value.length = 0; parser->wl = 1; } }