summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAlexander Borisov <alexander.borisov@nginx.com>2018-11-15 15:21:52 +0300
committerAlexander Borisov <alexander.borisov@nginx.com>2018-11-15 15:21:52 +0300
commitfb18a09cd748ff0107d4e27e514c9f5caf3aa5e6 (patch)
treedd8738c57c3df3a083500b0e0dee20a334656dfd
parent06b404feb17dec9e3a84da31e213f21a0a9b4846 (diff)
downloadunit-fb18a09cd748ff0107d4e27e514c9f5caf3aa5e6.tar.gz
unit-fb18a09cd748ff0107d4e27e514c9f5caf3aa5e6.tar.bz2
Node.js: fixed handling of response header fields.
This fixes two issues: - values for mutiple header fields with the same name passed as arrays were converted to string; - the type of field value wasn't preserved as required by specification.
-rwxr-xr-xsrc/nodejs/unit-http/http_server.js2
-rw-r--r--src/nodejs/unit-http/unit.cpp25
2 files changed, 26 insertions, 1 deletions
diff --git a/src/nodejs/unit-http/http_server.js b/src/nodejs/unit-http/http_server.js
index b35ad259..331778a3 100755
--- a/src/nodejs/unit-http/http_server.js
+++ b/src/nodejs/unit-http/http_server.js
@@ -78,7 +78,7 @@ ServerResponse.prototype.setHeader = function setHeader(key, value) {
this.removeHeader(key);
- this.headers[key] = value + "";
+ this.headers[key] = value;
this.headers_len += header_len + (header_key_len * header_count);
this.headers_count += header_count;
};
diff --git a/src/nodejs/unit-http/unit.cpp b/src/nodejs/unit-http/unit.cpp
index 788a5cc8..be64a59b 100644
--- a/src/nodejs/unit-http/unit.cpp
+++ b/src/nodejs/unit-http/unit.cpp
@@ -696,6 +696,7 @@ Unit::response_send_headers(napi_env env, napi_callback_info info)
napi_value this_arg, headers, keys, name, value, array_val;
napi_value req_num;
napi_status status;
+ napi_valuetype val_type;
nxt_unit_field_t *f;
nxt_unit_request_info_t *req;
napi_value argv[5];
@@ -805,6 +806,18 @@ Unit::response_send_headers(napi_env env, napi_callback_info info)
goto failed;
}
+ napi_typeof(env, array_val, &val_type);
+ if (status != napi_ok) {
+ goto failed;
+ }
+
+ if (val_type != napi_string) {
+ status = napi_coerce_to_string(env, array_val, &array_val);
+ if (status != napi_ok) {
+ goto failed;
+ }
+ }
+
status = napi_get_value_string_latin1(env, array_val, ptr,
header_len,
&value_len);
@@ -830,6 +843,18 @@ Unit::response_send_headers(napi_env env, napi_callback_info info)
}
} else {
+ napi_typeof(env, value, &val_type);
+ if (status != napi_ok) {
+ goto failed;
+ }
+
+ if (val_type != napi_string) {
+ status = napi_coerce_to_string(env, value, &value);
+ if (status != napi_ok) {
+ goto failed;
+ }
+ }
+
status = napi_get_value_string_latin1(env, value, ptr, header_len,
&value_len);
if (status != napi_ok) {