summaryrefslogtreecommitdiff
path: root/src/inspector_socket.cc
diff options
context:
space:
mode:
authorFedor Indutny <fedor@indutny.com>2018-10-29 22:06:09 -0400
committerFedor Indutny <fedor@indutny.com>2018-11-10 17:54:21 -0500
commitd4654d89be0c20f8ca1e153d074a236348618b00 (patch)
treef6aa2013a63ad85987bdef23fa82f1eade6d08ee /src/inspector_socket.cc
parentd3f02d0da3d574b91a15d3ace10e76014b7574fc (diff)
downloadandroid-node-v8-d4654d89be0c20f8ca1e153d074a236348618b00.tar.gz
android-node-v8-d4654d89be0c20f8ca1e153d074a236348618b00.tar.bz2
android-node-v8-d4654d89be0c20f8ca1e153d074a236348618b00.zip
deps: introduce `llhttp`
llhttp is modern, written in human-readable TypeScript, verifiable, and is very easy to maintain. See: https://github.com/indutny/llhttp PR-URL: https://github.com/nodejs/node/pull/24059 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Refael Ackermann <refack@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Rod Vagg <rod@vagg.org> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Ujjwal Sharma <usharma1998@gmail.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Diffstat (limited to 'src/inspector_socket.cc')
-rw-r--r--src/inspector_socket.cc34
1 files changed, 25 insertions, 9 deletions
diff --git a/src/inspector_socket.cc b/src/inspector_socket.cc
index dc36359b5c..8c2d0a5a22 100644
--- a/src/inspector_socket.cc
+++ b/src/inspector_socket.cc
@@ -1,6 +1,6 @@
#include "inspector_socket.h"
-#include "http_parser.h"
+#include "http_parser_adaptor.h"
#include "util-inl.h"
#define NODE_WANT_INTERNALS 1
@@ -433,8 +433,13 @@ class HttpHandler : public ProtocolHandler {
explicit HttpHandler(InspectorSocket* inspector, TcpHolder::Pointer tcp)
: ProtocolHandler(inspector, std::move(tcp)),
parsing_value_(false) {
+#ifdef NODE_EXPERIMENTAL_HTTP
+ llhttp_init(&parser_, HTTP_REQUEST, &parser_settings);
+ llhttp_settings_init(&parser_settings);
+#else /* !NODE_EXPERIMENTAL_HTTP */
http_parser_init(&parser_, HTTP_REQUEST);
http_parser_settings_init(&parser_settings);
+#endif /* NODE_EXPERIMENTAL_HTTP */
parser_settings.on_header_field = OnHeaderField;
parser_settings.on_header_value = OnHeaderValue;
parser_settings.on_message_complete = OnMessageComplete;
@@ -478,9 +483,20 @@ class HttpHandler : public ProtocolHandler {
}
void OnData(std::vector<char>* data) override {
+ parser_errno_t err;
+#ifdef NODE_EXPERIMENTAL_HTTP
+ err = llhttp_execute(&parser_, data->data(), data->size());
+
+ if (err == HPE_PAUSED_UPGRADE) {
+ err = HPE_OK;
+ llhttp_resume_after_upgrade(&parser_);
+ }
+#else /* !NODE_EXPERIMENTAL_HTTP */
http_parser_execute(&parser_, &parser_settings, data->data(), data->size());
+ err = HTTP_PARSER_ERRNO(&parser_);
+#endif /* NODE_EXPERIMENTAL_HTTP */
data->clear();
- if (parser_.http_errno != HPE_OK) {
+ if (err != HPE_OK) {
CancelHandshake();
}
// Event handling may delete *this
@@ -517,14 +533,14 @@ class HttpHandler : public ProtocolHandler {
handler->inspector()->SwitchProtocol(nullptr);
}
- static int OnHeaderValue(http_parser* parser, const char* at, size_t length) {
+ static int OnHeaderValue(parser_t* parser, const char* at, size_t length) {
HttpHandler* handler = From(parser);
handler->parsing_value_ = true;
handler->headers_[handler->current_header_].append(at, length);
return 0;
}
- static int OnHeaderField(http_parser* parser, const char* at, size_t length) {
+ static int OnHeaderField(parser_t* parser, const char* at, size_t length) {
HttpHandler* handler = From(parser);
if (handler->parsing_value_) {
handler->parsing_value_ = false;
@@ -534,17 +550,17 @@ class HttpHandler : public ProtocolHandler {
return 0;
}
- static int OnPath(http_parser* parser, const char* at, size_t length) {
+ static int OnPath(parser_t* parser, const char* at, size_t length) {
HttpHandler* handler = From(parser);
handler->path_.append(at, length);
return 0;
}
- static HttpHandler* From(http_parser* parser) {
+ static HttpHandler* From(parser_t* parser) {
return node::ContainerOf(&HttpHandler::parser_, parser);
}
- static int OnMessageComplete(http_parser* parser) {
+ static int OnMessageComplete(parser_t* parser) {
// Event needs to be fired after the parser is done.
HttpHandler* handler = From(parser);
handler->events_.push_back(
@@ -581,8 +597,8 @@ class HttpHandler : public ProtocolHandler {
}
bool parsing_value_;
- http_parser parser_;
- http_parser_settings parser_settings;
+ parser_t parser_;
+ parser_settings_t parser_settings;
std::vector<HttpEvent> events_;
std::string current_header_;
std::map<std::string, std::string> headers_;