Fri, 06 Feb 2026 19:37:41 +0100
add non-blocking http client connect
| src/server/proxy/httpclient.c | file | annotate | diff | comparison | revisions | |
| src/server/proxy/httpclient.h | file | annotate | diff | comparison | revisions |
--- 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 <cx/buffer.h> + +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; +} + +
--- 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 }