implement proxy request finish callback default tip

Sat, 21 Feb 2026 21:52:08 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 21 Feb 2026 21:52:08 +0100
changeset 694
a5aa94800b59
parent 693
b26cae13b79a

implement proxy request finish callback

src/server/proxy/httpclient.c file | annotate | diff | comparison | revisions
src/server/proxy/httpclient.h file | annotate | diff | comparison | revisions
src/server/safs/proxy.c file | annotate | diff | comparison | revisions
--- a/src/server/proxy/httpclient.c	Sat Feb 21 19:36:15 2026 +0100
+++ b/src/server/proxy/httpclient.c	Sat Feb 21 21:52:08 2026 +0100
@@ -195,14 +195,15 @@
     
     client->socketfd = socketfd;
     
-    client->writeev.cookie = client;
-    client->writeev.fn = client_connected;
+    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->writeev);
+            ret = ev_pollout(client->ev, socketfd, &client->event);
         } else {
             log_ereport(LOG_FAILURE, "http-client-start: connect failed: %s", strerror(err));
         }
--- a/src/server/proxy/httpclient.h	Sat Feb 21 19:36:15 2026 +0100
+++ b/src/server/proxy/httpclient.h	Sat Feb 21 21:52:08 2026 +0100
@@ -137,8 +137,7 @@
     int request_body_terminated;
     int response_header_complete;
     
-    Event readev;
-    Event writeev;
+    Event event;
 };
 
 HttpClient* http_client_new(EventHandler *ev);
--- a/src/server/safs/proxy.c	Sat Feb 21 19:36:15 2026 +0100
+++ b/src/server/safs/proxy.c	Sat Feb 21 21:52:08 2026 +0100
@@ -168,6 +168,12 @@
     return ret;
 }
 
+static void proxy_request_finished(HttpClient *client, void *userdata) {
+    ProxyRequest *proxy = userdata;
+    net_setnonblock(proxy->sn->csd, 0);
+    nsapi_saf_return(proxy->sn, proxy->rq, REQ_PROCEED);
+}
+
 int http_reverse_proxy_service(pblock *param, Session *sn, Request *rq) {
     EventHandler *ev = sn->ev;
     const char *method = pblock_findkeyval(pb_key_method, rq->reqpb);
@@ -274,10 +280,12 @@
     client->response_start_userdata = proxy;
     client->response_body_write = proxy_response_write;
     client->response_body_write_userdata = proxy;
+    client->response_finished = proxy_request_finished;
+    client->response_finished_userdata = proxy;
     
-    //net_setnonblock(sn->csd, 1);
+    net_setnonblock(sn->csd, 1);
     if(http_client_start(client)) {
-        //net_setnonblock(sn->csd, 0);
+        net_setnonblock(sn->csd, 0);
         http_client_free(client);
         return REQ_ABORTED;
     }

mercurial