httpclient: prepare httpstream for websockets

Wed, 04 Mar 2026 21:54:54 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 04 Mar 2026 21:54:54 +0100
changeset 715
30732c5b292c
parent 714
fe4d14625245
child 716
0b3d0af5d74f

httpclient: prepare httpstream for websockets

src/server/proxy/httpclient.c file | annotate | diff | comparison | revisions
src/server/util/io.h file | annotate | diff | comparison | revisions
--- a/src/server/proxy/httpclient.c	Wed Mar 04 21:42:25 2026 +0100
+++ b/src/server/proxy/httpclient.c	Wed Mar 04 21:54:54 2026 +0100
@@ -613,6 +613,26 @@
             client->transfer2_buffer_alloc = HTTP_CLIENT_BUFFER_SIZE;
             client->transfer2_buffer_len = 0;
             client->transfer2_buffer_pos = 0;
+            
+            IOStream *fd = Sysstream_new(NULL, client->socketfd);
+            if(!fd) {
+                client->error = 1;
+                return 1;
+            }
+            HttpStream *http = (HttpStream*)httpstream_new(NULL, fd);
+            if(!http) {
+                fd->free(fd);
+            }
+            if(client->buffer.pos < client->buffer.cursize) {
+                // bytes remaining in the buffer -> enable buffered reading
+                httpstream_enable_buffered_read(
+                        &http->st,
+                        (char*)client->buffer.inbuf,
+                        client->buffer.maxsize,
+                        &client->buffer.cursize,
+                        &client->buffer.pos);
+            }
+            client->stream = http;
         } else {
             // error: unknown protocol
             log_ereport(LOG_FAILURE, "http-client: unknown protocol upgrade: %.*s", (int)hdr_upgrade.length, hdr_upgrade.ptr);
@@ -630,7 +650,7 @@
             fd->free(fd);
         }
         
-        // we can reuse the already allocated transfer_bufer for transfer2
+        // we can reuse the already allocated transfer_buffer for transfer2
         client->transfer2_buffer = client->transfer_buffer;
         client->transfer2_buffer_alloc = client->transfer_buffer_alloc;
         client->transfer2_buffer_len = 0;
@@ -640,9 +660,19 @@
         
         if(contentlength > 0) {
             http->max_read = contentlength;
-            httpstream_enable_buffered_read(&http->st, (char*)client->buffer.inbuf, client->buffer.maxsize, &client->buffer.cursize, &client->buffer.pos);
+            httpstream_enable_buffered_read(
+                    &http->st,
+                    (char*)client->buffer.inbuf,
+                    client->buffer.maxsize,
+                    &client->buffer.cursize,
+                    &client->buffer.pos);
         } else if(chunkedtransferenc) {
-            httpstream_enable_chunked_read(&http->st, (char*)client->buffer.inbuf, client->buffer.maxsize, &client->buffer.cursize, &client->buffer.pos);
+            httpstream_enable_chunked_read(
+                    &http->st,
+                    (char*)client->buffer.inbuf,
+                    client->buffer.maxsize,
+                    &client->buffer.cursize,
+                    &client->buffer.pos);
         }
         client->stream = http;
     }
--- a/src/server/util/io.h	Wed Mar 04 21:42:25 2026 +0100
+++ b/src/server/util/io.h	Wed Mar 04 21:54:54 2026 +0100
@@ -182,7 +182,7 @@
      */
     WSBool write_eof;
     /*
-     * raw socket IO
+     * raw mode: disable max_read limit
      */
     WSBool raw;
 };

mercurial