src/server/daemon/httprequest.c

changeset 683
db37761a8494
parent 671
879005903b2b
--- a/src/server/daemon/httprequest.c	Wed Feb 18 10:53:55 2026 +0100
+++ b/src/server/daemon/httprequest.c	Wed Feb 18 12:31:19 2026 +0100
@@ -399,16 +399,41 @@
        
     // check for request body and prepare input buffer
     char *ctlen_str = pblock_findkeyval(pb_key_content_length, rq->rq.headers);
-    if(ctlen_str) {
+    char *transfer_encoding = pblock_findkeyval(pb_key_transfer_encoding, rq->rq.headers);
+    if(ctlen_str || transfer_encoding) {
+        netbuf *nb = sn->netbuf;
+        HttpStream *net_io = (HttpStream*)sn->sn.csd;
+        
+        // a separate buffer is required for reading chunked transfer enc
+        sn->buffer = pool_malloc(pool, nb->maxsize);
+        if(!sn->buffer) {
+            request->status = 503;
+            return 1;
+        }
+
+        // copy remaining bytes from inbuf to the additional buffer
+        if(nb->cursize - nb->pos > 0) {
+            memcpy(sn->buffer, nb->inbuf, nb->cursize);
+        }
+
+        sn->pos = nb->pos;
+        sn->cursize = nb->cursize;
+
+        // clear inbuf
+        nb->pos = 0;
+        nb->cursize = 0;
+        
         int64_t ctlen;
-        if(util_strtoint(ctlen_str, &ctlen)) {
-            netbuf *nb = sn->netbuf;
-            HttpStream *net_io = (HttpStream*)sn->sn.csd;
+        if(ctlen_str && util_strtoint(ctlen_str, &ctlen)) {
             net_io->read_eof = WS_FALSE;
-
+            if(httpstream_enable_buffered_read(sn->sn.csd, sn->buffer, nb->maxsize, &sn->cursize, &sn->pos)) {
+                request->status = 500; // should not happen
+                return 1;
+            }
+            
             // how many bytes are already read and in the buffer
             int cur_input_available = nb->cursize - nb->pos;
-
+            
             if(cur_input_available >= ctlen) {
                 // we have the whole request body in the buffer and
                 // maybe even more
@@ -419,37 +444,12 @@
                 // read still required to get the complete request body
                 net_io->max_read = ctlen - cur_input_available;
             }
-            //printf("request body length: %d\n", ctlen);
-        } // else: should we abort?
-    }
-    char *transfer_encoding = pblock_findkeyval(pb_key_transfer_encoding, rq->rq.headers);
-    if(transfer_encoding) {
-        if(!strcmp(transfer_encoding, "chunked")) {
-            netbuf *nb = sn->netbuf;
-            // a separate buffer is required for reading chunked transfer enc
-            sn->buffer = pool_malloc(pool, nb->maxsize);
-            if(!sn->buffer) {
-                request->status = 503;
-                return 1;
-            }
-            
-            // copy remaining bytes from inbuf to the additional buffer
-            if(nb->cursize - nb->pos > 0) {
-                memcpy(sn->buffer, nb->inbuf, nb->cursize);
-            }
-            
-            sn->pos = nb->pos;
-            sn->cursize = nb->cursize;
-            
-            // clear inbuf
-            nb->pos = 0;
-            nb->cursize = 0;
-            
+        } else if (transfer_encoding) {
             if(httpstream_enable_chunked_read(sn->sn.csd, sn->buffer, nb->maxsize, &sn->cursize, &sn->pos)) {
                 request->status = 500; // should not happen
                 return 1;
             }
-        } // else: TODO: unknown transfer encoding error
+        }
     }
     
     //

mercurial