add non-blocking http client connect default tip

Fri, 06 Feb 2026 19:37:41 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 06 Feb 2026 19:37:41 +0100
changeset 666
c99e0b352e36
parent 665
b8d5b797d090

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
 }

mercurial