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 <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Sam Roberts <vieuxtech@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
This commit is contained in:
Ben Noordhuis 2019-03-21 11:11:21 +01:00 committed by Rich Trott
parent 3f41fcbe83
commit b4f58c2caf
2 changed files with 16 additions and 4 deletions

View File

@ -193,11 +193,13 @@ constexpr size_t kFsStatsBufferLength = kFsStatsFieldsNumber * 2;
V(get_data_clone_error_string, "_getDataCloneError") \ V(get_data_clone_error_string, "_getDataCloneError") \
V(get_shared_array_buffer_id_string, "_getSharedArrayBufferId") \ V(get_shared_array_buffer_id_string, "_getSharedArrayBufferId") \
V(gid_string, "gid") \ V(gid_string, "gid") \
V(h2_string, "h2") \
V(handle_string, "handle") \ V(handle_string, "handle") \
V(help_text_string, "helpText") \ V(help_text_string, "helpText") \
V(homedir_string, "homedir") \ V(homedir_string, "homedir") \
V(host_string, "host") \ V(host_string, "host") \
V(hostmaster_string, "hostmaster") \ V(hostmaster_string, "hostmaster") \
V(http_1_1_string, "http/1.1") \
V(ignore_string, "ignore") \ V(ignore_string, "ignore") \
V(infoaccess_string, "infoAccess") \ V(infoaccess_string, "infoAccess") \
V(inherit_string, "inherit") \ V(inherit_string, "inherit") \

View File

@ -65,6 +65,7 @@ using v8::DontDelete;
using v8::EscapableHandleScope; using v8::EscapableHandleScope;
using v8::Exception; using v8::Exception;
using v8::External; using v8::External;
using v8::False;
using v8::Function; using v8::Function;
using v8::FunctionCallback; using v8::FunctionCallback;
using v8::FunctionCallbackInfo; using v8::FunctionCallbackInfo;
@ -2503,11 +2504,20 @@ void SSLWrap<Base>::GetALPNNegotiatedProto(
SSL_get0_alpn_selected(w->ssl_.get(), &alpn_proto, &alpn_proto_len); SSL_get0_alpn_selected(w->ssl_.get(), &alpn_proto, &alpn_proto_len);
if (!alpn_proto) Local<Value> result;
return args.GetReturnValue().Set(false); 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( args.GetReturnValue().Set(result);
OneByteString(args.GetIsolate(), alpn_proto, alpn_proto_len));
} }