diff --git a/README.md b/README.md index f759212..53c0e90 100644 --- a/README.md +++ b/README.md @@ -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: diff --git a/client/javascript/main.js b/client/javascript/main.js index d6b1884..449df13 100644 --- a/client/javascript/main.js +++ b/client/javascript/main.js @@ -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); } diff --git a/client/libcurl/main.c b/client/libcurl/main.c index 47a5dd4..263e6ea 100644 --- a/client/libcurl/main.c +++ b/client/libcurl/main.c @@ -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); diff --git a/client/package.json b/client/package.json index 0981d4e..0d26f2f 100644 --- a/client/package.json +++ b/client/package.json @@ -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": {