addServerName, removeServerName, ServerName.js
This commit is contained in:
parent
0e63c77bd0
commit
f77d07014a
26
examples/ServerName.js
vendored
Normal file
26
examples/ServerName.js
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/* Minimal SSL example using ServerNameIndication */
|
||||||
|
|
||||||
|
const uWS = require('../dist/uws.js');
|
||||||
|
const port = 9001;
|
||||||
|
|
||||||
|
const app = uWS.SSLApp({
|
||||||
|
key_file_name: 'misc/key.pem',
|
||||||
|
cert_file_name: 'misc/cert.pem',
|
||||||
|
passphrase: '1234'
|
||||||
|
}).addServerName("localhost", {
|
||||||
|
key_file_name: 'misc/key.pem',
|
||||||
|
cert_file_name: 'misc/cert.pem',
|
||||||
|
passphrase: '1234'
|
||||||
|
}).removeServerName("localhost").addServerName("localhost", {
|
||||||
|
key_file_name: 'misc/key.pem',
|
||||||
|
cert_file_name: 'misc/cert.pem',
|
||||||
|
passphrase: '1234'
|
||||||
|
}).get('/*', (res, req) => {
|
||||||
|
res.end('Hello World!');
|
||||||
|
}).listen(port, (token) => {
|
||||||
|
if (token) {
|
||||||
|
console.log('Listening to port ' + port);
|
||||||
|
} else {
|
||||||
|
console.log('Failed to listen to port ' + port);
|
||||||
|
}
|
||||||
|
});
|
@ -312,24 +312,20 @@ void uWS_App_publish(const FunctionCallbackInfo<Value> &args) {
|
|||||||
app->publish(topic.getString(), message.getString(), BooleanValue(isolate, args[2]) ? uWS::OpCode::BINARY : uWS::OpCode::TEXT, BooleanValue(isolate, args[3]));
|
app->publish(topic.getString(), message.getString(), BooleanValue(isolate, args[2]) ? uWS::OpCode::BINARY : uWS::OpCode::TEXT, BooleanValue(isolate, args[3]));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename APP>
|
/* This one modified per-thread static strings temporarily */
|
||||||
void uWS_App(const FunctionCallbackInfo<Value> &args) {
|
std::pair<struct us_socket_context_options_t, bool> readOptionsObject(const FunctionCallbackInfo<Value> &args, int index) {
|
||||||
|
|
||||||
Isolate *isolate = args.GetIsolate();
|
Isolate *isolate = args.GetIsolate();
|
||||||
Local<FunctionTemplate> appTemplate = FunctionTemplate::New(isolate);
|
|
||||||
appTemplate->SetClassName(String::NewFromUtf8(isolate, std::is_same<APP, uWS::SSLApp>::value ? "uWS.SSLApp" : "uWS.App", NewStringType::kNormal).ToLocalChecked());
|
|
||||||
|
|
||||||
/* Read the options object if any */
|
/* Read the options object if any */
|
||||||
us_socket_context_options_t options = {};
|
us_socket_context_options_t options = {};
|
||||||
std::string keyFileName, certFileName, passphrase, dhParamsFileName, caFileName;
|
thread_local std::string keyFileName, certFileName, passphrase, dhParamsFileName, caFileName;
|
||||||
if (args.Length() == 1) {
|
if (args.Length() > index) {
|
||||||
|
|
||||||
Local<Object> optionsObject = Local<Object>::Cast(args[0]);
|
Local<Object> optionsObject = Local<Object>::Cast(args[index]);
|
||||||
|
|
||||||
/* Key file name */
|
/* Key file name */
|
||||||
NativeString keyFileNameValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "key_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
NativeString keyFileNameValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "key_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||||
if (keyFileNameValue.isInvalid(args)) {
|
if (keyFileNameValue.isInvalid(args)) {
|
||||||
return;
|
return {};
|
||||||
}
|
}
|
||||||
if (keyFileNameValue.getString().length()) {
|
if (keyFileNameValue.getString().length()) {
|
||||||
keyFileName = keyFileNameValue.getString();
|
keyFileName = keyFileNameValue.getString();
|
||||||
@ -339,7 +335,7 @@ void uWS_App(const FunctionCallbackInfo<Value> &args) {
|
|||||||
/* Cert file name */
|
/* Cert file name */
|
||||||
NativeString certFileNameValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "cert_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
NativeString certFileNameValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "cert_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||||
if (certFileNameValue.isInvalid(args)) {
|
if (certFileNameValue.isInvalid(args)) {
|
||||||
return;
|
return {};
|
||||||
}
|
}
|
||||||
if (certFileNameValue.getString().length()) {
|
if (certFileNameValue.getString().length()) {
|
||||||
certFileName = certFileNameValue.getString();
|
certFileName = certFileNameValue.getString();
|
||||||
@ -349,7 +345,7 @@ void uWS_App(const FunctionCallbackInfo<Value> &args) {
|
|||||||
/* Passphrase */
|
/* Passphrase */
|
||||||
NativeString passphraseValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "passphrase", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
NativeString passphraseValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "passphrase", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||||
if (passphraseValue.isInvalid(args)) {
|
if (passphraseValue.isInvalid(args)) {
|
||||||
return;
|
return {};
|
||||||
}
|
}
|
||||||
if (passphraseValue.getString().length()) {
|
if (passphraseValue.getString().length()) {
|
||||||
passphrase = passphraseValue.getString();
|
passphrase = passphraseValue.getString();
|
||||||
@ -359,7 +355,7 @@ void uWS_App(const FunctionCallbackInfo<Value> &args) {
|
|||||||
/* DH params file name */
|
/* DH params file name */
|
||||||
NativeString dhParamsFileNameValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "dh_params_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
NativeString dhParamsFileNameValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "dh_params_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||||
if (dhParamsFileNameValue.isInvalid(args)) {
|
if (dhParamsFileNameValue.isInvalid(args)) {
|
||||||
return;
|
return {};
|
||||||
}
|
}
|
||||||
if (dhParamsFileNameValue.getString().length()) {
|
if (dhParamsFileNameValue.getString().length()) {
|
||||||
dhParamsFileName = dhParamsFileNameValue.getString();
|
dhParamsFileName = dhParamsFileNameValue.getString();
|
||||||
@ -369,7 +365,7 @@ void uWS_App(const FunctionCallbackInfo<Value> &args) {
|
|||||||
/* CA file name */
|
/* CA file name */
|
||||||
NativeString caFileNameValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "ca_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
NativeString caFileNameValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "ca_file_name", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||||
if (caFileNameValue.isInvalid(args)) {
|
if (caFileNameValue.isInvalid(args)) {
|
||||||
return;
|
return {};
|
||||||
}
|
}
|
||||||
if (caFileNameValue.getString().length()) {
|
if (caFileNameValue.getString().length()) {
|
||||||
caFileName = caFileNameValue.getString();
|
caFileName = caFileNameValue.getString();
|
||||||
@ -380,6 +376,64 @@ void uWS_App(const FunctionCallbackInfo<Value> &args) {
|
|||||||
options.ssl_prefer_low_memory_usage = BooleanValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "ssl_prefer_low_memory_usage", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
options.ssl_prefer_low_memory_usage = BooleanValue(isolate, optionsObject->Get(isolate->GetCurrentContext(), String::NewFromUtf8(isolate, "ssl_prefer_low_memory_usage", NewStringType::kNormal).ToLocalChecked()).ToLocalChecked());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return {options, true};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename APP>
|
||||||
|
void uWS_App_addServerName(const FunctionCallbackInfo<Value> &args) {
|
||||||
|
APP *app = (APP *) args.Holder()->GetAlignedPointerFromInternalField(0);
|
||||||
|
|
||||||
|
Isolate *isolate = args.GetIsolate();
|
||||||
|
NativeString hostnamePatternValue(isolate, args[0]);
|
||||||
|
if (hostnamePatternValue.isInvalid(args)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
std::string hostnamePattern;
|
||||||
|
if (hostnamePatternValue.getString().length()) {
|
||||||
|
hostnamePattern = hostnamePatternValue.getString();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto [options, valid] = readOptionsObject(args, 1);
|
||||||
|
if (!valid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
app->addServerName(hostnamePattern.c_str(), options);
|
||||||
|
|
||||||
|
args.GetReturnValue().Set(args.Holder());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename APP>
|
||||||
|
void uWS_App_removeServerName(const FunctionCallbackInfo<Value> &args) {
|
||||||
|
APP *app = (APP *) args.Holder()->GetAlignedPointerFromInternalField(0);
|
||||||
|
|
||||||
|
Isolate *isolate = args.GetIsolate();
|
||||||
|
NativeString hostnamePatternValue(isolate, args[0]);
|
||||||
|
if (hostnamePatternValue.isInvalid(args)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
std::string hostnamePattern;
|
||||||
|
if (hostnamePatternValue.getString().length()) {
|
||||||
|
hostnamePattern = hostnamePatternValue.getString();
|
||||||
|
}
|
||||||
|
|
||||||
|
app->removeServerName(hostnamePattern.c_str());
|
||||||
|
|
||||||
|
args.GetReturnValue().Set(args.Holder());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename APP>
|
||||||
|
void uWS_App(const FunctionCallbackInfo<Value> &args) {
|
||||||
|
|
||||||
|
Isolate *isolate = args.GetIsolate();
|
||||||
|
Local<FunctionTemplate> appTemplate = FunctionTemplate::New(isolate);
|
||||||
|
appTemplate->SetClassName(String::NewFromUtf8(isolate, std::is_same<APP, uWS::SSLApp>::value ? "uWS.SSLApp" : "uWS.App", NewStringType::kNormal).ToLocalChecked());
|
||||||
|
|
||||||
|
auto [options, valid] = readOptionsObject(args, 0);
|
||||||
|
if (!valid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* uSockets copies strings here */
|
/* uSockets copies strings here */
|
||||||
APP *app = new APP(options);
|
APP *app = new APP(options);
|
||||||
|
|
||||||
@ -439,6 +493,10 @@ void uWS_App(const FunctionCallbackInfo<Value> &args) {
|
|||||||
appTemplate->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "listen", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, uWS_App_listen<APP>, args.Data()));
|
appTemplate->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "listen", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, uWS_App_listen<APP>, args.Data()));
|
||||||
appTemplate->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "publish", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, uWS_App_publish<APP>, args.Data()));
|
appTemplate->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "publish", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, uWS_App_publish<APP>, args.Data()));
|
||||||
|
|
||||||
|
/* SNI */
|
||||||
|
appTemplate->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "addServerName", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, uWS_App_addServerName<APP>, args.Data()));
|
||||||
|
appTemplate->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "removeServerName", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, uWS_App_removeServerName<APP>, args.Data()));
|
||||||
|
|
||||||
Local<Object> localApp = appTemplate->GetFunction(isolate->GetCurrentContext()).ToLocalChecked()->NewInstance(isolate->GetCurrentContext()).ToLocalChecked();
|
Local<Object> localApp = appTemplate->GetFunction(isolate->GetCurrentContext()).ToLocalChecked()->NewInstance(isolate->GetCurrentContext()).ToLocalChecked();
|
||||||
localApp->SetAlignedPointerInInternalField(0, app);
|
localApp->SetAlignedPointerInInternalField(0, app);
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 4fcfe49bcce574c0aca7ab6409f81a725bf8f88c
|
Subproject commit 77aced05f8ed262287583299bd86641f40d87cb5
|
Loading…
Reference in New Issue
Block a user