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);
}
///
@@ -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>
+internal readonly struct RequestUrlParser
{
private readonly Dictionary 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> GetEnumerator() =>
- query.GetEnumerator();
-
- IEnumerator IEnumerable.GetEnumerator() =>
- GetEnumerator();
+ public IEnumerable> 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);
}
///
@@ -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 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();