--- a/src/server/proxy/httpclient.h Sun Feb 22 10:05:37 2026 +0100 +++ b/src/server/proxy/httpclient.h Sun Feb 22 11:18:47 2026 +0100 @@ -110,6 +110,26 @@ void *response_body_write_userdata; /* + * Websocket write callback function + * + * ssize_t ws_write(HttpClient *client, void *buf, size_t size, void *userdata) + * + * Return: number of processed bytes, + * HTTP_CLIENT_CALLBACK_WOULD_BLOCK or HTTP_CLIENT_CALLBACK_ERROR. + */ + ssize_t (*ws_write)(HttpClient *, void *, size_t, void *); + void *ws_write_userdata; + + /* + * Websocket message IO available + * + * This function is called, when client->socketfd is ready to accept + * new messages (http_client_add_message) + */ + int (*ws_msg_ready)(HttpClient *, void *); + void *ws_msg_ready_userdata; + + /* * Response finished callback * * After this callback, the client object is no longer used. The callback @@ -125,17 +145,25 @@ HttpParser *parser; netbuf buffer; + // transfer_buffer: buffer for sending data to socketfd char *transfer_buffer; size_t transfer_buffer_alloc; size_t transfer_buffer_len; size_t transfer_buffer_pos; + // transfer2_buffer: buffer for response_body_write or ws_write + char *transfer2_buffer; + size_t transfer2_buffer_alloc; + size_t transfer2_buffer_len; + size_t transfer2_buffer_pos; + size_t req_contentlength_pos; - int stage; // 0: request, 1: response + int stage; // 0: request, 1: response, 2: websocket int request_body_complete; int request_body_terminated; int response_header_complete; + int keep_alive; Event event; }; @@ -180,8 +208,24 @@ */ int http_client_enable_chunked_transfer_encoding(HttpClient *client); +/* + * Start request processing + */ int http_client_start(HttpClient *client); +/* + * Handle HttpClient IO and process the request/response + */ +int http_client_process(HttpClient *client); + +/* + * Adds message data, that will be sent to client->socketfd. This function + * should only be called when processing websockets. + */ +int http_client_add_message(HttpClient *client, const void *buf, size_t size); + +size_t http_client_message_buf_size_available(HttpClient *client); + void http_client_add_tests(CxTestSuite *suite);