# HG changeset patch # User Olaf Wintermann # Date 1770403061 -3600 # Node ID c99e0b352e363b550d409efe8fd7fed34e8af3fa # Parent b8d5b797d090eccbda8b16720cfd80a2fd0c3377 add non-blocking http client connect diff -r b8d5b797d090 -r c99e0b352e36 src/server/proxy/httpclient.c --- a/src/server/proxy/httpclient.c Fri Feb 06 17:07:58 2026 +0100 +++ b/src/server/proxy/httpclient.c Fri Feb 06 19:37:41 2026 +0100 @@ -28,6 +28,10 @@ #include "httpclient.h" +#include + +static int client_connected(EventHandler *ev, Event *event); + HttpClient* http_client_new(EventHandler *ev) { CxMempool *mp = cxMempoolCreate(32, CX_MEMPOOL_TYPE_PURE); if(!mp) { @@ -86,3 +90,52 @@ } return err; } + +int http_client_start(HttpClient *client) { + int socketfd = socket(AF_INET, SOCK_STREAM, 0); + if(socketfd < 0) { + return 1; + } + + int flags; + if ((flags = fcntl(socketfd, F_GETFL, 0)) == -1) { + flags = 0; + } + if (fcntl(socketfd, F_SETFL, flags | O_NONBLOCK) != 0) { + close(socketfd); + return 1; + } + + client->writeev.cookie = client; + client->writeev.fn = client_connected; + + int ret = ev_pollout(client->ev, socketfd, &client->writeev); + if(ret) { + close(socketfd); + } + return 1; +} + +static int create_req_buffer(HttpClient *client) { + CxBuffer buf; + if(cxBufferInit(&buf, cxDefaultAllocator, NULL, 1024, CX_BUFFER_AUTO_EXTEND)) { + return 1; + } + + + + return 0; +} + +static int client_connected(EventHandler *ev, Event *event) { + HttpClient *client = event->cookie; + if(create_req_buffer(client)) { + // TODO: set error + return 0; // end + } + + + return 1; +} + + diff -r b8d5b797d090 -r c99e0b352e36 src/server/proxy/httpclient.h --- a/src/server/proxy/httpclient.h Fri Feb 06 17:07:58 2026 +0100 +++ b/src/server/proxy/httpclient.h Fri Feb 06 19:37:41 2026 +0100 @@ -49,6 +49,8 @@ struct sockaddr *addr; size_t addrlen; + int socketfd; + HeaderArray *request_headers; HeaderArray *response_headers; @@ -88,8 +90,11 @@ // internals - Event out_event; - Event in_event; + char *req_buffer; + size_t req_buffer_len; + + Event readev; + Event writeev; }; HttpClient* http_client_new(EventHandler *ev); @@ -112,6 +117,7 @@ */ int http_client_add_request_header_copy(HttpClient *client, cxstring name, cxstring value); +int http_client_start(HttpClient *client); #ifdef __cplusplus }