src/server/safs/proxy.c

changeset 671
879005903b2b
parent 670
73987de73246
--- a/src/server/safs/proxy.c	Fri Feb 13 12:18:12 2026 +0100
+++ b/src/server/safs/proxy.c	Sat Feb 14 18:08:24 2026 +0100
@@ -28,10 +28,13 @@
 
 #include "proxy.h"
 
+#include <sys/socket.h>
+#include <arpa/inet.h>
+
 #include "../util/pblock.h"
-
 #include "../proxy/httpclient.h"
 
+// Gets the uri part from an http request line
 static cxstring get_uri_from_clfreq(const char *clfreq) {
     cxstring uri = { NULL, 0 };
     
@@ -71,6 +74,27 @@
     
 }
 
+typedef struct ProxyData {
+    Session *sn;
+    Request *rq;
+} ProxyData;
+
+static int proxy_response_start(HttpClient *client, int status, char *message, void *userdata) {
+    ProxyData *proxy = userdata;
+    
+    protocol_status(proxy->sn, proxy->rq, status, message);
+    protocol_start_response(proxy->sn, proxy->rq);
+    
+    return 0;
+}
+
+static ssize_t proxy_response_write(HttpClient *client, void *buf, size_t nbytes, void *userdata) {
+    ProxyData *proxy = userdata;
+    ssize_t ret = net_write(proxy->sn->csd, buf, nbytes);
+    // TODO: handle errors
+    return ret;
+}
+
 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);
@@ -97,6 +121,13 @@
         return REQ_ABORTED;
     }
     
+    // test address
+    struct sockaddr_in address;
+    inet_pton(AF_INET, "127.0.0.1", &address.sin_addr);
+    address.sin_family = AF_INET;
+    address.sin_port = htons(8080);
+    http_client_set_addr(client, (struct sockaddr*)&address, sizeof(address));    
+    
     // add request headers to the client
     CxIterator i = pblock_iterator(rq->headers);
     cx_foreach(pb_entry*, entry, i) {
@@ -107,7 +138,17 @@
         }
     }
     
+    ProxyData *proxy = pool_malloc(sn->pool, sizeof(ProxyData));
+    proxy->sn = sn;
+    proxy->rq = rq;
+    client->response_start = proxy_response_start;
+    client->response_start_userdata = proxy;
+    client->response_body_write = proxy_response_write;
+    client->response_body_write_userdata = proxy;
+    
+    //net_setnonblock(sn->csd, 1);
     if(http_client_start(client)) {
+        //net_setnonblock(sn->csd, 0);
         http_client_free(client);
         return REQ_ABORTED;
     }

mercurial