src/server/proxy/httpclient.c

changeset 701
936e5487418a
parent 700
658f4c02b4c5
--- 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;
 }

mercurial