--- a/src/server/proxy/httpclient.c Wed Feb 18 10:53:55 2026 +0100 +++ b/src/server/proxy/httpclient.c Wed Feb 18 12:31:19 2026 +0100 @@ -42,6 +42,7 @@ static int client_send_request(HttpClient *client); static int client_send_request_body(HttpClient *client); +static int client_read_response_header(HttpClient *client); HttpClient* http_client_new(EventHandler *ev) { CxMempool *mp = cxMempoolCreate(32, CX_MEMPOOL_TYPE_PURE); @@ -274,7 +275,7 @@ char *buffer; size_t nbytes; - if(client->header_complete) { + if(client->response_header_complete) { buffer = client->buffer.inbuf; nbytes = client->buffer.maxsize; } else { @@ -286,7 +287,7 @@ ssize_t r; while((r = read(client->socketfd, buffer, nbytes)) > 0) { client->buffer.cursize += r; - if(!client->header_complete) { + if(!client->response_header_complete) { switch(http_parser_process(client->parser)) { case 0: { // finish if(!http_parser_validate(client->parser)) { @@ -295,7 +296,7 @@ } client->statuscode = client->parser->status; - client->header_complete = 1; + client->response_header_complete = 1; if(client->response_start) { cxmutstr msg = client->parser->msg; char t = msg.ptr[msg.length]; @@ -464,6 +465,55 @@ return 0; } +/* +static int client_read_response_header(HttpClient *client) { + if(client->response_header_complete) { + return 0; + } + + char *buffer = client->buffer.inbuf + client->buffer.pos; + size_t nbytes = client->buffer.maxsize - client->buffer.cursize; + + ssize_t r; + while((r = read(client->socketfd, buffer, nbytes)) > 0) { + client->buffer.cursize += r; + if(!client->response_header_complete) { + switch(http_parser_process(client->parser)) { + case 0: { // finish + if(!http_parser_validate(client->parser)) { + client->error = 1; + return 0; + } + client->statuscode = client->parser->status; + + client->response_header_complete = 1; + if(client->response_start) { + cxmutstr msg = client->parser->msg; + char t = msg.ptr[msg.length]; + msg.ptr[msg.length] = 0; + int ret = client->response_start(client, client->statuscode, msg.ptr, client->response_start_userdata); + msg.ptr[msg.length] = t; + + // TODO: check ret + } + break; + } + case 1: { // need more data + continue; + } + case 2: { // error + client->error = 1; + return 0; + } + } + } + + // header complete + + } +} +*/ + /* --------------------------------- Tests --------------------------------- */ static CX_TEST(test_http_client_send_request) { @@ -755,7 +805,6 @@ } } CX_TEST_ASSERT(req.cur_reads < req.max_reads); - //CX_TEST_ASSERT(buf.size == 1084 + 5); // verify chunks char test_request_body[1024]; @@ -776,6 +825,7 @@ } char *data = str + 4; + CX_TEST_ASSERT(data + chunklen < buf.space + buf.size); memcpy(test_request_body + pos, data, chunklen); pos += chunklen; str = data + chunklen;