fix httpclient termination in case an external event has called the last http_client_process default tip

Sat, 14 Mar 2026 13:36:39 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 14 Mar 2026 13:36:39 +0100
changeset 732
2aeaf6f32861
parent 731
9e8b77e3e79c

fix httpclient termination in case an external event has called the last http_client_process

src/server/proxy/httpclient.c file | annotate | diff | comparison | revisions
src/server/safs/proxy.c file | annotate | diff | comparison | revisions
--- a/src/server/proxy/httpclient.c	Sat Mar 14 12:55:23 2026 +0100
+++ b/src/server/proxy/httpclient.c	Sat Mar 14 13:36:39 2026 +0100
@@ -383,6 +383,18 @@
     if(ret) {
         return client->error == 0;
     }
+    log_ereport(LOG_INFORM, "client_process end: %p", event->finish);
+    
+    if(event != &client->event) {
+        // An extern event has called client_process, therefore the
+        // client_finished event callback is not automatically called.
+        // Manually shutdown the client:
+        log_ereport(LOG_INFORM, "client_process: manual shutdown");
+        ev_remove_poll(client->ev, client->socketfd);
+        client_finished(client->ev, &client->event);
+        client->event.fn = NULL;
+        client->event.finish = NULL;
+    }
     
     return 0;
 }
@@ -475,6 +487,7 @@
 
 static int client_finished(EventHandler *ev, Event *event) {
     HttpClient *client = event->cookie;
+    log_ereport(LOG_INFORM, "client_finished: %p", client->response_finished);
     
     close(client->socketfd);
     client->socketfd = -1;
@@ -836,13 +849,21 @@
         }
     }
     
+    if(r == 0) {
+        log_ereport(LOG_INFORM, "client_read_response_body eof");
+    }
+    
     if(r < 0) {
+        if(client->stream->st.io_errno == EWOULDBLOCK) {
+            log_ereport(LOG_INFORM, "client_read_response_body would block");
+        }
+        
         if(client->stream->st.io_errno != EWOULDBLOCK) {
             client->error = 1;
         }
         return 1;
     }
-    
+    log_ereport(LOG_INFORM, "client_read_response_body finished");
     return 0;
 }
 
--- a/src/server/safs/proxy.c	Sat Mar 14 12:55:23 2026 +0100
+++ b/src/server/safs/proxy.c	Sat Mar 14 13:36:39 2026 +0100
@@ -87,6 +87,7 @@
 
 static void proxy_unref(ProxyRequest *proxy) {
     if(--proxy->ref == 0) {
+        log_ereport(LOG_INFORM, "proxy cleanup");
         //const char *method = pblock_findkeyval(pb_key_method, proxy->rq->reqpb);
         //const char *uri = pblock_findkeyval(pb_key_uri, proxy->rq->reqpb);
         //log_ereport(LOG_INFORM, "reverse-proxy: %s %s finished", method, uri);
@@ -141,6 +142,8 @@
 static void proxy_response_finished(HttpClient *client, void *userdata) {
     ProxyRequest *proxy = userdata;
     
+    log_ereport(LOG_INFORM, "proxy_response_finished: %s", client->uri);
+    
     int ret = REQ_PROCEED;
     if(!proxy->response_started) {
         protocol_status(proxy->sn, proxy->rq, 502, NULL);
@@ -170,6 +173,7 @@
             return 1;
         }
     }
+    log_ereport(LOG_INFORM, "proxy_event end: %p", event->finish);
     return 0;
 }
 

mercurial