src/server/daemon/httpparser.c

changeset 101
7fbcdbad0baa
parent 44
3da1f7b6847f
child 162
b169992137a8
--- 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;
             }
         }

mercurial