From 68462d3a8f949f748ea752d0c7f5b91e2979aa5b Mon Sep 17 00:00:00 2001
From: patrofimov <patrofimov@skbkontur.ru>
Date: Mon, 26 Aug 2024 15:46:35 +0400
Subject: [PATCH] cr fix

---
 .../Misc/LoggingUtils.cs                      | 14 ++--------
 .../Misc/RequestParametersLoggingSettings.cs  |  3 ++
 Vostok.ClusterClient.Core/Model/Request.cs    | 24 ++++++++++++----
 .../Model/RequestUrlParser.cs                 | 27 ++++--------------
 .../Model/RequestUrlParsingHelpers.cs         | 28 +++++++++++++++++++
 Vostok.ClusterClient.Core/Model/Response.cs   |  5 ++--
 .../Modules/LoggingModule.cs                  | 10 +++----
 7 files changed, 65 insertions(+), 46 deletions(-)
 create mode 100644 Vostok.ClusterClient.Core/Model/RequestUrlParsingHelpers.cs

diff --git a/Vostok.ClusterClient.Core/Misc/LoggingUtils.cs b/Vostok.ClusterClient.Core/Misc/LoggingUtils.cs
index e5d1334..c60c4d6 100644
--- a/Vostok.ClusterClient.Core/Misc/LoggingUtils.cs
+++ b/Vostok.ClusterClient.Core/Misc/LoggingUtils.cs
@@ -9,16 +9,8 @@ internal static class LoggingUtils
     {
         public static void AppendQueryString(StringBuilder builder, Uri uri, RequestParametersLoggingSettings querySettings, RequestUrlParser requestUrlParser)
         {
-            if (querySettings.IsEnabledForAllKeys())
-            {
-                builder.Append(uri);
-                return;
-            }
-
-            builder.Append(requestUrlParser.Path);
-
             var writtenFirst = false;
-            foreach (var pair in requestUrlParser.Where(kvp => querySettings.IsEnabledForKey(kvp.Key)))
+            foreach (var pair in requestUrlParser.GetQueryParameters().Where(kvp => querySettings.IsEnabledForKey(kvp.Key)))
             {
                 if (!writtenFirst)
                 {
@@ -36,7 +28,7 @@ public static void AppendQueryString(StringBuilder builder, Uri uri, RequestPara
             }
         }
 
-        public static void AppendHeaders(StringBuilder builder, Headers headers, RequestParametersLoggingSettings headersSettings, bool singleLineManner, bool appendHeader)
+        public static void AppendHeaders(StringBuilder builder, Headers headers, RequestParametersLoggingSettings headersSettings, bool singleLineManner, bool appendTitle)
         {
             var writtenFirst = false;
             var addDelimiter = false;
@@ -45,7 +37,7 @@ public static void AppendHeaders(StringBuilder builder, Headers headers, Request
                 if (!headersSettings.IsEnabledForKey(pair.Name))
                     continue;
 
-                if (!writtenFirst && appendHeader)
+                if (!writtenFirst && appendTitle)
                 {
                     if (singleLineManner)
                     {
diff --git a/Vostok.ClusterClient.Core/Misc/RequestParametersLoggingSettings.cs b/Vostok.ClusterClient.Core/Misc/RequestParametersLoggingSettings.cs
index d8357e2..cb10583 100644
--- a/Vostok.ClusterClient.Core/Misc/RequestParametersLoggingSettings.cs
+++ b/Vostok.ClusterClient.Core/Misc/RequestParametersLoggingSettings.cs
@@ -6,6 +6,9 @@ namespace Vostok.Clusterclient.Core.Misc
     [PublicAPI]
     public class RequestParametersLoggingSettings
     {
+        internal static readonly RequestParametersLoggingSettings DefaultEnabled = new(enabled: true);
+        internal static readonly RequestParametersLoggingSettings DefaultDisabled = new(enabled: false);
+
         public RequestParametersLoggingSettings(bool enabled)
         {
             Enabled = enabled;
diff --git a/Vostok.ClusterClient.Core/Model/Request.cs b/Vostok.ClusterClient.Core/Model/Request.cs
index 025a3bb..aa9beb8 100644
--- a/Vostok.ClusterClient.Core/Model/Request.cs
+++ b/Vostok.ClusterClient.Core/Model/Request.cs
@@ -236,7 +236,9 @@ public override string ToString()
         [PublicAPI]
         public string ToString(bool includeQuery, bool includeHeaders)
         {
-            return ToString(includeQuery, includeHeaders, singleLineManner: false);
+            var querySettings = includeQuery ? RequestParametersLoggingSettings.DefaultEnabled : RequestParametersLoggingSettings.DefaultDisabled;
+            var headersSettings = includeHeaders ? RequestParametersLoggingSettings.DefaultEnabled : RequestParametersLoggingSettings.DefaultDisabled;
+            return ToString(querySettings, headersSettings, singleLineManner: false);
         }
 
         /// <inheritdoc cref="ToString(bool,bool)"/>
@@ -258,20 +260,30 @@ internal string ToString([NotNull] RequestParametersLoggingSettings includeQuery
             builder.Append(Method);
             builder.Append(" ");
 
-            var requestUrlParser = new RequestUrlParser(Url.ToString());
-
             if (includeQuery.Enabled)
             {
-                LoggingUtils.AppendQueryString(builder, Url, includeQuery, requestUrlParser);
+                if (includeQuery.IsEnabledForAllKeys())
+                {
+                    builder.Append(Url);
+                }
+                else
+                {
+                    var requestUrlParser = new RequestUrlParser(Url.ToString());
+
+                    builder.Append(requestUrlParser.Path);
+
+                    LoggingUtils.AppendQueryString(builder, Url, includeQuery, requestUrlParser);
+                }
             }
             else
             {
-                builder.Append(requestUrlParser.Path);
+                RequestUrlParsingHelpers.TryParseUrlPath(Url.ToString(), out var path, out _);
+                builder.Append(path);
             }
 
             if (includeHeaders.Enabled && Headers is {Count: > 0})
             {
-                LoggingUtils.AppendHeaders(builder, Headers, includeHeaders, singleLineManner, appendHeader: true);
+                LoggingUtils.AppendHeaders(builder, Headers, includeHeaders, singleLineManner, appendTitle: true);
             }
 
             return builder.ToString();
diff --git a/Vostok.ClusterClient.Core/Model/RequestUrlParser.cs b/Vostok.ClusterClient.Core/Model/RequestUrlParser.cs
index 2b2b685..3427a12 100644
--- a/Vostok.ClusterClient.Core/Model/RequestUrlParser.cs
+++ b/Vostok.ClusterClient.Core/Model/RequestUrlParser.cs
@@ -1,13 +1,10 @@
 using System;
-using System.Collections;
 using System.Collections.Generic;
-using System.Text;
 using JetBrains.Annotations;
-using StringComparison = System.StringComparison;
 
 namespace Vostok.Clusterclient.Core.Model;
 
-internal readonly struct RequestUrlParser : IEnumerable<KeyValuePair<string, string>>
+internal readonly struct RequestUrlParser
 {
     private readonly Dictionary<string, string> query = new();
 
@@ -15,21 +12,10 @@ namespace Vostok.Clusterclient.Core.Model;
 
     public RequestUrlParser([CanBeNull] string url)
     {
-        if (url == null)
+        if (!RequestUrlParsingHelpers.TryParseUrlPath(url, out Path, out var question))
             return;
 
-        var question = url.IndexOf("?", StringComparison.Ordinal);
-        if (question < 0)
-        {
-            Path = url;
-            return;
-        }
-
-        Path = url.Substring(0, question);
-
-        url = url.Substring(question + 1);
-
-        var parameters = url.Split('&');
+        var parameters = url!.Substring(question + 1).Split('&');
         foreach (var parameter in parameters)
         {
             var tokens = parameter.Split('=');
@@ -49,9 +35,6 @@ public bool TryGetQueryParameter([CanBeNull] string key, out string value)
         return query.TryGetValue(key, out value);
     }
 
-    public IEnumerator<KeyValuePair<string, string>> GetEnumerator() =>
-        query.GetEnumerator();
-
-    IEnumerator IEnumerable.GetEnumerator() =>
-        GetEnumerator();
+    public IEnumerable<KeyValuePair<string, string>> GetQueryParameters() =>
+        query;
 }
\ No newline at end of file
diff --git a/Vostok.ClusterClient.Core/Model/RequestUrlParsingHelpers.cs b/Vostok.ClusterClient.Core/Model/RequestUrlParsingHelpers.cs
new file mode 100644
index 0000000..987cca8
--- /dev/null
+++ b/Vostok.ClusterClient.Core/Model/RequestUrlParsingHelpers.cs
@@ -0,0 +1,28 @@
+using System;
+using JetBrains.Annotations;
+
+namespace Vostok.Clusterclient.Core.Model
+{
+    internal static class RequestUrlParsingHelpers
+    {
+        public static bool TryParseUrlPath([CanBeNull] string url, out string path, out int questionInd)
+        {
+            path = null;
+            questionInd = -1;
+
+            if (url == null)
+                return false;
+
+            questionInd = url.IndexOf("?", StringComparison.Ordinal);
+            if (questionInd < 0)
+            {
+                path = url;
+                return true;
+            }
+
+            path = url.Substring(0, questionInd);
+
+            return true;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Vostok.ClusterClient.Core/Model/Response.cs b/Vostok.ClusterClient.Core/Model/Response.cs
index 697a05e..20a3d0c 100644
--- a/Vostok.ClusterClient.Core/Model/Response.cs
+++ b/Vostok.ClusterClient.Core/Model/Response.cs
@@ -173,7 +173,8 @@ public override string ToString()
         [PublicAPI]
         public string ToString(bool includeHeaders)
         {
-            return ToString(includeHeaders, singleLineManner: false);
+            var headersSettings = includeHeaders ? RequestParametersLoggingSettings.DefaultEnabled : RequestParametersLoggingSettings.DefaultDisabled;
+            return ToString(headersSettings, singleLineManner: false);
         }
 
         /// <inheritdoc cref="ToString(bool)"/>
@@ -196,7 +197,7 @@ internal string ToString([NotNull] RequestParametersLoggingSettings includeHeade
 
             if (includeHeaders.Enabled && Headers.Count > 0)
             {
-                LoggingUtils.AppendHeaders(builder, Headers, includeHeaders, singleLineManner, appendHeader: true);
+                LoggingUtils.AppendHeaders(builder, Headers, includeHeaders, singleLineManner, appendTitle: true);
             }
 
             return builder.ToString();
diff --git a/Vostok.ClusterClient.Core/Modules/LoggingModule.cs b/Vostok.ClusterClient.Core/Modules/LoggingModule.cs
index b8303bc..7ceeb69 100644
--- a/Vostok.ClusterClient.Core/Modules/LoggingModule.cs
+++ b/Vostok.ClusterClient.Core/Modules/LoggingModule.cs
@@ -65,16 +65,16 @@ private void LogSuccessfulResult(IRequestContext context, ClusterResult result)
                     ResponseCode = result.Response.Code,
                     ElapsedTime = context.Budget.Elapsed.ToPrettyString(),
                     ElapsedTimeMs = context.Budget.Elapsed.TotalMilliseconds,
-                    ResponseHeaders = GetResponseHeadersString(result.Response.Headers, appendHeader: true),
+                    ResponseHeaders = GetResponseHeadersString(result.Response.Headers, appendTitle: true),
                 });
         }
 
-        private string GetResponseHeadersString(Headers headers, bool appendHeader)
+        private string GetResponseHeadersString(Headers headers, bool appendTitle)
         {
             if (loggingOptions.LogResponseHeaders.Enabled && headers is {Count: > 0})
             {
                 var builder = new StringBuilder();
-                LoggingUtils.AppendHeaders(builder, headers, loggingOptions.LogResponseHeaders, singleLineManner: true, appendHeader: appendHeader);
+                LoggingUtils.AppendHeaders(builder, headers, loggingOptions.LogResponseHeaders, singleLineManner: true, appendTitle);
                 return builder.ToString();
             }
 
@@ -90,7 +90,7 @@ private void LogFailedResult(IRequestContext context, ClusterResult result)
                 TargetService = targetService ?? "somewhere",
                 result.Status,
                 ResponseCode = result.Response.Code,
-                ResponseHeaders = GetResponseHeadersString(result.Response.Headers, appendHeader: true),
+                ResponseHeaders = GetResponseHeadersString(result.Response.Headers, appendTitle: true),
                 ElapsedTime = context.Budget.Elapsed.ToPrettyString(),
                 ElapsedTimeMs = context.Budget.Elapsed.TotalMilliseconds
             };
@@ -177,7 +177,7 @@ private object ConvertResultsToProperties(IList<ReplicaResult> replicaResults)
             for (var i = 0; i < replicaResults.Count; i++)
             {
                 var res = replicaResults[i];
-                var responseHeaders = GetResponseHeadersString(res.Response.Headers, appendHeader: false);
+                var responseHeaders = GetResponseHeadersString(res.Response.Headers, appendTitle: false);
                 var responseCode = (int)res.Response.Code;
                 var elapsedTime = res.Time.ToPrettyString();