diff -r f4c593a99266 -r db37761a8494 src/server/util/io.c --- a/src/server/util/io.c Wed Feb 18 10:53:55 2026 +0100 +++ b/src/server/util/io.c Wed Feb 18 12:31:19 2026 +0100 @@ -306,6 +306,20 @@ return 0; } +int httpstream_enable_buffered_read(IOStream *st, char *buffer, size_t bufsize, int *cursize, int *pos) { + if(st->read != (io_read_f)net_http_read) { + log_ereport(LOG_FAILURE, "%s", "httpstream_enable_chunked_read: IOStream is not an HttpStream"); + return 1; + } + st->read = (io_read_f)net_http_read_buffered; + HttpStream *http = (HttpStream*)st; + http->readbuf = buffer; + http->bufsize = bufsize; + http->buflen = cursize; + http->bufpos = pos; + return 0; +} + int httpstream_enable_chunked_write(IOStream *st) { if(st->type != IO_STREAM_TYPE_HTTP) { log_ereport(LOG_FAILURE, "%s", "httpstream_enable_chunked_write: IOStream is not an HttpStream"); @@ -525,9 +539,9 @@ #define BUF_UNNEEDED_DIFF 64 /* - * read from st->chunk_buf first, read from st->fd if perform_io is true + * read from st->readbuf first, read from st->fd if perform_io is true */ -static ssize_t net_http_read_buffered(HttpStream *st, char *buf, size_t nbytes, WSBool read_data, WSBool *perform_io) { +static ssize_t http_read_buffered(HttpStream *st, char *buf, size_t nbytes, WSBool read_data, WSBool *perform_io) { ssize_t r = 0; //memset(buf, 'x', nbytes); @@ -574,13 +588,18 @@ if(rlen > 0) { // call func again to get data from buffer (no IO will be performed) - r += net_http_read_buffered(st, buf, nbytes, read_data, perform_io); + r += http_read_buffered(st, buf, nbytes, read_data, perform_io); } } return r; } +ssize_t net_http_read_buffered(HttpStream *st, void *buf, size_t nbytes) { + WSBool perform_io = TRUE; + return http_read_buffered(st, buf, nbytes, TRUE, &perform_io); +} + /* * parses a chunk header @@ -687,7 +706,7 @@ // how many bytes are available in the current chunk size_t chunk_available = st->max_read - st->read; if(chunk_available > 0) { - ssize_t r = net_http_read_buffered(st, rbuf, rbuflen, TRUE, &perform_io); + ssize_t r = http_read_buffered(st, rbuf, rbuflen, TRUE, &perform_io); if(r == 0) { break; } @@ -705,7 +724,7 @@ return -1; } // fill st->chunk_buf - ssize_t r = net_http_read_buffered(st, &st->chunk_buf[st->chunk_buf_pos], chunkbuf_avail, FALSE, &perform_io); + ssize_t r = http_read_buffered(st, &st->chunk_buf[st->chunk_buf_pos], chunkbuf_avail, FALSE, &perform_io); if(r == 0) { break; }