public async Task Invoke(HttpContext context) { var originalRequest = context.Request; var mapping = _hostMappingOptions.Value; var reqPath = $"{mapping.DownstreamScheme}{new HostString(mapping.DownstreamHost).ToUriComponent()}{context.Request.Path.ToUriComponent()}{context.Request.QueryString.ToUriComponent()}"; var remoteRequest = WebRequest.CreateHttp(reqPath); var transportItems = context.Items[Constants.HTTP_CONTEXT_TRANSPORT_ITEMS] as TransportItems; ProcessTransportItems(transportItems, remoteRequest); _requestBuilder.CopyHeaders(context, remoteRequest, mapping); _requestBuilder.CopyCookies(context, remoteRequest, mapping, transportItems?.Cookies, _webProxyoptions.Value.InternalCookies); if (originalRequest.Body != null && (originalRequest.Method.Equals(HttpMethods.Patch, StringComparison.OrdinalIgnoreCase) || originalRequest.Method.Equals(HttpMethods.Post, StringComparison.OrdinalIgnoreCase) || originalRequest.Method.Equals(HttpMethods.Put, StringComparison.OrdinalIgnoreCase) || originalRequest.Method.Equals(HttpMethods.Options, StringComparison.OrdinalIgnoreCase))) { using (var remoteRequestStream = remoteRequest.GetRequestStream()) { originalRequest.Body.CopyTo(remoteRequestStream); } } HttpWebResponse remoteResponse = null; try { remoteResponse = remoteRequest.GetResponse() as HttpWebResponse; await ProcessRemoteResponse(context, remoteResponse, mapping); } catch (WebException we) { remoteResponse = (HttpWebResponse)we.Response; await ProcessRemoteResponse(context, remoteResponse, mapping); } finally { remoteRequest = null; remoteResponse?.Dispose(); } }