fix handling of duplicate http headers

This commit is contained in:
ading2210 2024-03-07 15:50:21 -05:00
parent ca137c3cd2
commit 15179fae43
4 changed files with 15 additions and 6 deletions

View file

@ -76,6 +76,8 @@ Most of the standard Fetch API's features are supported, with the exception of:
- Sending credentials/cookies automatically
- Caching
The response may contain multiple HTTP headers with the same name, which the `Headers` object isn't able to properly represent. If this matters to you, use `response.raw_headers`, which is an array of key value pairs, instead of `response.headers`.
Note that there is a hard limit of 50 active TCP connections due to emscripten limitations.
### Creating WebSocket Connections:

View file

@ -132,8 +132,11 @@ function create_response(response_data, response_info) {
writable: false,
value: new Headers()
});
for (let header_name in response_info.headers) {
let header_value = response_info.headers[header_name];
Object.defineProperty(response_obj, "raw_headers", {
writable: false,
value: response_info.headers
});
for (let [header_name, header_value] of response_info.headers) {
response_obj.headers.append(header_name, header_value);
}

View file

@ -167,12 +167,16 @@ void finish_request(CURLMsg *curl_msg) {
cJSON* url_item = cJSON_CreateString(response_url);
cJSON_AddItemToObject(response_json, "url", url_item);
cJSON* headers_item = cJSON_CreateObject();
cJSON* headers_item = cJSON_CreateArray();
struct curl_header *prev_header = NULL;
struct curl_header *header = NULL;
while ((header = curl_easy_nextheader(http_handle, CURLH_HEADER, -1, prev_header))) {
cJSON* header_entry = cJSON_CreateString(header->value);
cJSON_AddItemToObject(headers_item, header->name, header_entry);
cJSON* header_key_entry = cJSON_CreateString(header->name);
cJSON* header_value_entry = cJSON_CreateString(header->value);
cJSON* header_pair_item = cJSON_CreateArray();
cJSON_AddItemToArray(header_pair_item, header_key_entry);
cJSON_AddItemToArray(header_pair_item, header_value_entry);
cJSON_AddItemToArray(headers_item, header_pair_item);
prev_header = header;
}
cJSON_AddItemToObject(response_json, "headers", headers_item);

View file

@ -1,6 +1,6 @@
{
"name": "libcurl.js",
"version": "0.4.0",
"version": "0.4.1",
"description": "An experimental port of libcurl to WebAssembly for use in the browser.",
"main": "libcurl.mjs",
"scripts": {