src/server/proxy/httpclient.c

changeset 683
db37761a8494
parent 682
f4c593a99266
child 684
48da20bde908
--- a/src/server/proxy/httpclient.c	Wed Feb 18 10:53:55 2026 +0100
+++ b/src/server/proxy/httpclient.c	Wed Feb 18 12:31:19 2026 +0100
@@ -42,6 +42,7 @@
 
 static int client_send_request(HttpClient *client);
 static int client_send_request_body(HttpClient *client);
+static int client_read_response_header(HttpClient *client);
 
 HttpClient* http_client_new(EventHandler *ev) {
     CxMempool *mp = cxMempoolCreate(32, CX_MEMPOOL_TYPE_PURE);
@@ -274,7 +275,7 @@
     
     char *buffer;
     size_t nbytes;
-    if(client->header_complete) {
+    if(client->response_header_complete) {
         buffer = client->buffer.inbuf;
         nbytes = client->buffer.maxsize;
     } else {
@@ -286,7 +287,7 @@
     ssize_t r;
     while((r = read(client->socketfd, buffer, nbytes)) > 0) {
         client->buffer.cursize += r;
-        if(!client->header_complete) {
+        if(!client->response_header_complete) {
             switch(http_parser_process(client->parser)) {
                 case 0: { // finish
                     if(!http_parser_validate(client->parser)) {
@@ -295,7 +296,7 @@
                     }
                     client->statuscode = client->parser->status;
                     
-                    client->header_complete = 1;
+                    client->response_header_complete = 1;
                     if(client->response_start) {
                         cxmutstr msg = client->parser->msg;
                         char t = msg.ptr[msg.length];
@@ -464,6 +465,55 @@
     return 0;
 }
 
+/*
+static int client_read_response_header(HttpClient *client) {
+    if(client->response_header_complete) {
+        return 0;
+    }
+    
+    char *buffer = client->buffer.inbuf + client->buffer.pos;
+    size_t nbytes = client->buffer.maxsize - client->buffer.cursize;
+    
+    ssize_t r;
+    while((r = read(client->socketfd, buffer, nbytes)) > 0) {
+        client->buffer.cursize += r;
+        if(!client->response_header_complete) {
+            switch(http_parser_process(client->parser)) {
+                case 0: { // finish
+                    if(!http_parser_validate(client->parser)) {
+                        client->error = 1;
+                        return 0;
+                    }
+                    client->statuscode = client->parser->status;
+                    
+                    client->response_header_complete = 1;
+                    if(client->response_start) {
+                        cxmutstr msg = client->parser->msg;
+                        char t = msg.ptr[msg.length];
+                        msg.ptr[msg.length] = 0;
+                        int ret = client->response_start(client, client->statuscode, msg.ptr, client->response_start_userdata);
+                        msg.ptr[msg.length] = t;
+                        
+                        // TODO: check ret
+                    }
+                    break;
+                }
+                case 1: { // need more data
+                    continue;
+                }
+                case 2: { // error
+                    client->error = 1;
+                    return 0;
+                }
+            }
+        }
+        
+        // header complete
+
+    }
+}
+*/
+
 /* --------------------------------- Tests --------------------------------- */
 
 static CX_TEST(test_http_client_send_request) {
@@ -755,7 +805,6 @@
             }
         }
         CX_TEST_ASSERT(req.cur_reads < req.max_reads);
-        //CX_TEST_ASSERT(buf.size == 1084 + 5);
         
         // verify chunks
         char test_request_body[1024];
@@ -776,6 +825,7 @@
             }
             
             char *data = str + 4;
+            CX_TEST_ASSERT(data + chunklen < buf.space + buf.size);
             memcpy(test_request_body + pos, data, chunklen);
             pos += chunklen;
             str = data + chunklen;

mercurial