mirror of https://github.com/grpc/grpc-node.git
Simplify getting checkServerIdentity out of the fourth createSsl argument. Add some tests asserting type-checking behavior.
This commit is contained in:
parent
e0df402151
commit
0c49a57ff7
|
@ -186,35 +186,21 @@ NAN_METHOD(ChannelCredentials::CreateSsl) {
|
||||||
verify_peer_options verify_options = {NULL, NULL, NULL};
|
verify_peer_options verify_options = {NULL, NULL, NULL};
|
||||||
if (!info[3]->IsUndefined()) {
|
if (!info[3]->IsUndefined()) {
|
||||||
if (!info[3]->IsObject()) {
|
if (!info[3]->IsObject()) {
|
||||||
return Nan::ThrowTypeError("createSsl's fourth argument must be an "
|
return Nan::ThrowTypeError("createSsl's fourth argument must be an object");
|
||||||
"object");
|
|
||||||
}
|
}
|
||||||
Local<Context> context = Nan::New<Context>();
|
|
||||||
Local<Object> object = info[3]->ToObject();
|
Local<Object> object = info[3]->ToObject();
|
||||||
MaybeLocal<Array> maybe_props = object->GetOwnPropertyNames(context);
|
|
||||||
if (!maybe_props.IsEmpty()) {
|
|
||||||
Local<Array> props = maybe_props.ToLocalChecked();
|
|
||||||
for(uint32_t i=0; i < props->Length(); i++) {
|
|
||||||
Local<Value> key = props->Get(i);
|
|
||||||
Local<Value> value = object->Get(key);
|
|
||||||
|
|
||||||
if (key->IsString()) {
|
Local<Value> checkServerIdentityValue = Nan::Get(object,
|
||||||
Nan::Utf8String keyStr(key->ToString());
|
Nan::New("checkServerIdentity").ToLocalChecked()).ToLocalChecked();
|
||||||
|
if (!checkServerIdentityValue->IsUndefined()) {
|
||||||
if (strcmp("checkServerIdentity", (const char*)(*keyStr)) == 0) {
|
if (!checkServerIdentityValue->IsFunction()) {
|
||||||
|
return Nan::ThrowTypeError("Value of checkServerIdentity must be a function.");
|
||||||
if (!value->IsFunction()) {
|
|
||||||
return Nan::ThrowError("Value of checkServerIdentity must be a function.");
|
|
||||||
}
|
|
||||||
Nan::Callback *callback = new Callback(Local<Function>::Cast(value));
|
|
||||||
verify_options.verify_peer_callback = verify_peer_callback_wrapper;
|
|
||||||
verify_options.verify_peer_callback_userdata = (void*)callback;
|
|
||||||
verify_options.verify_peer_destruct = verify_peer_callback_destruct;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// do stuff with key / value
|
|
||||||
}
|
}
|
||||||
|
Nan::Callback *callback = new Callback(Local<Function>::Cast(
|
||||||
|
checkServerIdentityValue));
|
||||||
|
verify_options.verify_peer_callback = verify_peer_callback_wrapper;
|
||||||
|
verify_options.verify_peer_callback_userdata = (void*)callback;
|
||||||
|
verify_options.verify_peer_destruct = verify_peer_callback_destruct;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -128,6 +128,25 @@ describe('channel credentials', function() {
|
||||||
grpc.credentials.createSsl(null, null, pem_data);
|
grpc.credentials.createSsl(null, null, pem_data);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
it('works if the fourth argument is an empty object', function() {
|
||||||
|
var creds;
|
||||||
|
assert.doesNotThrow(function() {
|
||||||
|
creds = grpc.credentials.createSsl(ca_data, null, null, {});
|
||||||
|
});
|
||||||
|
assert.notEqual(creds, null);
|
||||||
|
});
|
||||||
|
it('fails if the fourth argument is a non-object value', function() {
|
||||||
|
assert.throws(function() {
|
||||||
|
grpc.credentials.createSsl(ca_data, null, null, 'test');
|
||||||
|
}, TypeError);
|
||||||
|
});
|
||||||
|
it('fails if the checkServerIdentity is a non-function', function() {
|
||||||
|
assert.throws(function() {
|
||||||
|
grpc.credentials.createSsl(ca_data, null, null, {
|
||||||
|
"checkServerIdentity": 'test'
|
||||||
|
});
|
||||||
|
}, TypeError);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue