Wed, 04 Mar 2026 21:54:54 +0100
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; }