src/server/safs/proxy.c

changeset 675
edacba8beedb
parent 672
226bfd584075
--- a/src/server/safs/proxy.c	Sun Feb 15 13:30:29 2026 +0100
+++ b/src/server/safs/proxy.c	Mon Feb 16 17:43:14 2026 +0100
@@ -151,6 +151,16 @@
     nsapi_function_return(proxy->sn, proxy->rq, ret);
 }
 
+static ssize_t proxy_request_read(HttpClient *client, void *buf, size_t nbytes, void *userdata) {
+    ProxyRequest *proxy = userdata;
+    int ret = netbuf_getbytes(proxy->sn->inbuf, buf, nbytes);
+    if(ret == NETBUF_EOF) {
+        ret = 0;
+    }
+    // TODO: handle errors
+    return ret;
+}
+
 static ssize_t proxy_response_write(HttpClient *client, void *buf, size_t nbytes, void *userdata) {
     ProxyRequest *proxy = userdata;
     ssize_t ret = net_write(proxy->sn->csd, buf, nbytes);
@@ -179,10 +189,12 @@
     proxy->response_header_rewrite = pblock_create_pool(sn->pool, 16);
     proxy->response_started = 0;
     
-    // some request/response headers should be removed or altered
-    // an empty string means, the header should be removed
+    // Some request/response headers should be removed or altered
+    // An empty string means, the header should be removed
     pblock_nvinsert("host", "", proxy->request_header_rewrite);
     pblock_nvinsert("connection", "", proxy->request_header_rewrite);
+    pblock_nvinsert("transfer-encoding", "", proxy->request_header_rewrite);
+    pblock_nvinsert("content-length", "", proxy->request_header_rewrite);
     pblock_nvinsert("server", "", proxy->response_header_rewrite);
     pblock_nvinsert("connection", "", proxy->response_header_rewrite);
     
@@ -216,9 +228,35 @@
         cxmutstr header_value;
         char *rewrite_header = pblock_findval(entry->param->name, proxy->request_header_rewrite);
         if(rewrite_header) {
-            header_value = cx_mutstr(rewrite_header);
-            if(header_value.length == 0) {
+            if(!strcmp(entry->param->name, "transfer-encoding")) {
+                if(!strcmp(entry->param->value, "chunked")) {
+                    // enable chunked transfer encoding
+                    if(http_client_enable_chunked_transfer_encoding(client)) {
+                        http_client_free(client);
+                        return REQ_ABORTED;
+                    }
+                    continue;
+                }
+            } else if(!strcmp(entry->param->name, "content-length")) {
+                long long contentlength;
+                if(!cx_strtoll(cx_str(entry->param->value), &contentlength, 10)) {
+                    if(http_client_set_content_length(client, contentlength)) {
+                        http_client_free(client);
+                        return REQ_ABORTED;
+                    }
+                } else {
+                    // illegal content-length
+                    protocol_status(sn, rq, 400, NULL);
+                    http_client_free(client);
+                    return REQ_ABORTED;
+                }
                 continue;
+            } else {
+                // static header rewrite or remove header if it is empty
+                header_value = cx_mutstr(rewrite_header);
+                if(header_value.length == 0) {
+                    continue;
+                }
             }
         } else {
             header_value = cx_mutstr(entry->param->value);
@@ -230,6 +268,8 @@
         }
     }
     
+    client->request_body_read = proxy_request_read;
+    client->request_body_read_userdata = proxy;
     client->response_start = proxy_response_start;
     client->response_start_userdata = proxy;
     client->response_body_write = proxy_response_write;

mercurial