src/server/util/io.c

changeset 683
db37761a8494
parent 657
f1469e3144a7
child 684
48da20bde908
--- 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;
             }

mercurial