--- a/src/server/proxy/httpclient.c Sat Feb 14 18:08:24 2026 +0100 +++ b/src/server/proxy/httpclient.c Sun Feb 15 11:16:50 2026 +0100 @@ -36,6 +36,7 @@ static int client_connected(EventHandler *ev, Event *event); static int client_io(EventHandler *ev, Event *event); +static int client_finished(EventHandler *ev, Event *event); static int client_send_request(HttpClient *client); @@ -58,6 +59,7 @@ memset(client, 0, sizeof(HttpClient)); client->ev = ev; + client->socketfd = -1; client->request_headers = req_headers; client->response_headers = resp_headers; @@ -242,8 +244,8 @@ } } - // make sure to receive read-ready events in the future - event->events |= EVENT_POLLIN; + // writing complete, switch to read events + event->events = EVENT_POLLIN; char *buffer; @@ -267,13 +269,14 @@ client->error = 1; return 0; } + client->statuscode = client->parser->status; client->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->parser->status, msg.ptr, client->response_start_userdata); + int ret = client->response_start(client, client->statuscode, msg.ptr, client->response_start_userdata); msg.ptr[msg.length] = t; // TODO: check ret @@ -304,6 +307,32 @@ client->buffer.cursize = 0; } + if(r < 0) { + if(errno == EAGAIN) { + return 1; + } else { + log_ereport(LOG_FAILURE, "http-client: IO error: %s", strerror(errno)); + } + } + + // request finished + if(client->response_finished) { + client->response_finished(client, client->response_finished_userdata); + } + + return 0; +} + +static int client_finished(EventHandler *ev, Event *event) { + HttpClient *client = event->cookie; + + close(client->socketfd); + client->socketfd = -1; + + // request finished + if(client->response_finished) { + client->response_finished(client, client->response_finished_userdata); + } return 0; }