summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoyee Cheung <joyeec9h3@gmail.com>2018-11-09 11:33:12 +0800
committerJoyee Cheung <joyeec9h3@gmail.com>2018-11-14 02:58:22 +0800
commit83c6067ac6f20aa81f00fa020fe528ca27980b7d (patch)
treee7ede828cbb4b6a9bfc3a392619ee059666a29c8 /src
parent1a787b514cde6702bb7513f74392ae6a3b91e6f8 (diff)
downloadandroid-node-v8-83c6067ac6f20aa81f00fa020fe528ca27980b7d.tar.gz
android-node-v8-83c6067ac6f20aa81f00fa020fe528ca27980b7d.tar.bz2
android-node-v8-83c6067ac6f20aa81f00fa020fe528ca27980b7d.zip
http: remove pushValueToArray in Parser::CreateHeaders()
Instead of calling into JS from C++ to push values into an array, use the new Array::New API that takes a pointer and a length directly. PR-URL: https://github.com/nodejs/node/pull/24264 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com> Reviewed-By: Refael Ackermann <refack@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/node_http_parser.cc37
1 files changed, 14 insertions, 23 deletions
diff --git a/src/node_http_parser.cc b/src/node_http_parser.cc
index c9e057711d..f752a003a2 100644
--- a/src/node_http_parser.cc
+++ b/src/node_http_parser.cc
@@ -73,7 +73,8 @@ const uint32_t kOnHeadersComplete = 1;
const uint32_t kOnBody = 2;
const uint32_t kOnMessageComplete = 3;
const uint32_t kOnExecute = 4;
-
+// Any more fields than this will be flushed into JS
+const size_t kMaxHeaderFieldsCount = 32;
// helper class for the Parser
struct StringPtr {
@@ -203,7 +204,7 @@ class Parser : public AsyncWrap, public StreamListener {
if (num_fields_ == num_values_) {
// start of new field name
num_fields_++;
- if (num_fields_ == arraysize(fields_)) {
+ if (num_fields_ == kMaxHeaderFieldsCount) {
// ran out of space - flush to javascript land
Flush();
num_fields_ = 1;
@@ -212,7 +213,7 @@ class Parser : public AsyncWrap, public StreamListener {
fields_[num_fields_ - 1].Reset();
}
- CHECK_LT(num_fields_, arraysize(fields_));
+ CHECK_LT(num_fields_, kMaxHeaderFieldsCount);
CHECK_EQ(num_fields_, num_values_ + 1);
fields_[num_fields_ - 1].Update(at, length);
@@ -731,25 +732,15 @@ class Parser : public AsyncWrap, public StreamListener {
}
Local<Array> CreateHeaders() {
- Local<Array> headers = Array::New(env()->isolate());
- Local<Function> fn = env()->push_values_to_array_function();
- Local<Value> argv[NODE_PUSH_VAL_TO_ARRAY_MAX * 2];
- size_t i = 0;
-
- do {
- size_t j = 0;
- while (i < num_values_ && j < arraysize(argv) / 2) {
- argv[j * 2] = fields_[i].ToString(env());
- argv[j * 2 + 1] = values_[i].ToString(env());
- i++;
- j++;
- }
- if (j > 0) {
- fn->Call(env()->context(), headers, j * 2, argv).ToLocalChecked();
- }
- } while (i < num_values_);
+ // There could be extra entries but the max size should be fixed
+ Local<Value> headers_v[kMaxHeaderFieldsCount * 2];
+
+ for (size_t i = 0; i < num_values_; ++i) {
+ headers_v[i * 2] = fields_[i].ToString(env());
+ headers_v[i * 2 + 1] = values_[i].ToString(env());
+ }
- return headers;
+ return Array::New(env()->isolate(), headers_v, num_values_ * 2);
}
@@ -824,8 +815,8 @@ class Parser : public AsyncWrap, public StreamListener {
}
parser_t parser_;
- StringPtr fields_[32]; // header fields
- StringPtr values_[32]; // header values
+ StringPtr fields_[kMaxHeaderFieldsCount]; // header fields
+ StringPtr values_[kMaxHeaderFieldsCount]; // header values
StringPtr url_;
StringPtr status_message_;
size_t num_fields_;