in src/Microsoft.Azure.Relay/HybridConnectionClient.cs [186:242]
public async Task<HybridConnectionStream> CreateConnectionAsync(IDictionary<string, string> requestHeaders)
{
TrackingContext trackingContext = CreateTrackingContext(this.Address);
string traceSource = nameof(HybridConnectionClient) + "(" + trackingContext + ")";
// todo - Check if timeout helper needs to be started here.
var timeoutHelper = TimeoutHelper.CreateOnly(this.OperationTimeout);
RelayEventSource.Log.ObjectConnecting(traceSource, trackingContext);
var webSocket = this.ClientWebSocketFactory.Create();
try
{
DefaultWebProxy.ConfigureProxy(webSocket.Options, this.Proxy);
webSocket.Options.KeepAliveInterval = this.KeepAliveInterval;
webSocket.Options.SetBuffer(this.ConnectionBufferSize, this.ConnectionBufferSize);
webSocket.Options.SetRequestHeader(HybridConnectionConstants.Headers.RelayUserAgent, HybridConnectionConstants.ClientAgent);
if (this.TokenProvider != null)
{
RelayEventSource.Log.GetTokenStart(traceSource);
string audience = this.Address.GetComponents(UriComponents.SchemeAndServer | UriComponents.Path, UriFormat.UriEscaped);
var token = await this.TokenProvider.GetTokenAsync(audience, TokenProvider.DefaultTokenTimeout).ConfigureAwait(false);
RelayEventSource.Log.GetTokenStop(traceSource, token.ExpiresAtUtc);
webSocket.Options.SetRequestHeader(RelayConstants.ServiceBusAuthorizationHeaderName, token.TokenString);
}
if (requestHeaders != null)
{
foreach (KeyValuePair<string, string> header in requestHeaders)
{
webSocket.Options.SetRequestHeader(header.Key, header.Value);
}
}
// Build the websocket uri, e.g. "wss://contoso.servicebus.windows.net:443/$hc/endpoint1?sb-hc-action=connect&sb-hc-id=E2E_TRACKING_ID"
Uri webSocketUri = HybridConnectionUtility.BuildUri(
this.Address.Host,
this.Address.Port,
this.Address.AbsolutePath,
this.Address.Query,
HybridConnectionConstants.Actions.Connect,
trackingContext.TrackingId);
using (var cancelSource = new CancellationTokenSource(timeoutHelper.RemainingTime()))
{
await webSocket.ConnectAsync(webSocketUri, cancelSource.Token).ConfigureAwait(false);
}
RelayEventSource.Log.ObjectConnected(traceSource, trackingContext);
return new WebSocketStream(webSocket.WebSocket, trackingContext);
}
catch (Exception exception) when (!WebSocketExceptionHelper.IsRelayContract(exception))
{
throw RelayEventSource.Log.ThrowingException(
WebSocketExceptionHelper.ConvertToRelayContract(exception, trackingContext, webSocket.Response, isListener: false),
traceSource);
}
}