summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFedor Indutny <fedor@indutny.com>2018-11-20 23:33:49 -0500
committerRod Vagg <rod@vagg.org>2018-11-28 11:36:34 +1100
commitaf8d9e3972bba423ab0027239062b894030db5c7 (patch)
treeb02210f3b78efad26442649a03ec9ee0405b4ec1 /src
parentf413f7c9cf5749c231c4b4e667dc2cbab959dd59 (diff)
downloadandroid-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.cc32
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 */