diff options
Diffstat (limited to 'src/csharp/Grpc.Core')
-rw-r--r-- | src/csharp/Grpc.Core/ClientBase.cs | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/src/csharp/Grpc.Core/ClientBase.cs b/src/csharp/Grpc.Core/ClientBase.cs index f46184406c..f240d777b9 100644 --- a/src/csharp/Grpc.Core/ClientBase.cs +++ b/src/csharp/Grpc.Core/ClientBase.cs @@ -33,9 +33,10 @@ using System; using System.Collections.Generic; +using System.Text.RegularExpressions; using Grpc.Core.Internal; -using System.Text.RegularExpressions; +using Grpc.Core.Utils; namespace Grpc.Core { @@ -46,15 +47,16 @@ namespace Grpc.Core /// </summary> public abstract class ClientBase { - static readonly Regex TrailingPortPattern = new Regex(":[0-9]+/?$"); + // Regex for removal of the optional DNS scheme, trailing port, and trailing backslash + static readonly Regex ChannelTargetPattern = new Regex(@"^(dns:\/{3})?([^:\/]+)(:\d+)?\/?$"); + readonly Channel channel; readonly string authUriBase; public ClientBase(Channel channel) { this.channel = channel; - // TODO(jtattermush): we shouldn't need to hand-curate the channel.Target contents. - this.authUriBase = "https://" + TrailingPortPattern.Replace(channel.Target, "") + "/"; + this.authUriBase = GetAuthUriBase(channel.Target); } /// <summary> @@ -104,10 +106,23 @@ namespace Grpc.Core { options = options.WithHeaders(new Metadata()); } - var authUri = authUriBase + method.ServiceName; + var authUri = authUriBase != null ? authUriBase + method.ServiceName : null; interceptor(authUri, options.Headers); } return new CallInvocationDetails<TRequest, TResponse>(channel, method, Host, options); } + + /// <summary> + /// Creates Auth URI base from channel's target (the one passed at channel creation). + /// Fully-qualified service name is to be appended to this. + /// </summary> + internal static string GetAuthUriBase(string target) + { + var match = ChannelTargetPattern.Match(target); + if (!match.Success) { + return null; + } + return "https://" + match.Groups[2].Value + "/"; + } } } |