diff options
author | Fedor Indutny <fedor@indutny.com> | 2018-11-20 23:33:49 -0500 |
---|---|---|
committer | Rod Vagg <rod@vagg.org> | 2018-11-28 11:36:34 +1100 |
commit | af8d9e3972bba423ab0027239062b894030db5c7 (patch) | |
tree | b02210f3b78efad26442649a03ec9ee0405b4ec1 /src | |
parent | f413f7c9cf5749c231c4b4e667dc2cbab959dd59 (diff) | |
download | android-node-v8-af8d9e3972bba423ab0027239062b894030db5c7.tar.gz android-node-v8-af8d9e3972bba423ab0027239062b894030db5c7.tar.bz2 android-node-v8-af8d9e3972bba423ab0027239062b894030db5c7.zip |
http: fix header limit errors and test for llhttp
Ref: https://github.com/nodejs-private/node-private/pull/143
PR-URL: https://github.com/nodejs-private/node-private/pull/149
Reviewed-By: Rod Vagg <rod@vagg.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/node_http_parser.cc | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/src/node_http_parser.cc b/src/node_http_parser.cc index dcc5d8744e..e24f378e3f 100644 --- a/src/node_http_parser.cc +++ b/src/node_http_parser.cc @@ -30,7 +30,7 @@ #include "v8.h" #include <stdlib.h> // free() -#include <string.h> // strdup() +#include <string.h> // strdup(), strchr() #include "http_parser_adaptor.h" @@ -367,7 +367,7 @@ class Parser : public AsyncWrap, public StreamListener { if (r.IsEmpty()) { got_exception_ = true; #ifdef NODE_EXPERIMENTAL_HTTP - llhttp_set_error_reason(&parser_, "JS Exception"); + llhttp_set_error_reason(&parser_, "HPE_JS_EXCEPTION:JS Exception"); #endif /* NODE_EXPERIMENTAL_HTTP */ return HPE_USER; } @@ -395,7 +395,7 @@ class Parser : public AsyncWrap, public StreamListener { if (r.IsEmpty()) { got_exception_ = true; - return HPE_USER; + return -1; } return 0; @@ -712,13 +712,23 @@ class Parser : public AsyncWrap, public StreamListener { env()->bytes_parsed_string(), nread_obj).FromJust(); #ifdef NODE_EXPERIMENTAL_HTTP - obj->Set(env()->context(), - env()->code_string(), - OneByteString(env()->isolate(), - llhttp_errno_name(err))).FromJust(); - obj->Set(env()->context(), - env()->reason_string(), - OneByteString(env()->isolate(), parser_.reason)).FromJust(); + const char* errno_reason = llhttp_get_error_reason(&parser_); + + Local<String> code; + Local<String> reason; + if (err == HPE_USER) { + const char* colon = strchr(errno_reason, ':'); + CHECK_NE(colon, nullptr); + code = OneByteString(env()->isolate(), errno_reason, + colon - errno_reason); + reason = OneByteString(env()->isolate(), colon + 1); + } else { + code = OneByteString(env()->isolate(), llhttp_errno_name(err)); + reason = OneByteString(env()->isolate(), errno_reason); + } + + obj->Set(env()->context(), env()->code_string(), code).FromJust(); + obj->Set(env()->context(), env()->reason_string(), reason).FromJust(); #else /* !NODE_EXPERIMENTAL_HTTP */ obj->Set(env()->context(), env()->code_string(), @@ -790,7 +800,7 @@ class Parser : public AsyncWrap, public StreamListener { #ifdef NODE_EXPERIMENTAL_HTTP header_nread_ += len; if (header_nread_ >= kMaxHeaderSize) { - llhttp_set_error_reason(&parser_, "Headers overflow"); + llhttp_set_error_reason(&parser_, "HPE_HEADER_OVERFLOW:Header overflow"); return HPE_USER; } #endif /* NODE_EXPERIMENTAL_HTTP */ |