--- a/src/server/proxy/httpclient.c Sun Feb 22 13:39:39 2026 +0100 +++ b/src/server/proxy/httpclient.c Mon Feb 23 22:28:44 2026 +0100 @@ -114,6 +114,15 @@ return 0; } +int http_client_set_socket(HttpClient *client, int socketfd) { + client->socketfd = socketfd; + if(util_socket_setnonblock(socketfd, 1)) { + client->socketfd = -1; + return 1; + } + return 0; +} + int http_client_set_method(HttpClient *client, const char *method) { return http_client_set_method_len(client, method, method ? strlen(method) : 0); } @@ -185,28 +194,40 @@ return http_client_add_request_header(client, cx_mutstr("transfer-encoding"), cx_mutstr("chunked")); } +static int client_start_poll(HttpClient *client, int in) { + client->event.fn = client_connected; + client->event.finish = client_finished; + if(in) { + return ev_pollin(client->ev, client->socketfd, &client->event); + } else { + return ev_pollout(client->ev, client->socketfd, &client->event); + } +} + int http_client_start(HttpClient *client) { + client->event.cookie = client; + if(client->socketfd != -1) { + int ret = client_connected(client->ev, &client->event); + if(ret != 0) { + return client_start_poll(client, 1); // TODO: check event type + } + return 0; + } + int socketfd = socket(client->domain, SOCK_STREAM, 0); if(socketfd < 0) { return 1; } - if(util_socket_setnonblock(socketfd, 1)) { - close(socketfd); return 1; } - client->socketfd = socketfd; - client->event.cookie = client; - client->event.fn = client_connected; - client->event.finish = client_finished; - int ret = 1; if(connect(socketfd, client->addr, client->addrlen)) { int err = errno; if(err == EINPROGRESS) { - ret = ev_pollout(client->ev, socketfd, &client->event); + ret = client_start_poll(client, 1); } else { log_ereport(LOG_FAILURE, "http-client-start: connect failed: %s", strerror(err)); } @@ -216,6 +237,7 @@ if(ret) { close(socketfd); + client->socketfd = -1; } return ret; }