diff -r df64b4b79912 -r 5fb102d2c745 src/server/proxy/httpclient.c --- a/src/server/proxy/httpclient.c Wed Feb 25 23:14:47 2026 +0100 +++ b/src/server/proxy/httpclient.c Thu Feb 26 21:35:53 2026 +0100 @@ -39,6 +39,7 @@ static int client_connected(EventHandler *ev, Event *event); static int client_io(EventHandler *ev, Event *event); +static int client_process(HttpClient *client, Event *event); static int client_finished(EventHandler *ev, Event *event); static int client_send_buf(HttpClient *client); @@ -239,11 +240,14 @@ return ret; } -int http_client_process(HttpClient *client) { - if(client->stage < 0) { - return 0; +int http_client_process(HttpClient *client, Event *event) { + int ret = client_process(client, event); + if(ret && client->error == 0 && client->event.fn == NULL) { + if(client_start_poll(client)) { + client->error = 1; + } } - return client_io(client->ev, &client->event); + return ret; } size_t http_client_message_buf_size_available(HttpClient *client) { @@ -296,6 +300,7 @@ static int client_connected(EventHandler *ev, Event *event) { HttpClient *client = event->cookie; + client->last_event = event; if(client->stage < 0) { return 0; } @@ -310,6 +315,11 @@ static int client_io(EventHandler *ev, Event *event) { HttpClient *client = event->cookie; + return client_process(client, event); +} + +static int client_process(HttpClient *client, Event *event) { + client->last_event = event; if(client->stage < 0) { return 0; } @@ -330,7 +340,23 @@ } // writing complete, switch to read events - event->events = EVENT_POLLIN; + + if(client->event.events != EVENT_POLLIN) { + if(&client->event != event) { + // The current event, that invoked client_process, is not the + // actual HttpClient event. + // Remove the current HttpClient poll event and re-add it later + // if needed + if(ev_remove_poll(client->ev, client->socketfd)) { + client->error = 1; + return 1; + } + client->event.fn = NULL; + } + client->event.events = EVENT_POLLIN; + + } + client->stage = 1; if(client_read_response_header(client)) { @@ -357,6 +383,7 @@ close(client->socketfd); client->socketfd = -1; + client->stage = -1; // request finished if(client->response_finished) { @@ -381,7 +408,7 @@ if(w <= 0) { if(errno != EAGAIN) { // TODO: log correct host - log_ereport(LOG_VERBOSE, "http-client %s - %s: write failed: %s", "localhost", client->uri, strerror(errno)); + log_ereport(LOG_FAILURE, "http-client %s - %s: write failed: %s", "localhost", client->uri, strerror(errno)); client->error = 1; } return 1;