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();