|
26 | 26 | using System.Net.Http;
|
27 | 27 | using System.Net.Http.Headers;
|
28 | 28 | using System.Text;
|
| 29 | +using System.Threading; |
29 | 30 | using System.Threading.Tasks;
|
30 | 31 |
|
31 | 32 | namespace OpenQA.Selenium.Remote
|
@@ -237,9 +238,14 @@ private void CreateHttpClient()
|
237 | 238 |
|
238 | 239 | httpClientHandler.Proxy = this.Proxy;
|
239 | 240 |
|
240 |
| - // Use the custom LoggingHandler |
241 |
| - var loggingHandler = new ResponseLoggerInterceptor(httpClientHandler); |
242 |
| - this.client = new HttpClient(loggingHandler); |
| 241 | + HttpMessageHandler handler = httpClientHandler; |
| 242 | + |
| 243 | + if (_logger.IsEnabled(LogEventLevel.Trace)) |
| 244 | + { |
| 245 | + handler = new DiagnosticsHttpHandler(httpClientHandler); |
| 246 | + } |
| 247 | + |
| 248 | + this.client = new HttpClient(handler); |
243 | 249 | this.client.DefaultRequestHeaders.UserAgent.ParseAdd(this.UserAgent);
|
244 | 250 | this.client.DefaultRequestHeaders.Accept.ParseAdd(RequestAcceptHeader);
|
245 | 251 | this.client.DefaultRequestHeaders.ExpectContinue = false;
|
@@ -387,5 +393,43 @@ private class HttpResponseInfo
|
387 | 393 | public string Body { get; set; }
|
388 | 394 | public string ContentType { get; set; }
|
389 | 395 | }
|
| 396 | + |
| 397 | + /// <summary> |
| 398 | + /// Internal Diagnostic Handler for HttpCommandExecutor Additional Context |
| 399 | + /// </summary> |
| 400 | + internal class DiagnosticsHttpHandler : DelegatingHandler |
| 401 | + { |
| 402 | + private static readonly ILogger _logger = Log.GetLogger<DiagnosticsHttpHandler>(); |
| 403 | + |
| 404 | + public DiagnosticsHttpHandler(HttpMessageHandler messageHandler) |
| 405 | + : base(messageHandler) |
| 406 | + { |
| 407 | + } |
| 408 | + |
| 409 | + /// <summary> |
| 410 | + /// Sends the specified request and returns the associated response. |
| 411 | + /// </summary> |
| 412 | + /// <param name="request">The request to be sent.</param> |
| 413 | + /// <param name="cancellationToken">A CancellationToken object to allow for cancellation of the request.</param> |
| 414 | + /// <returns>The http response message content.</returns> |
| 415 | + protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) |
| 416 | + { |
| 417 | + if (request.Content != null) |
| 418 | + { |
| 419 | + var requestContent = await request.Content.ReadAsStringAsync().ConfigureAwait(false); |
| 420 | + _logger.Trace($">> Body: {requestContent}"); |
| 421 | + } |
| 422 | + |
| 423 | + var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); |
| 424 | + |
| 425 | + if (!response.IsSuccessStatusCode) |
| 426 | + { |
| 427 | + var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); |
| 428 | + _logger.Trace($"<< Body: {responseContent}"); |
| 429 | + } |
| 430 | + |
| 431 | + return response; |
| 432 | + } |
| 433 | + } |
390 | 434 | }
|
391 | 435 | }
|
0 commit comments