in src/Microsoft.Azure.Relay/HybridConnectionListener.cs [729:774]
async Task<WebSocket> ConnectAsync(CancellationToken cancellationToken)
{
this.listener.ThrowIfDisposed();
var webSocket = this.listener.ClientWebSocketFactory.Create();
try
{
var connectDelay = ConnectDelayIntervals[this.connectDelayIndex];
if (connectDelay != TimeSpan.Zero)
{
await Task.Delay(connectDelay, cancellationToken).ConfigureAwait(false);
}
RelayEventSource.Log.ObjectConnecting(this.listener);
webSocket.Options.SetBuffer(this.bufferSize, this.bufferSize);
DefaultWebProxy.ConfigureProxy(webSocket.Options, this.listener.Proxy);
webSocket.Options.KeepAliveInterval = this.listener.KeepAliveInterval;
webSocket.Options.SetRequestHeader(HybridConnectionConstants.Headers.RelayUserAgent, HybridConnectionConstants.ClientAgent);
var token = await this.tokenRenewer.GetTokenAsync().ConfigureAwait(false);
webSocket.Options.SetRequestHeader(RelayConstants.ServiceBusAuthorizationHeaderName, token.TokenString);
// When we reconnect we need to remove the "_GXX" suffix otherwise trackingId gets longer after each reconnect
string trackingId = TrackingContext.RemoveSuffix(this.listener.TrackingContext.TrackingId);
// Build the websocket uri, e.g. "wss://contoso.servicebus.windows.net:443/$hc/endpoint1?sb-hc-action=listen&sb-hc-id=E2E_TRACKING_ID"
var webSocketUri = HybridConnectionUtility.BuildUri(
this.address.Host,
this.address.Port,
this.address.AbsolutePath,
this.address.Query,
HybridConnectionConstants.Actions.Listen,
trackingId);
await webSocket.ConnectAsync(webSocketUri, cancellationToken).ConfigureAwait(false);
this.OnOnline();
RelayEventSource.Log.ObjectConnected(this.listener);
return webSocket.WebSocket;
}
catch (Exception exception) when (!WebSocketExceptionHelper.IsRelayContract(exception))
{
throw RelayEventSource.Log.ThrowingException(
WebSocketExceptionHelper.ConvertToRelayContract(exception, this.listener.TrackingContext, webSocket.Response), this.listener);
}
}