protected virtual IHttpRequestFeature CreateTunnelHttpRequestFeature(HttpContext webSocketConnectionHttpContext, IWebSocketHttpRequest request) { var requestFeature = new DefaultWebSocketTunnelHttpRequestFeature { Scheme = webSocketConnectionHttpContext.Request.IsHttps ? "https" : "http", Method = request.Method, Path = request.Path, PathBase = webSocketConnectionHttpContext.Request.PathBase, Protocol = "HTTP 1.1", RawTarget = "Not supported in web socket tunnel", QueryString = request.QueryString, Body = new MemoryStream(request.Content ?? new byte[0]), Headers = new HeaderDictionary() }; if (request.ContentType != null) { requestFeature.Headers.Add("Content-Type", new StringValues(request.ContentType)); } if (request.Headers != null) { foreach (var kvp in request.Headers) { requestFeature.Headers.Add(kvp.Key, new StringValues(kvp.Value)); } } return(requestFeature); }
protected virtual WebSocketTunnelHttpContext CreateTunnelledHttpRequest(HttpContext webSocketConnectionHttpContext, IWebSocketHttpRequest request, IServiceProvider serviceProvider) { var context = new WebSocketTunnelHttpContext(this); context.Features.Set <IHttpRequestFeature>(CreateTunnelHttpRequestFeature(webSocketConnectionHttpContext, request)); context.Features.Set <IHttpRequestLifetimeFeature>( new HttpRequestLifetimeFeature { RequestAborted = webSocketConnectionHttpContext.RequestAborted }); context.Features.Set <IHttpContextAccessor>(new HttpContextAccessor { HttpContext = context }); context.Features.Set <IHttpConnectionFeature>(webSocketConnectionHttpContext.Features .Get <IHttpConnectionFeature>()); context.User = webSocketConnectionHttpContext.User; context.TraceIdentifier = request.CommandId; context.RequestServices = serviceProvider; return(context); }
protected virtual Task <bool> OnErrorAsync(IWebSocketHttpRequest request, Exception ex) { return(Task.FromResult(false)); }