src/server/proxy/httpclient.c

changeset 707
5fb102d2c745
parent 706
df64b4b79912
child 708
027b16665f13
--- 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;

mercurial