@@ -73,7 +73,8 @@ const uint32_t kOnHeadersComplete = 1;
73
73
const uint32_t kOnBody = 2 ;
74
74
const uint32_t kOnMessageComplete = 3 ;
75
75
const uint32_t kOnExecute = 4 ;
76
-
76
+ // Any more fields than this will be flushed into JS
77
+ const size_t kMaxHeaderFieldsCount = 32 ;
77
78
78
79
// helper class for the Parser
79
80
struct StringPtr {
@@ -203,7 +204,7 @@ class Parser : public AsyncWrap, public StreamListener {
203
204
if (num_fields_ == num_values_) {
204
205
// start of new field name
205
206
num_fields_++;
206
- if (num_fields_ == arraysize (fields_) ) {
207
+ if (num_fields_ == kMaxHeaderFieldsCount ) {
207
208
// ran out of space - flush to javascript land
208
209
Flush ();
209
210
num_fields_ = 1 ;
@@ -212,7 +213,7 @@ class Parser : public AsyncWrap, public StreamListener {
212
213
fields_[num_fields_ - 1 ].Reset ();
213
214
}
214
215
215
- CHECK_LT (num_fields_, arraysize (fields_) );
216
+ CHECK_LT (num_fields_, kMaxHeaderFieldsCount );
216
217
CHECK_EQ (num_fields_, num_values_ + 1 );
217
218
218
219
fields_[num_fields_ - 1 ].Update (at, length);
@@ -731,25 +732,15 @@ class Parser : public AsyncWrap, public StreamListener {
731
732
}
732
733
733
734
Local<Array> CreateHeaders () {
734
- Local<Array> headers = Array::New (env ()->isolate ());
735
- Local<Function> fn = env ()->push_values_to_array_function ();
736
- Local<Value> argv[NODE_PUSH_VAL_TO_ARRAY_MAX * 2 ];
737
- size_t i = 0 ;
738
-
739
- do {
740
- size_t j = 0 ;
741
- while (i < num_values_ && j < arraysize (argv) / 2 ) {
742
- argv[j * 2 ] = fields_[i].ToString (env ());
743
- argv[j * 2 + 1 ] = values_[i].ToString (env ());
744
- i++;
745
- j++;
746
- }
747
- if (j > 0 ) {
748
- fn->Call (env ()->context (), headers, j * 2 , argv).ToLocalChecked ();
749
- }
750
- } while (i < num_values_);
735
+ // There could be extra entries but the max size should be fixed
736
+ Local<Value> headers_v[kMaxHeaderFieldsCount * 2 ];
737
+
738
+ for (size_t i = 0 ; i < num_values_; ++i) {
739
+ headers_v[i * 2 ] = fields_[i].ToString (env ());
740
+ headers_v[i * 2 + 1 ] = values_[i].ToString (env ());
741
+ }
751
742
752
- return headers ;
743
+ return Array::New ( env ()-> isolate (), headers_v, num_values_ * 2 ) ;
753
744
}
754
745
755
746
@@ -824,8 +815,8 @@ class Parser : public AsyncWrap, public StreamListener {
824
815
}
825
816
826
817
parser_t parser_;
827
- StringPtr fields_[32 ]; // header fields
828
- StringPtr values_[32 ]; // header values
818
+ StringPtr fields_[kMaxHeaderFieldsCount ]; // header fields
819
+ StringPtr values_[kMaxHeaderFieldsCount ]; // header values
829
820
StringPtr url_;
830
821
StringPtr status_message_;
831
822
size_t num_fields_;
0 commit comments