src/server/proxy/httpclient.c

changeset 672
226bfd584075
parent 671
879005903b2b
child 673
144bdc33fdb6
--- 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;
 }

mercurial