src/server/httprequest.c

changeset 8
f4d56bf9de40
parent 7
3c2ed7a7a5fd
child 9
30e51941a673
--- a/src/server/httprequest.c	Wed Dec 28 10:57:36 2011 +0100
+++ b/src/server/httprequest.c	Wed Dec 28 22:02:08 2011 +0100
@@ -147,9 +147,56 @@
             hlen = ha->len;
         }
 
+        if(ha->headers[i].name[0] < 90) {
+            ha->headers[i].name[0] += 32;
+        }
         pblock_nvinsert(ha->headers[i].name, ha->headers[i].value, rq->rq.headers);
     }
 
+    /* check for request body and prepare input buffer */
+    char *ctlen_str = pblock_findkeyval(pb_key_content_length, rq->rq.headers);
+    if(ctlen_str) {
+        int ctlen = atoi(ctlen_str);
+        
+        printf("request body length: %d\n", ctlen);
+
+        netbuf *nb = request->netbuf;
+
+        /* create new netbuf */
+        NetIOStream *net_io = (NetIOStream*)net_stream_from_fd(
+                request->connection->fd);
+        net_io->max_read = ctlen;
+
+        sn->sn.inbuf = malloc(sizeof(netbuf));
+        sn->sn.inbuf->sd = net_io;
+        sn->sn.inbuf->pos = 0;
+        
+        /* prepare buffer */
+        int cur_input_len = nb->cursize - nb->pos;
+        if(cur_input_len >= ctlen) {
+
+            /*
+             * all data is already in the primary input buffer
+             * just link the new netbuf to the primary buffer
+             */
+            sn->sn.inbuf->maxsize = ctlen;
+            sn->sn.inbuf->cursize = ctlen;
+            sn->sn.inbuf->inbuf = nb->inbuf + nb->pos;
+        } else {
+            sn->sn.inbuf->maxsize = (ctlen > 2048) ? (2048) : (ctlen);
+            sn->sn.inbuf->inbuf = malloc(sizeof(sn->sn.inbuf->maxsize));
+
+            if(cur_input_len > 0) {
+                /* we have read a part of the request body -> copy to netbuf */
+                memcpy(sn->sn.inbuf->inbuf, nb->inbuf+nb->pos, cur_input_len);
+            }
+
+            sn->sn.inbuf->cursize = cur_input_len;
+        }
+    } else {
+        sn->sn.inbuf = NULL;
+    }
+
 
     // Send the request to the NSAPI system
     nsapi_handle_request(sn, rq);

mercurial