diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index 2bcee9c7673ad..6743984a8eb22 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -221,19 +221,39 @@ protected virtual void OnSendingRemoteHttpRequest(SendingRemoteHttpRequestEventA this.SendingRemoteHttpRequest?.Invoke(this, eventArgs); } - private HttpClient CreateHttpClient() + /// + /// Creates an instance of as underlying handler, + /// used by . Invoked only once when required. + /// + /// An instance of . + protected virtual HttpClientHandler CreateHttpClientHandler() { - HttpClientHandler httpClientHandler = new HttpClientHandler(); + HttpClientHandler httpClientHandler = new(); + string userInfo = this.remoteServerUri.UserInfo; - if (!string.IsNullOrEmpty(userInfo) && userInfo.Contains(":")) + + if (!string.IsNullOrEmpty(userInfo) && userInfo.Contains(':')) { - string[] userInfoComponents = this.remoteServerUri.UserInfo.Split(new char[] { ':' }, 2); + string[] userInfoComponents = this.remoteServerUri.UserInfo.Split([':'], 2); httpClientHandler.Credentials = new NetworkCredential(userInfoComponents[0], userInfoComponents[1]); httpClientHandler.PreAuthenticate = true; } httpClientHandler.Proxy = this.Proxy; + return httpClientHandler; + } + + /// + /// Creates an instance of used by making all HTTP calls to remote end. + /// Invoked only once when required. + /// + /// An instance of . + protected virtual HttpClient CreateHttpClient() + { + var httpClientHandler = CreateHttpClientHandler() + ?? throw new InvalidOperationException($"{nameof(CreateHttpClientHandler)} method returned null"); + HttpMessageHandler handler = httpClientHandler; if (_logger.IsEnabled(LogEventLevel.Trace)) @@ -242,15 +262,18 @@ private HttpClient CreateHttpClient() } var client = new HttpClient(handler); + client.DefaultRequestHeaders.UserAgent.ParseAdd(this.UserAgent); client.DefaultRequestHeaders.Accept.ParseAdd(RequestAcceptHeader); client.DefaultRequestHeaders.ExpectContinue = false; + if (!this.IsKeepAliveEnabled) { client.DefaultRequestHeaders.Connection.ParseAdd("close"); } client.Timeout = this.serverResponseTimeout; + return client; }