From a6c82f6496a712131caae8d5935985084619d1aa Mon Sep 17 00:00:00 2001 From: Ansel Fernandez <36796016+ChrstnAnsl@users.noreply.github.com> Date: Mon, 20 May 2024 16:17:12 +0800 Subject: [PATCH 01/23] [dotnet] Add Execution Context --- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index 3dbb5e4efd179..eb42872c2843d 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -286,6 +286,11 @@ private async Task MakeHttpRequest(HttpRequestInfo requestInfo if (_logger.IsEnabled(LogEventLevel.Trace)) { _logger.Trace($">> {requestMessage}"); + if (requestMessage.Content != null) + { + string content = await requestMessage.Content.ReadAsStringAsync(); + _logger.Trace($">> Body: {content}"); + } } using (HttpResponseMessage responseMessage = await this.client.SendAsync(requestMessage).ConfigureAwait(false)) @@ -293,6 +298,8 @@ private async Task MakeHttpRequest(HttpRequestInfo requestInfo if (_logger.IsEnabled(LogEventLevel.Trace)) { _logger.Trace($"<< {responseMessage}"); + string responseBody = await responseMessage.Content.ReadAsStringAsync(); + _logger.Trace($"<< Body: {responseBody}"); } HttpResponseInfo httpResponseInfo = new HttpResponseInfo(); @@ -305,6 +312,7 @@ private async Task MakeHttpRequest(HttpRequestInfo requestInfo } } + private Response CreateResponse(HttpResponseInfo responseInfo) { Response response = new Response(); From abdd77c64ad8025f8a7af06ce6abf3ecddf4c248 Mon Sep 17 00:00:00 2001 From: Ansel Fernandez <36796016+ChrstnAnsl@users.noreply.github.com> Date: Tue, 21 May 2024 18:29:25 +0800 Subject: [PATCH 02/23] Added http status code validation --- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index eb42872c2843d..abb5b28eaa7eb 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -286,6 +286,7 @@ private async Task MakeHttpRequest(HttpRequestInfo requestInfo if (_logger.IsEnabled(LogEventLevel.Trace)) { _logger.Trace($">> {requestMessage}"); + if (requestMessage.Content != null) { string content = await requestMessage.Content.ReadAsStringAsync(); @@ -298,8 +299,12 @@ private async Task MakeHttpRequest(HttpRequestInfo requestInfo if (_logger.IsEnabled(LogEventLevel.Trace)) { _logger.Trace($"<< {responseMessage}"); - string responseBody = await responseMessage.Content.ReadAsStringAsync(); - _logger.Trace($"<< Body: {responseBody}"); + + if (responseMessage.StatusCode != HttpStatusCode.OK || responseMessage.StatusCode != HttpStatusCode.Created) + { + string responseBody = await responseMessage.Content.ReadAsStringAsync(); + _logger.Trace($"<< Response Body: {responseBody}"); + } } HttpResponseInfo httpResponseInfo = new HttpResponseInfo(); From 535558afb89461915bbb3de59372864b754f5880 Mon Sep 17 00:00:00 2001 From: Ansel Fernandez <36796016+ChrstnAnsl@users.noreply.github.com> Date: Tue, 21 May 2024 18:44:59 +0800 Subject: [PATCH 03/23] update validation http status code validation as int --- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index abb5b28eaa7eb..aba20f811db94 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -300,7 +300,7 @@ private async Task MakeHttpRequest(HttpRequestInfo requestInfo { _logger.Trace($"<< {responseMessage}"); - if (responseMessage.StatusCode != HttpStatusCode.OK || responseMessage.StatusCode != HttpStatusCode.Created) + if ((int)responseMessage.StatusCode < 200 || (int)responseMessage.StatusCode > 299) { string responseBody = await responseMessage.Content.ReadAsStringAsync(); _logger.Trace($"<< Response Body: {responseBody}"); From ef1aeb2c3e2a8db84deb3ca22c3c5f6743eb973c Mon Sep 17 00:00:00 2001 From: Ansel Fernandez <36796016+ChrstnAnsl@users.noreply.github.com> Date: Wed, 22 May 2024 21:25:43 +0800 Subject: [PATCH 04/23] Update http validation status code from 299 to 399 --- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index aba20f811db94..b0b58712ede47 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -300,7 +300,7 @@ private async Task MakeHttpRequest(HttpRequestInfo requestInfo { _logger.Trace($"<< {responseMessage}"); - if ((int)responseMessage.StatusCode < 200 || (int)responseMessage.StatusCode > 299) + if ((int)responseMessage.StatusCode < 200 || (int)responseMessage.StatusCode > 399) { string responseBody = await responseMessage.Content.ReadAsStringAsync(); _logger.Trace($"<< Response Body: {responseBody}"); From 6b5b0d3c124b0417b4b563ebb9070493f97bf825 Mon Sep 17 00:00:00 2001 From: Ansel Fernandez <36796016+ChrstnAnsl@users.noreply.github.com> Date: Thu, 23 May 2024 11:19:57 +0800 Subject: [PATCH 05/23] Logs Response to HttpClientHandler --- .../webdriver/Remote/HttpCommandExecutor.cs | 13 +--- .../Remote/ResponseLoggerInterceptor.cs | 62 +++++++++++++++++++ 2 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index b0b58712ede47..52bf30752b34f 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -247,6 +247,8 @@ private void CreateHttpClient() } this.client.Timeout = this.serverResponseTimeout; + + this.client.Interceptors.Add(new ResponseLoggerInterceptor(_logger)); } private async Task MakeHttpRequest(HttpRequestInfo requestInfo) @@ -296,17 +298,6 @@ private async Task MakeHttpRequest(HttpRequestInfo requestInfo using (HttpResponseMessage responseMessage = await this.client.SendAsync(requestMessage).ConfigureAwait(false)) { - if (_logger.IsEnabled(LogEventLevel.Trace)) - { - _logger.Trace($"<< {responseMessage}"); - - if ((int)responseMessage.StatusCode < 200 || (int)responseMessage.StatusCode > 399) - { - string responseBody = await responseMessage.Content.ReadAsStringAsync(); - _logger.Trace($"<< Response Body: {responseBody}"); - } - } - HttpResponseInfo httpResponseInfo = new HttpResponseInfo(); httpResponseInfo.Body = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false); httpResponseInfo.ContentType = responseMessage.Content.Headers.ContentType?.ToString(); diff --git a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs new file mode 100644 index 0000000000000..ccfb8b2bc610a --- /dev/null +++ b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs @@ -0,0 +1,62 @@ +// +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +using OpenQA.Selenium.Internal.Logging; +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenQA.Selenium.Remote +{ + /// + /// Interceptor for logging HTTP responses. + /// + public class ResponseLoggerInterceptor : IHttpInterceptor + { + private readonly ILogger _logger; + + /// + /// Initializes a new instance of the ResponseLoggerInterceptor with logger. + /// + /// Internal logger to be used for logging responses. + public ResponseLoggerInterceptor(ILogger logger) + { + _logger = logger; + } + + /// + /// Intercepts an HTTP response and logs the response body if the status code is not in the 2xx. + /// + /// The HTTP response message to intercept. + /// A task representing the asynchronous operation. + public async Task InterceptAsync(HttpResponseMessage response) + { + var responseBodyStr = await response.Content.ReadAsStringAsync(); + + if ((int)response.StatusCode < 200 || (int)response.StatusCode > 399) + { + _logger.Debug($"Response Body:{Environment.NewLine}{responseBodyStr}{Environment.NewLine}"); + } + } + } + + public interface IHttpInterceptor + { + Task InterceptAsync(HttpResponseMessage response); + } +} From 2cbc9930d872a51f47890ea5c1a4e1e5a4e53829 Mon Sep 17 00:00:00 2001 From: Ansel Fernandez <36796016+ChrstnAnsl@users.noreply.github.com> Date: Thu, 23 May 2024 11:29:56 +0800 Subject: [PATCH 06/23] update name --- dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs index ccfb8b2bc610a..3e922323d86d8 100644 --- a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs +++ b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs @@ -1,4 +1,4 @@ -// +// // Licensed to the Software Freedom Conservancy (SFC) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information From 2c413505a7d9bcf448bddc12c1f0a2be6993cfbf Mon Sep 17 00:00:00 2001 From: Ansel Fernandez <36796016+ChrstnAnsl@users.noreply.github.com> Date: Thu, 23 May 2024 11:33:21 +0800 Subject: [PATCH 07/23] revert http response message logger --- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index 52bf30752b34f..4b1dbfda9ae6a 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -298,6 +298,11 @@ private async Task MakeHttpRequest(HttpRequestInfo requestInfo using (HttpResponseMessage responseMessage = await this.client.SendAsync(requestMessage).ConfigureAwait(false)) { + if (_logger.IsEnabled(LogEventLevel.Trace)) + { + _logger.Trace($"<< {responseMessage}"); + } + HttpResponseInfo httpResponseInfo = new HttpResponseInfo(); httpResponseInfo.Body = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false); httpResponseInfo.ContentType = responseMessage.Content.Headers.ContentType?.ToString(); From cd57a4e9b9d840f0666ea4ce80c186a9fa07cbdc Mon Sep 17 00:00:00 2001 From: Ansel Fernandez <36796016+ChrstnAnsl@users.noreply.github.com> Date: Thu, 23 May 2024 11:33:56 +0800 Subject: [PATCH 08/23] Remove White Space --- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index 4b1dbfda9ae6a..75787bb42ccc4 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -313,7 +313,6 @@ private async Task MakeHttpRequest(HttpRequestInfo requestInfo } } - private Response CreateResponse(HttpResponseInfo responseInfo) { Response response = new Response(); From 62dc7a83b0e8b27197694edd9a3dcf438e4af5ff Mon Sep 17 00:00:00 2001 From: Ansel Fernandez <36796016+ChrstnAnsl@users.noreply.github.com> Date: Thu, 23 May 2024 20:28:53 +0800 Subject: [PATCH 09/23] fix build error --- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 3 ++- dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index 75787bb42ccc4..0397f46891477 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -248,7 +248,8 @@ private void CreateHttpClient() this.client.Timeout = this.serverResponseTimeout; - this.client.Interceptors.Add(new ResponseLoggerInterceptor(_logger)); + var responseLogger = new ResponseLoggerInterceptor(_logger); + this.client.Interceptors.Add(responseLogger); } private async Task MakeHttpRequest(HttpRequestInfo requestInfo) diff --git a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs index 3e922323d86d8..90cf7f0aedff9 100644 --- a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs +++ b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs @@ -16,10 +16,10 @@ // limitations under the License. // +using System.Net.Http; +using System.Threading.Tasks; using OpenQA.Selenium.Internal.Logging; using System; -using System.Collections.Generic; -using System.Text; namespace OpenQA.Selenium.Remote { From ace83aa2559c5c4f824471f06fb9020ebfa6b216 Mon Sep 17 00:00:00 2001 From: Christian Ansel <36796016+ChrstnAnsl@users.noreply.github.com> Date: Fri, 31 May 2024 07:34:46 +0800 Subject: [PATCH 10/23] Update InterceptAsync Summary --- dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs index 90cf7f0aedff9..bb0474547aad2 100644 --- a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs +++ b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs @@ -40,7 +40,7 @@ public ResponseLoggerInterceptor(ILogger logger) } /// - /// Intercepts an HTTP response and logs the response body if the status code is not in the 2xx. + /// Intercepts an HTTP response and logs the response body if the status code is not between 2xx = 3xx. /// /// The HTTP response message to intercept. /// A task representing the asynchronous operation. From be96a83f6fd953ed991ec6bfc0ecf4fd65a957e8 Mon Sep 17 00:00:00 2001 From: Christian Ansel <36796016+ChrstnAnsl@users.noreply.github.com> Date: Fri, 31 May 2024 07:45:28 +0800 Subject: [PATCH 11/23] Update Logger field initialization --- dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs index bb0474547aad2..25581173454b9 100644 --- a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs +++ b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs @@ -28,15 +28,14 @@ namespace OpenQA.Selenium.Remote /// public class ResponseLoggerInterceptor : IHttpInterceptor { - private readonly ILogger _logger; + private static readonly ILogger _logger = Log.GetLogger(); /// /// Initializes a new instance of the ResponseLoggerInterceptor with logger. /// /// Internal logger to be used for logging responses. - public ResponseLoggerInterceptor(ILogger logger) + public ResponseLoggerInterceptor() { - _logger = logger; } /// From 1b1421f22a240f3a7d56b33d5596cfa3b003af83 Mon Sep 17 00:00:00 2001 From: Christian Ansel <36796016+ChrstnAnsl@users.noreply.github.com> Date: Fri, 31 May 2024 07:46:05 +0800 Subject: [PATCH 12/23] Remove logger parameter in ResponseLoggerInterceptor method --- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index 0397f46891477..188444e704f80 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -248,7 +248,7 @@ private void CreateHttpClient() this.client.Timeout = this.serverResponseTimeout; - var responseLogger = new ResponseLoggerInterceptor(_logger); + var responseLogger = new ResponseLoggerInterceptor(); this.client.Interceptors.Add(responseLogger); } From 62c70b8db9429a287c4269ec8ae924055626be29 Mon Sep 17 00:00:00 2001 From: Christian Ansel <36796016+ChrstnAnsl@users.noreply.github.com> Date: Fri, 31 May 2024 21:06:52 +0800 Subject: [PATCH 13/23] fix comment to add responseBody inside the if statement --- dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs index 25581173454b9..444ab262e86d6 100644 --- a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs +++ b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs @@ -45,10 +45,9 @@ public ResponseLoggerInterceptor() /// A task representing the asynchronous operation. public async Task InterceptAsync(HttpResponseMessage response) { - var responseBodyStr = await response.Content.ReadAsStringAsync(); - if ((int)response.StatusCode < 200 || (int)response.StatusCode > 399) { + var responseBodyStr = await response.Content.ReadAsStringAsync(); _logger.Debug($"Response Body:{Environment.NewLine}{responseBodyStr}{Environment.NewLine}"); } } From a64a1fe760879b3cf10ef6f1318d4381f7238122 Mon Sep 17 00:00:00 2001 From: Ansel Fernandez <36796016+ChrstnAnsl@users.noreply.github.com> Date: Sat, 1 Jun 2024 08:45:04 +0800 Subject: [PATCH 14/23] Update Delegating Handler and Remove unable to push files in local --- .../webdriver/Remote/HttpCommandExecutor.cs | 7 ++-- .../Remote/ResponseLoggerInterceptor.cs | 36 +++++++++---------- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index 188444e704f80..f98f394b1e17c 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -237,7 +237,9 @@ private void CreateHttpClient() httpClientHandler.Proxy = this.Proxy; - this.client = new HttpClient(httpClientHandler); + // Use the custom LoggingHandler + var loggingHandler = new ResponseLoggerInterceptor(httpClientHandler); + this.client = new HttpClient(loggingHandler); this.client.DefaultRequestHeaders.UserAgent.ParseAdd(this.UserAgent); this.client.DefaultRequestHeaders.Accept.ParseAdd(RequestAcceptHeader); this.client.DefaultRequestHeaders.ExpectContinue = false; @@ -247,9 +249,6 @@ private void CreateHttpClient() } this.client.Timeout = this.serverResponseTimeout; - - var responseLogger = new ResponseLoggerInterceptor(); - this.client.Interceptors.Add(responseLogger); } private async Task MakeHttpRequest(HttpRequestInfo requestInfo) diff --git a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs index 444ab262e86d6..baa0d75fd030d 100644 --- a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs +++ b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs @@ -26,35 +26,33 @@ namespace OpenQA.Selenium.Remote /// /// Interceptor for logging HTTP responses. /// - public class ResponseLoggerInterceptor : IHttpInterceptor + public class ResponseLoggerInterceptor : DelegatingHandler { private static readonly ILogger _logger = Log.GetLogger(); - /// - /// Initializes a new instance of the ResponseLoggerInterceptor with logger. - /// - /// Internal logger to be used for logging responses. - public ResponseLoggerInterceptor() + public ResponseLoggerInterceptor(HttpMessageHandler innerHandler) + : base(innerHandler) { } - /// - /// Intercepts an HTTP response and logs the response body if the status code is not between 2xx = 3xx. - /// - /// The HTTP response message to intercept. - /// A task representing the asynchronous operation. - public async Task InterceptAsync(HttpResponseMessage response) + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { - if ((int)response.StatusCode < 200 || (int)response.StatusCode > 399) + if (request.Content != null) { - var responseBodyStr = await response.Content.ReadAsStringAsync(); - _logger.Debug($"Response Body:{Environment.NewLine}{responseBodyStr}{Environment.NewLine}"); + string requestContent = await request.Content.ReadAsStringAsync(); + _logger.Trace($">> Body: {requestContent}"); } + + HttpResponseMessage response = await base.SendAsync(request, cancellationToken); + + if (response.Content != null) + { + string responseContent = await response.Content.ReadAsStringAsync(); + _logger.Trace($"<< Body: {responseContent}"); + } + + return response; } } - public interface IHttpInterceptor - { - Task InterceptAsync(HttpResponseMessage response); - } } From 3b6a3ca2e9666a03d2e0aad2a11a2a1e814895e3 Mon Sep 17 00:00:00 2001 From: Ansel Fernandez <36796016+ChrstnAnsl@users.noreply.github.com> Date: Sat, 1 Jun 2024 08:54:13 +0800 Subject: [PATCH 15/23] Update from null validation to status code --- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 6 ------ dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index f98f394b1e17c..50955bb9e3cc3 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -288,12 +288,6 @@ private async Task MakeHttpRequest(HttpRequestInfo requestInfo if (_logger.IsEnabled(LogEventLevel.Trace)) { _logger.Trace($">> {requestMessage}"); - - if (requestMessage.Content != null) - { - string content = await requestMessage.Content.ReadAsStringAsync(); - _logger.Trace($">> Body: {content}"); - } } using (HttpResponseMessage responseMessage = await this.client.SendAsync(requestMessage).ConfigureAwait(false)) diff --git a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs index baa0d75fd030d..6231e042b80ec 100644 --- a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs +++ b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs @@ -45,7 +45,7 @@ protected override async Task SendAsync(HttpRequestMessage HttpResponseMessage response = await base.SendAsync(request, cancellationToken); - if (response.Content != null) + if ((int)response.StatusCode < 200 || (int)response.StatusCode > 399) { string responseContent = await response.Content.ReadAsStringAsync(); _logger.Trace($"<< Body: {responseContent}"); From 4d42101948531887c9fee6e039b427f2329e2bf0 Mon Sep 17 00:00:00 2001 From: Ansel Fernandez <36796016+ChrstnAnsl@users.noreply.github.com> Date: Sat, 22 Jun 2024 07:09:25 +0800 Subject: [PATCH 16/23] Fix comment --- .../webdriver/Remote/HttpCommandExecutor.cs | 50 +++++++++++++++- .../Remote/ResponseLoggerInterceptor.cs | 58 ------------------- 2 files changed, 47 insertions(+), 61 deletions(-) delete mode 100644 dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index 50955bb9e3cc3..b60fe8d23b3ee 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -26,6 +26,7 @@ using System.Net.Http; using System.Net.Http.Headers; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace OpenQA.Selenium.Remote @@ -237,9 +238,14 @@ private void CreateHttpClient() httpClientHandler.Proxy = this.Proxy; - // Use the custom LoggingHandler - var loggingHandler = new ResponseLoggerInterceptor(httpClientHandler); - this.client = new HttpClient(loggingHandler); + HttpMessageHandler handler = httpClientHandler; + + if (_logger.IsEnabled(LogEventLevel.Trace)) + { + handler = new DiagnosticsHttpHandler(httpClientHandler); + } + + this.client = new HttpClient(handler); this.client.DefaultRequestHeaders.UserAgent.ParseAdd(this.UserAgent); this.client.DefaultRequestHeaders.Accept.ParseAdd(RequestAcceptHeader); this.client.DefaultRequestHeaders.ExpectContinue = false; @@ -387,5 +393,43 @@ private class HttpResponseInfo public string Body { get; set; } public string ContentType { get; set; } } + + /// + /// Internal Diagnostic Handler for HttpCommandExecutor Additional Context + /// + internal class DiagnosticsHttpHandler : DelegatingHandler + { + private static readonly ILogger _logger = Log.GetLogger(); + + public DiagnosticsHttpHandler(HttpMessageHandler messageHandler) + : base(messageHandler) + { + } + + /// + /// Sends the specified request and returns the associated response. + /// + /// The request to be sent. + /// A CancellationToken object to allow for cancellation of the request. + /// The http response message content. + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + if (request.Content != null) + { + var requestContent = await request.Content.ReadAsStringAsync().ConfigureAwait(false); + _logger.Trace($">> Body: {requestContent}"); + } + + var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + _logger.Trace($"<< Body: {responseContent}"); + } + + return response; + } + } } } diff --git a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs b/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs deleted file mode 100644 index 6231e042b80ec..0000000000000 --- a/dotnet/src/webdriver/Remote/ResponseLoggerInterceptor.cs +++ /dev/null @@ -1,58 +0,0 @@ -// -// Licensed to the Software Freedom Conservancy (SFC) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The SFC licenses this file -// to you under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -using System.Net.Http; -using System.Threading.Tasks; -using OpenQA.Selenium.Internal.Logging; -using System; - -namespace OpenQA.Selenium.Remote -{ - /// - /// Interceptor for logging HTTP responses. - /// - public class ResponseLoggerInterceptor : DelegatingHandler - { - private static readonly ILogger _logger = Log.GetLogger(); - - public ResponseLoggerInterceptor(HttpMessageHandler innerHandler) - : base(innerHandler) - { - } - - protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - if (request.Content != null) - { - string requestContent = await request.Content.ReadAsStringAsync(); - _logger.Trace($">> Body: {requestContent}"); - } - - HttpResponseMessage response = await base.SendAsync(request, cancellationToken); - - if ((int)response.StatusCode < 200 || (int)response.StatusCode > 399) - { - string responseContent = await response.Content.ReadAsStringAsync(); - _logger.Trace($"<< Body: {responseContent}"); - } - - return response; - } - } - -} From 4240536639ea0d242a3cd0df3bcf68db201a68e1 Mon Sep 17 00:00:00 2001 From: Ansel Fernandez <36796016+ChrstnAnsl@users.noreply.github.com> Date: Sun, 23 Jun 2024 17:22:14 +0800 Subject: [PATCH 17/23] fix minor comments and adjust logic improvement --- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index b60fe8d23b3ee..ce4d809173347 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -414,22 +414,19 @@ public DiagnosticsHttpHandler(HttpMessageHandler messageHandler) /// The http response message content. protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { - if (request.Content != null) - { - var requestContent = await request.Content.ReadAsStringAsync().ConfigureAwait(false); - _logger.Trace($">> Body: {requestContent}"); - } - var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); - if (!response.IsSuccessStatusCode) + if (!response.IsSuccessStatusCode && response.Content != null && request.Content != null) { + var requestContent = await request.Content.ReadAsStringAsync().ConfigureAwait(false); var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); - _logger.Trace($"<< Body: {responseContent}"); + + _logger.Trace($">> Request Body: {requestContent}\n\n<< Response Body: {responseContent}"); } return response; } + } } } From 5c0822de565fc5974285a8ed14f6983584d3dac2 Mon Sep 17 00:00:00 2001 From: Nikolay Borisenko <22616990+nvborisenko@users.noreply.github.com> Date: Sun, 23 Jun 2024 12:36:03 +0300 Subject: [PATCH 18/23] Revert "fix minor comments and adjust logic improvement" This reverts commit 4240536639ea0d242a3cd0df3bcf68db201a68e1. --- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index ce4d809173347..b60fe8d23b3ee 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -414,19 +414,22 @@ public DiagnosticsHttpHandler(HttpMessageHandler messageHandler) /// The http response message content. protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { + if (request.Content != null) + { + var requestContent = await request.Content.ReadAsStringAsync().ConfigureAwait(false); + _logger.Trace($">> Body: {requestContent}"); + } + var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); - if (!response.IsSuccessStatusCode && response.Content != null && request.Content != null) + if (!response.IsSuccessStatusCode) { - var requestContent = await request.Content.ReadAsStringAsync().ConfigureAwait(false); var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); - - _logger.Trace($">> Request Body: {requestContent}\n\n<< Response Body: {responseContent}"); + _logger.Trace($"<< Body: {responseContent}"); } return response; } - } } } From 30bd8f04a813045d5a97d1bb45e2e854d2767f9f Mon Sep 17 00:00:00 2001 From: Nikolay Borisenko <22616990+nvborisenko@users.noreply.github.com> Date: Sun, 23 Jun 2024 12:38:18 +0300 Subject: [PATCH 19/23] Null check for response content --- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index b60fe8d23b3ee..a3700cd2e4420 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -397,7 +397,7 @@ private class HttpResponseInfo /// /// Internal Diagnostic Handler for HttpCommandExecutor Additional Context /// - internal class DiagnosticsHttpHandler : DelegatingHandler + private class DiagnosticsHttpHandler : DelegatingHandler { private static readonly ILogger _logger = Log.GetLogger(); @@ -422,7 +422,7 @@ protected override async Task SendAsync(HttpRequestMessage var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); - if (!response.IsSuccessStatusCode) + if (!response.IsSuccessStatusCode && response.Content != null) { var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); _logger.Trace($"<< Body: {responseContent}"); From 46db0071ef9debf9afdb01b27edb03abd8004e4e Mon Sep 17 00:00:00 2001 From: Nikolay Borisenko <22616990+nvborisenko@users.noreply.github.com> Date: Sun, 23 Jun 2024 13:02:45 +0300 Subject: [PATCH 20/23] Requests/Responses as single log message --- .../webdriver/Remote/HttpCommandExecutor.cs | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index ebe12c5225383..0f62b6e2d56f5 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -301,18 +301,8 @@ private async Task MakeHttpRequest(HttpRequestInfo requestInfo requestMessage.Content.Headers.ContentType = contentTypeHeader; } - if (_logger.IsEnabled(LogEventLevel.Trace)) - { - _logger.Trace($">> {requestMessage}"); - } - using (HttpResponseMessage responseMessage = await this.client.SendAsync(requestMessage).ConfigureAwait(false)) { - if (_logger.IsEnabled(LogEventLevel.Trace)) - { - _logger.Trace($"<< {responseMessage}"); - } - HttpResponseInfo httpResponseInfo = new HttpResponseInfo(); httpResponseInfo.Body = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false); httpResponseInfo.ContentType = responseMessage.Content.Headers.ContentType?.ToString(); @@ -405,7 +395,7 @@ private class HttpResponseInfo } /// - /// Internal Diagnostic Handler for HttpCommandExecutor Additional Context + /// Internal diagnostic handler to log http requests/responses. /// private class DiagnosticsHttpHandler : DelegatingHandler { @@ -424,18 +414,31 @@ public DiagnosticsHttpHandler(HttpMessageHandler messageHandler) /// The http response message content. protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { + StringBuilder requestLogMessageBuilder = new(); + requestLogMessageBuilder.AppendFormat(">> {0}", request); + if (request.Content != null) { var requestContent = await request.Content.ReadAsStringAsync().ConfigureAwait(false); - _logger.Trace($">> Body: {requestContent}"); + requestLogMessageBuilder.AppendFormat("{0}{1}", Environment.NewLine, requestContent); } + _logger.Trace(requestLogMessageBuilder.ToString()); + var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); - if (!response.IsSuccessStatusCode && response.Content != null) + if (!response.IsSuccessStatusCode) { - var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); - _logger.Trace($"<< Body: {responseContent}"); + StringBuilder responseLogMessageBuilder = new(); + responseLogMessageBuilder.AppendFormat("<< {0}", response); + + if (response.Content != null) + { + var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + responseLogMessageBuilder.AppendFormat("{0}{1}", Environment.NewLine, responseContent); + } + + _logger.Trace(responseLogMessageBuilder.ToString()); } return response; From 177291d354ad349441a1a656bf87b63d796ad90e Mon Sep 17 00:00:00 2001 From: Nikolay Borisenko <22616990+nvborisenko@users.noreply.github.com> Date: Sun, 23 Jun 2024 13:07:39 +0300 Subject: [PATCH 21/23] Pass logger from upstream --- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index 0f62b6e2d56f5..04e4fd4fb44aa 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -21,7 +21,6 @@ using System; using System.Collections.Generic; using System.Globalization; -using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; @@ -252,7 +251,7 @@ private void CreateHttpClient() if (_logger.IsEnabled(LogEventLevel.Trace)) { - handler = new DiagnosticsHttpHandler(httpClientHandler); + handler = new DiagnosticsHttpHandler(httpClientHandler, _logger); } this.client = new HttpClient(handler); @@ -399,11 +398,12 @@ private class HttpResponseInfo /// private class DiagnosticsHttpHandler : DelegatingHandler { - private static readonly ILogger _logger = Log.GetLogger(); + private readonly ILogger _logger; - public DiagnosticsHttpHandler(HttpMessageHandler messageHandler) + public DiagnosticsHttpHandler(HttpMessageHandler messageHandler, ILogger logger) : base(messageHandler) { + _logger = logger; } /// From 3817377eaf14e98c26551fc966a86ce820e4ea07 Mon Sep 17 00:00:00 2001 From: Nikolay Borisenko <22616990+nvborisenko@users.noreply.github.com> Date: Sun, 23 Jun 2024 13:20:41 +0300 Subject: [PATCH 22/23] Fix missing responses in log --- .../webdriver/Remote/HttpCommandExecutor.cs | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index 04e4fd4fb44aa..3100e7bafd534 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -427,20 +427,17 @@ protected override async Task SendAsync(HttpRequestMessage var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); - if (!response.IsSuccessStatusCode) - { - StringBuilder responseLogMessageBuilder = new(); - responseLogMessageBuilder.AppendFormat("<< {0}", response); - - if (response.Content != null) - { - var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); - responseLogMessageBuilder.AppendFormat("{0}{1}", Environment.NewLine, responseContent); - } + StringBuilder responseLogMessageBuilder = new(); + responseLogMessageBuilder.AppendFormat("<< {0}", response); - _logger.Trace(responseLogMessageBuilder.ToString()); + if (!response.IsSuccessStatusCode && response.Content != null) + { + var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + responseLogMessageBuilder.AppendFormat("{0}{1}", Environment.NewLine, responseContent); } + _logger.Trace(responseLogMessageBuilder.ToString()); + return response; } } From 09de10c93a108ae1e372ee6c5d3663b4cfab1ff0 Mon Sep 17 00:00:00 2001 From: Nikolay Borisenko <22616990+nvborisenko@users.noreply.github.com> Date: Sun, 23 Jun 2024 13:29:21 +0300 Subject: [PATCH 23/23] Put log message in parallel with sending a request --- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index 3100e7bafd534..5256cc7b57606 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -423,9 +423,11 @@ protected override async Task SendAsync(HttpRequestMessage requestLogMessageBuilder.AppendFormat("{0}{1}", Environment.NewLine, requestContent); } + var responseTask = base.SendAsync(request, cancellationToken).ConfigureAwait(false); + _logger.Trace(requestLogMessageBuilder.ToString()); - var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); + var response = await responseTask; StringBuilder responseLogMessageBuilder = new(); responseLogMessageBuilder.AppendFormat("<< {0}", response);