--- 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; }