in src/Microsoft.Azure.Relay/RelayedHttpListenerContext.cs [85:128]
internal async Task RejectAsync(Uri rendezvousUri)
{
IClientWebSocket clientWebSocket = null;
try
{
if (this.Response.StatusCode == HttpStatusCode.Continue)
{
this.Response.StatusCode = HttpStatusCode.BadRequest;
this.Response.StatusDescription = "Rejected by user code";
}
// Add the status code/description to the URI query string
int requiredCapacity = rendezvousUri.OriginalString.Length + 50 + this.Response.StatusDescription.Length;
var stringBuilder = new StringBuilder(rendezvousUri.OriginalString, requiredCapacity);
stringBuilder.AppendFormat("&{0}={1}", HybridConnectionConstants.StatusCode, (int)this.Response.StatusCode);
stringBuilder.AppendFormat("&{0}={1}", HybridConnectionConstants.StatusDescription, WebUtility.UrlEncode(this.Response.StatusDescription));
Uri rejectUri = new Uri(stringBuilder.ToString());
clientWebSocket = this.CreateWebSocket();
using (var cancelSource = new CancellationTokenSource(AcceptTimeout))
{
await clientWebSocket.ConnectAsync(rejectUri, cancelSource.Token).ConfigureAwait(false);
}
}
catch (Exception e) when (!Fx.IsFatal(e))
{
WebException webException;
HttpWebResponse httpWebResponse;
if (e is WebSocketException &&
(webException = e.InnerException as WebException) != null &&
(httpWebResponse = webException.Response as HttpWebResponse) != null &&
httpWebResponse.StatusCode == HttpStatusCode.Gone)
{
// status code of "Gone" is expected when rejecting a client request
return;
}
RelayEventSource.Log.HandledExceptionAsWarning(this, e);
}
finally
{
clientWebSocket?.WebSocket?.Abort();
}
}