2525
2626#include "async_wrap-inl.h"
2727#include "env-inl.h"
28+ #include "llhttp.h"
2829#include "memory_tracker-inl.h"
30+ #include "node_external_reference.h"
2931#include "stream_base-inl.h"
3032#include "v8.h"
31- #include "llhttp.h"
3233
3334#include <cstdlib> // free()
3435#include <cstring> // strdup(), strchr()
4748
4849
4950namespace node {
50- namespace { // NOLINT(build/namespaces)
51+ namespace http_parser { // NOLINT(build/namespaces)
5152
5253using v8::Array;
5354using v8::Boolean;
@@ -65,6 +66,7 @@ using v8::Local;
6566using v8::MaybeLocal;
6667using v8::Number;
6768using v8::Object;
69+ using v8::ObjectTemplate;
6870using v8::String;
6971using v8::Uint32;
7072using v8::Undefined;
@@ -1243,97 +1245,59 @@ const llhttp_settings_t Parser::settings = {
12431245 nullptr,
12441246};
12451247
1246- void InitializeHttpParser(Local<Object> target,
1247- Local<Value> unused,
1248- Local<Context> context,
1249- void* priv) {
1250- Realm* realm = Realm::GetCurrent(context);
1251- Environment* env = realm->env();
1252- Isolate* isolate = env->isolate();
1253- BindingData* const binding_data = realm->AddBindingData<BindingData>(target);
1254- if (binding_data == nullptr) return;
1248+ void CreatePerIsolateProperties(IsolateData* isolate_data,
1249+ Local<ObjectTemplate> target) {
1250+ Isolate* isolate = isolate_data->isolate();
12551251
12561252 Local<FunctionTemplate> t = NewFunctionTemplate(isolate, Parser::New);
12571253 t->InstanceTemplate()->SetInternalFieldCount(Parser::kInternalFieldCount);
12581254
1259- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "REQUEST"),
1260- Integer::New(env->isolate(), HTTP_REQUEST));
1261- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "RESPONSE"),
1262- Integer::New(env->isolate(), HTTP_RESPONSE));
1263- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kOnMessageBegin"),
1264- Integer::NewFromUnsigned(env->isolate(), kOnMessageBegin));
1265- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kOnHeaders"),
1266- Integer::NewFromUnsigned(env->isolate(), kOnHeaders));
1267- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kOnHeadersComplete"),
1268- Integer::NewFromUnsigned(env->isolate(), kOnHeadersComplete));
1269- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kOnBody"),
1270- Integer::NewFromUnsigned(env->isolate(), kOnBody));
1271- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kOnMessageComplete"),
1272- Integer::NewFromUnsigned(env->isolate(), kOnMessageComplete));
1273- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kOnExecute"),
1274- Integer::NewFromUnsigned(env->isolate(), kOnExecute));
1275- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kOnTimeout"),
1276- Integer::NewFromUnsigned(env->isolate(), kOnTimeout));
1277-
1278- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kLenientNone"),
1279- Integer::NewFromUnsigned(env->isolate(), kLenientNone));
1280- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kLenientHeaders"),
1281- Integer::NewFromUnsigned(env->isolate(), kLenientHeaders));
1282- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kLenientChunkedLength"),
1283- Integer::NewFromUnsigned(env->isolate(), kLenientChunkedLength));
1284- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kLenientKeepAlive"),
1285- Integer::NewFromUnsigned(env->isolate(), kLenientKeepAlive));
1286- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kLenientTransferEncoding"),
1287- Integer::NewFromUnsigned(env->isolate(), kLenientTransferEncoding));
1288- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kLenientVersion"),
1289- Integer::NewFromUnsigned(env->isolate(), kLenientVersion));
1290- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kLenientDataAfterClose"),
1291- Integer::NewFromUnsigned(env->isolate(), kLenientDataAfterClose));
1292- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kLenientOptionalLFAfterCR"),
1293- Integer::NewFromUnsigned(env->isolate(), kLenientOptionalLFAfterCR));
1294- t->Set(
1295- FIXED_ONE_BYTE_STRING(env->isolate(), "kLenientOptionalCRLFAfterChunk"),
1296- Integer::NewFromUnsigned(env->isolate(), kLenientOptionalCRLFAfterChunk));
1297- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kLenientOptionalCRBeforeLF"),
1298- Integer::NewFromUnsigned(env->isolate(), kLenientOptionalCRBeforeLF));
1299- t->Set(
1300- FIXED_ONE_BYTE_STRING(env->isolate(), "kLenientSpacesAfterChunkSize"),
1301- Integer::NewFromUnsigned(env->isolate(), kLenientSpacesAfterChunkSize));
1302-
1303- t->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kLenientAll"),
1304- Integer::NewFromUnsigned(env->isolate(), kLenientAll));
1305-
1306- Local<Array> methods = Array::New(env->isolate());
1307- Local<Array> all_methods = Array::New(env->isolate());
1308- size_t method_index = -1;
1309- size_t all_method_index = -1;
1310- #define V(num, name, string) \
1311- methods \
1312- ->Set(env->context(), \
1313- ++method_index, \
1314- FIXED_ONE_BYTE_STRING(env->isolate(), #string)) \
1315- .Check();
1316- HTTP_METHOD_MAP(V)
1317- #undef V
1318- #define V(num, name, string) \
1319- all_methods \
1320- ->Set(env->context(), \
1321- ++all_method_index, \
1322- FIXED_ONE_BYTE_STRING(env->isolate(), #string)) \
1323- .Check();
1324- HTTP_ALL_METHOD_MAP(V)
1325- #undef V
1326-
1327- target->Set(env->context(),
1328- FIXED_ONE_BYTE_STRING(env->isolate(), "methods"),
1329- methods).Check();
1330- target
1331- ->Set(env->context(),
1332- FIXED_ONE_BYTE_STRING(env->isolate(), "allMethods"),
1333- all_methods)
1334- .Check();
1335-
1336- t->Inherit(AsyncWrap::GetConstructorTemplate(env));
1255+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "REQUEST"),
1256+ Integer::New(isolate, HTTP_REQUEST));
1257+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "RESPONSE"),
1258+ Integer::New(isolate, HTTP_RESPONSE));
1259+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kOnMessageBegin"),
1260+ Integer::NewFromUnsigned(isolate, kOnMessageBegin));
1261+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kOnHeaders"),
1262+ Integer::NewFromUnsigned(isolate, kOnHeaders));
1263+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kOnHeadersComplete"),
1264+ Integer::NewFromUnsigned(isolate, kOnHeadersComplete));
1265+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kOnBody"),
1266+ Integer::NewFromUnsigned(isolate, kOnBody));
1267+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kOnMessageComplete"),
1268+ Integer::NewFromUnsigned(isolate, kOnMessageComplete));
1269+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kOnExecute"),
1270+ Integer::NewFromUnsigned(isolate, kOnExecute));
1271+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kOnTimeout"),
1272+ Integer::NewFromUnsigned(isolate, kOnTimeout));
1273+
1274+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kLenientNone"),
1275+ Integer::NewFromUnsigned(isolate, kLenientNone));
1276+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kLenientHeaders"),
1277+ Integer::NewFromUnsigned(isolate, kLenientHeaders));
1278+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kLenientChunkedLength"),
1279+ Integer::NewFromUnsigned(isolate, kLenientChunkedLength));
1280+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kLenientKeepAlive"),
1281+ Integer::NewFromUnsigned(isolate, kLenientKeepAlive));
1282+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kLenientTransferEncoding"),
1283+ Integer::NewFromUnsigned(isolate, kLenientTransferEncoding));
1284+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kLenientVersion"),
1285+ Integer::NewFromUnsigned(isolate, kLenientVersion));
1286+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kLenientDataAfterClose"),
1287+ Integer::NewFromUnsigned(isolate, kLenientDataAfterClose));
1288+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kLenientOptionalLFAfterCR"),
1289+ Integer::NewFromUnsigned(isolate, kLenientOptionalLFAfterCR));
1290+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kLenientOptionalCRLFAfterChunk"),
1291+ Integer::NewFromUnsigned(isolate, kLenientOptionalCRLFAfterChunk));
1292+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kLenientOptionalCRBeforeLF"),
1293+ Integer::NewFromUnsigned(isolate, kLenientOptionalCRBeforeLF));
1294+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kLenientSpacesAfterChunkSize"),
1295+ Integer::NewFromUnsigned(isolate, kLenientSpacesAfterChunkSize));
1296+
1297+ t->Set(FIXED_ONE_BYTE_STRING(isolate, "kLenientAll"),
1298+ Integer::NewFromUnsigned(isolate, kLenientAll));
1299+
1300+ t->Inherit(AsyncWrap::GetConstructorTemplate(isolate_data));
13371301 SetProtoMethod(isolate, t, "close", Parser::Close);
13381302 SetProtoMethod(isolate, t, "free", Parser::Free);
13391303 SetProtoMethod(isolate, t, "remove", Parser::Remove);
@@ -1348,7 +1312,7 @@ void InitializeHttpParser(Local<Object> target,
13481312 SetProtoMethod(isolate, t, "duration", Parser::Duration);
13491313 SetProtoMethod(isolate, t, "headersCompleted", Parser::HeadersCompleted);
13501314
1351- SetConstructorFunction(context , target, "HTTPParser", t);
1315+ SetConstructorFunction(isolate , target, "HTTPParser", t);
13521316
13531317 Local<FunctionTemplate> c =
13541318 NewFunctionTemplate(isolate, ConnectionsList::New);
@@ -1358,10 +1322,79 @@ void InitializeHttpParser(Local<Object> target,
13581322 SetProtoMethod(isolate, c, "idle", ConnectionsList::Idle);
13591323 SetProtoMethod(isolate, c, "active", ConnectionsList::Active);
13601324 SetProtoMethod(isolate, c, "expired", ConnectionsList::Expired);
1361- SetConstructorFunction(context, target, "ConnectionsList", c);
1325+ SetConstructorFunction(isolate, target, "ConnectionsList", c);
1326+ }
1327+
1328+ void CreatePerContextProperties(Local<Object> target,
1329+ Local<Value> unused,
1330+ Local<Context> context,
1331+ void* priv) {
1332+ Realm* realm = Realm::GetCurrent(context);
1333+ Environment* env = realm->env();
1334+ Isolate* isolate = env->isolate();
1335+ BindingData* const binding_data = realm->AddBindingData<BindingData>(target);
1336+ if (binding_data == nullptr) return;
1337+
1338+ std::vector<Local<Value>> methods_val;
1339+ std::vector<Local<Value>> all_methods_val;
1340+
1341+ #define V(num, name, string) \
1342+ methods_val.push_back(FIXED_ONE_BYTE_STRING(isolate, #string));
1343+ HTTP_METHOD_MAP(V)
1344+ #undef V
1345+ #define V(num, name, string) \
1346+ all_methods_val.push_back(FIXED_ONE_BYTE_STRING(isolate, #string));
1347+ HTTP_ALL_METHOD_MAP(V)
1348+ #undef V
1349+
1350+ Local<Array> methods =
1351+ Array::New(isolate, methods_val.data(), methods_val.size());
1352+ Local<Array> all_methods =
1353+ Array::New(isolate, all_methods_val.data(), all_methods_val.size());
1354+ if (!target
1355+ ->Set(env->context(),
1356+ FIXED_ONE_BYTE_STRING(isolate, "methods"),
1357+ methods)
1358+ .IsJust()) {
1359+ return;
1360+ }
1361+ if (target
1362+ ->Set(env->context(),
1363+ FIXED_ONE_BYTE_STRING(isolate, "allMethods"),
1364+ all_methods)
1365+ .IsJust()) {
1366+ return;
1367+ }
1368+ }
1369+
1370+ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
1371+ registry->Register(Parser::New);
1372+ registry->Register(Parser::Close);
1373+ registry->Register(Parser::Free);
1374+ registry->Register(Parser::Remove);
1375+ registry->Register(Parser::Execute);
1376+ registry->Register(Parser::Finish);
1377+ registry->Register(Parser::Initialize);
1378+ registry->Register(Parser::Pause<true>);
1379+ registry->Register(Parser::Pause<false>);
1380+ registry->Register(Parser::Consume);
1381+ registry->Register(Parser::Unconsume);
1382+ registry->Register(Parser::GetCurrentBuffer);
1383+ registry->Register(Parser::Duration);
1384+ registry->Register(Parser::HeadersCompleted);
1385+ registry->Register(ConnectionsList::New);
1386+ registry->Register(ConnectionsList::All);
1387+ registry->Register(ConnectionsList::Idle);
1388+ registry->Register(ConnectionsList::Active);
1389+ registry->Register(ConnectionsList::Expired);
13621390}
13631391
1364- } // anonymous namespace
1392+ } // namespace http_parser
13651393} // namespace node
13661394
1367- NODE_BINDING_CONTEXT_AWARE_INTERNAL(http_parser, node::InitializeHttpParser)
1395+ NODE_BINDING_CONTEXT_AWARE_INTERNAL(
1396+ http_parser, node::http_parser::CreatePerContextProperties)
1397+ NODE_BINDING_PER_ISOLATE_INIT(http_parser,
1398+ node::http_parser::CreatePerIsolateProperties)
1399+ NODE_BINDING_EXTERNAL_REFERENCE(http_parser,
1400+ node::http_parser::RegisterExternalReferences)
0 commit comments