diff -r 6a031133a498 -r edacba8beedb src/server/safs/proxy.c --- 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;