Example #1
0
        /// <summary>
        ///     Prepare and send the http(s) request
        /// </summary>
        /// <returns></returns>
        internal async Task SendRequest(bool enable100ContinueBehaviour, bool isTransparent, CancellationToken cancellationToken)
        {
            var upstreamProxy = Connection.UpStreamProxy;

            bool useUpstreamProxy = upstreamProxy != null && upstreamProxy.ProxyType == ExternalProxyType.Http &&
                                    !Connection.IsHttps;

            var serverStream = Connection.Stream;

            string?upstreamProxyUserName = null;
            string?upstreamProxyPassword = null;

            string url;

            if (isTransparent)
            {
                url = Request.RequestUriString;
            }
            else if (!useUpstreamProxy)
            {
                if (UriExtensions.GetScheme(Request.RequestUriString8).Length == 0)
                {
                    url = Request.RequestUriString;
                }
                else
                {
                    url = Request.RequestUri.GetOriginalPathAndQuery();
                }
            }
            else
            {
                url = Request.RequestUri.ToString();

                // Send Authentication to Upstream proxy if needed
                if (!string.IsNullOrEmpty(upstreamProxy !.UserName) && upstreamProxy.Password != null)
                {
                    upstreamProxyUserName = upstreamProxy.UserName;
                    upstreamProxyPassword = upstreamProxy.Password;
                }
            }

            if (url == string.Empty)
            {
                url = "/";
            }

            // prepare the request & headers
            var headerBuilder = new HeaderBuilder();

            headerBuilder.WriteRequestLine(Request.Method, url, Request.HttpVersion);
            headerBuilder.WriteHeaders(Request.Headers, !isTransparent, upstreamProxyUserName, upstreamProxyPassword);

            // write request headers
            await serverStream.WriteHeadersAsync(headerBuilder, cancellationToken);

            if (enable100ContinueBehaviour && Request.ExpectContinue)
            {
                // wait for expectation response from server
                await ReceiveResponse(cancellationToken);

                if (Response.StatusCode == (int)HttpStatusCode.Continue)
                {
                    Request.ExpectationSucceeded = true;
                }
                else
                {
                    Request.ExpectationFailed = true;
                }
            }
        }