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();
            }
        }