From 54753f2446c3b8fb4b938bfd0a4434594d016d25 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Thu, 21 Mar 2019 11:11:21 +0100 Subject: [PATCH] src: micro-optimize ALPN negotiation 99 out of a 100 times (conservative estimate!) the negotiated protocol will be either "h2" or "http/1.1" so reuse an existing JS string for those instead of creating a new one every time. PR-URL: https://github.com/nodejs/node/pull/26836 Reviewed-By: Anna Henningsen Reviewed-By: James M Snell Reviewed-By: Sam Roberts Reviewed-By: Colin Ihrig --- src/env.h | 2 ++ src/node_crypto.cc | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/env.h b/src/env.h index aa9266d5b7bc51..f9b4bd030fd170 100644 --- a/src/env.h +++ b/src/env.h @@ -188,11 +188,13 @@ constexpr size_t kFsStatsBufferLength = kFsStatsFieldsNumber * 2; V(get_data_clone_error_string, "_getDataCloneError") \ V(get_shared_array_buffer_id_string, "_getSharedArrayBufferId") \ V(gid_string, "gid") \ + V(h2_string, "h2") \ V(handle_string, "handle") \ V(help_text_string, "helpText") \ V(homedir_string, "homedir") \ V(host_string, "host") \ V(hostmaster_string, "hostmaster") \ + V(http_1_1_string, "http/1.1") \ V(ignore_string, "ignore") \ V(infoaccess_string, "infoAccess") \ V(inherit_string, "inherit") \ diff --git a/src/node_crypto.cc b/src/node_crypto.cc index 885f02b8436cbd..68af2f58b5cfee 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -63,6 +63,7 @@ using v8::DontDelete; using v8::EscapableHandleScope; using v8::Exception; using v8::External; +using v8::False; using v8::Function; using v8::FunctionCallback; using v8::FunctionCallbackInfo; @@ -2400,11 +2401,20 @@ void SSLWrap::GetALPNNegotiatedProto( SSL_get0_alpn_selected(w->ssl_.get(), &alpn_proto, &alpn_proto_len); - if (!alpn_proto) - return args.GetReturnValue().Set(false); + Local result; + if (alpn_proto_len == 0) { + result = False(args.GetIsolate()); + } else if (alpn_proto_len == sizeof("h2") - 1 && + 0 == memcmp(alpn_proto, "h2", sizeof("h2") - 1)) { + result = w->env()->h2_string(); + } else if (alpn_proto_len == sizeof("http/1.1") - 1 && + 0 == memcmp(alpn_proto, "http/1.1", sizeof("http/1.1") - 1)) { + result = w->env()->http_1_1_string(); + } else { + result = OneByteString(args.GetIsolate(), alpn_proto, alpn_proto_len); + } - args.GetReturnValue().Set( - OneByteString(args.GetIsolate(), alpn_proto, alpn_proto_len)); + args.GetReturnValue().Set(result); }