--- 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 + } } //