/// <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; } } }