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