From 4fb254ddb6058b2810b82cd6f560f4534ceec1e4 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Thu, 26 Sep 2019 14:32:54 -0700 Subject: [PATCH] grpc-js: Fix TLS server name handling --- packages/grpc-js/src/call-stream.ts | 2 ++ packages/grpc-js/src/subchannel.ts | 3 ++- packages/grpc-js/test/test-resolver.ts | 32 ++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/grpc-js/src/call-stream.ts b/packages/grpc-js/src/call-stream.ts index 53a25f58..a53dbefa 100644 --- a/packages/grpc-js/src/call-stream.ts +++ b/packages/grpc-js/src/call-stream.ts @@ -329,9 +329,11 @@ export class Http2CallStream extends Duplex implements Call { switch (stream.rstCode) { case http2.constants.NGHTTP2_REFUSED_STREAM: code = Status.UNAVAILABLE; + details = 'Stream refused by server'; break; case http2.constants.NGHTTP2_CANCEL: code = Status.CANCELLED; + details = 'Call cancelled'; break; case http2.constants.NGHTTP2_ENHANCE_YOUR_CALM: code = Status.RESOURCE_EXHAUSTED; diff --git a/packages/grpc-js/src/subchannel.ts b/packages/grpc-js/src/subchannel.ts index 65571586..9148746f 100644 --- a/packages/grpc-js/src/subchannel.ts +++ b/packages/grpc-js/src/subchannel.ts @@ -23,6 +23,7 @@ import { ChannelOptions } from './channel-options'; import { PeerCertificate, checkServerIdentity } from 'tls'; import { ConnectivityState } from './channel'; import { BackoffTimeout } from './backoff-timeout'; +import { getDefaultAuthority } from './resolver'; const { version: clientVersion } = require('../../package.json'); @@ -230,7 +231,7 @@ export class Subchannel { }; connectionOptions.servername = sslTargetNameOverride; } else { - connectionOptions.servername = this.channelTarget; + connectionOptions.servername = getDefaultAuthority(this.channelTarget); } } this.session = http2.connect( diff --git a/packages/grpc-js/test/test-resolver.ts b/packages/grpc-js/test/test-resolver.ts index 35c11bf1..9df45c90 100644 --- a/packages/grpc-js/test/test-resolver.ts +++ b/packages/grpc-js/test/test-resolver.ts @@ -121,5 +121,37 @@ describe('Name Resolver', () => { const resolver = resolverManager.createResolver(target, listener); resolver.updateResolution(); }); + it('Should resolve gRPC interop servers', done => { + let completeCount = 0; + function done2(error?: Error) { + if (error) { + done(error); + } else { + completeCount += 1; + if (completeCount === 2) { + done(); + } + } + } + const target1 = 'grpc-test.sandbox.googleapis.com'; + const target2 = 'grpc-test4.sandbox.googleapis.com'; + const listener: resolverManager.ResolverListener = { + onSuccessfulResolution: ( + addressList: string[], + serviceConfig: ServiceConfig | null, + serviceConfigError: StatusObject | null + ) => { + assert(addressList.length > 0); + done2(); + }, + onError: (error: StatusObject) => { + done2(new Error(`Failed with status ${error.details}`)); + }, + }; + const resolver1 = resolverManager.createResolver(target1, listener); + resolver1.updateResolution(); + const resolver2 = resolverManager.createResolver(target1, listener); + resolver2.updateResolution(); + }) }); });