Skip to content

Commit

Permalink
fix bug for relative url
Browse files Browse the repository at this point in the history
  • Loading branch information
patrofimov committed Aug 21, 2024
1 parent 08607a2 commit a0b4d37
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 6 deletions.
18 changes: 18 additions & 0 deletions Vostok.ClusterClient.Core.Tests/Model/Request_Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -620,6 +620,24 @@ public void ToString_should_return_correct_value_when_printing_both_query_and_he
request.ToString(true, true).Should().Be("POST http://foo/bar?a=b" + Environment.NewLine + "name=value");
}

[TestCase("foo/bar?a=b", "POST foo/bar?a=b")]
[TestCase("foo/bar", "POST foo/bar")]
public void ToString_should_return_correct_value_for_relative_url_with_query(string input, string expected)
{
request = new Request(RequestMethods.Post, new Uri(input, UriKind.Relative), Content.Empty, Headers.Empty);

request.ToString(true, false).Should().Be(expected);
}

[TestCase("foo/bar?a=b", "POST foo/bar")]
[TestCase("foo/bar", "POST foo/bar")]
public void ToString_should_return_correct_value_for_relative_url_without_query(string input, string expected)
{
request = new Request(RequestMethods.Post, new Uri(input, UriKind.Relative), Content.Empty, Headers.Empty);

request.ToString(false, false).Should().Be(expected);
}

[Test]
public void ToString_should_return_correct_value_when_printing_headers_but_omitting_query()
{
Expand Down
7 changes: 4 additions & 3 deletions Vostok.ClusterClient.Core/Misc/LoggingUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,17 @@ namespace Vostok.Clusterclient.Core.Misc
{
internal static class LoggingUtils
{
public static void AppendQueryString(StringBuilder builder, Uri uri, RequestParametersLoggingSettings querySettings)
public static void AppendQueryString(StringBuilder builder, Uri uri, RequestParametersLoggingSettings querySettings, RequestUrlParser requestUrlParser)
{
if (querySettings.IsEnabledForAllKeys())
{
builder.Append(uri.Query);
builder.Append(uri);
return;
}

builder.Append(requestUrlParser.Path);

var writtenFirst = false;
var requestUrlParser = new RequestUrlParser(uri.ToString());
foreach (var pair in requestUrlParser.Where(kvp => querySettings.IsEnabledForKey(kvp.Key)))
{
if (!writtenFirst)
Expand Down
9 changes: 6 additions & 3 deletions Vostok.ClusterClient.Core/Model/Request.cs
Original file line number Diff line number Diff line change
Expand Up @@ -258,12 +258,15 @@ internal string ToString([NotNull] RequestParametersLoggingSettings includeQuery
builder.Append(Method);
builder.Append(" ");

var path = Url.GetLeftPart(UriPartial.Path);
builder.Append(path);
var requestUrlParser = new RequestUrlParser(Url.ToString());

if (includeQuery.Enabled)
{
LoggingUtils.AppendQueryString(builder, Url, includeQuery);
LoggingUtils.AppendQueryString(builder, Url, includeQuery, requestUrlParser);
}
else
{
builder.Append(requestUrlParser.Path);
}

if (includeHeaders.Enabled && Headers is {Count: > 0})
Expand Down
8 changes: 8 additions & 0 deletions Vostok.ClusterClient.Core/Model/RequestUrlParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,22 @@ namespace Vostok.Clusterclient.Core.Model;
{
private readonly Dictionary<string, string> query = new();

public readonly string Path = null;

public RequestUrlParser([CanBeNull] string url)
{
if (url == null)
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('&');
Expand Down

0 comments on commit a0b4d37

Please sign in to comment.