Skip to content

Commit 7079714

Browse files
committed
Add extra formatter options
1 parent e77ea91 commit 7079714

File tree

4 files changed

+102
-11
lines changed

4 files changed

+102
-11
lines changed

src/TestableHttpClient/Utils/HttpRequestMessageFormatter.cs

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,55 @@ internal static string Format(HttpRequestMessage? request, HttpRequestMessageFor
1313

1414
IFormatProvider formatProvider = CultureInfo.InvariantCulture;
1515
StringBuilder builder = new();
16-
builder.Append(formatProvider, $"{request.Method} {request.RequestUri} HTTP/{request.Version}\r\n");
17-
foreach(var header in request.Headers)
16+
if (options.HasFlag(HttpRequestMessageFormatOptions.RequestLine))
1817
{
19-
builder.Append(formatProvider, $"{header.Key}: {string.Join(", ", header.Value)}\r\n");
18+
builder.Append(formatProvider, $"{request.Method} {request.RequestUri} HTTP/{request.Version}\r\n");
2019
}
21-
foreach(var header in request.Content?.Headers ?? Enumerable.Empty<KeyValuePair<string, IEnumerable<string>>>())
20+
else
2221
{
23-
builder.Append(formatProvider, $"{header.Key}: {string.Join(", ", header.Value)}\r\n");
22+
if (options.HasFlag(HttpRequestMessageFormatOptions.HttpMethod))
23+
{
24+
builder.Append(formatProvider, $"{request.Method}");
25+
}
26+
if (options.HasFlag(HttpRequestMessageFormatOptions.RequestUri))
27+
{
28+
if(builder.Length > 0)
29+
{
30+
builder.Append(" ");
31+
}
32+
builder.Append(formatProvider, $"{request.RequestUri}");
33+
}
34+
if (options.HasFlag(HttpRequestMessageFormatOptions.HttpVersion))
35+
{
36+
if (builder.Length > 0)
37+
{
38+
builder.Append(" ");
39+
}
40+
builder.Append(formatProvider, $"HTTP/{request.Version}");
41+
}
42+
if(options.HasFlag(HttpRequestMessageFormatOptions.Headers) || options.HasFlag(HttpRequestMessageFormatOptions.Content))
43+
{
44+
builder.Append("\r\n");
45+
}
46+
}
47+
48+
if (options.HasFlag(HttpRequestMessageFormatOptions.Headers))
49+
{
50+
foreach (var header in request.Headers)
51+
{
52+
builder.Append(formatProvider, $"{header.Key}: {string.Join(", ", header.Value)}\r\n");
53+
}
54+
foreach (var header in request.Content?.Headers ?? Enumerable.Empty<KeyValuePair<string, IEnumerable<string>>>())
55+
{
56+
builder.Append(formatProvider, $"{header.Key}: {string.Join(", ", header.Value)}\r\n");
57+
}
58+
}
59+
60+
if (options.HasFlag(HttpRequestMessageFormatOptions.Content))
61+
{
62+
builder.Append("\r\n");
63+
builder.Append(request.Content?.ReadAsStringAsync().GetAwaiter().GetResult());
2464
}
25-
builder.Append("\r\n");
26-
builder.Append(request.Content?.ReadAsStringAsync().GetAwaiter().GetResult());
2765

2866
return builder.ToString();
2967
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
POST https://example.com/
2+
3+
Hello, World!
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
POST https://example.com/
2+
Content-Type: text/plain; charset=utf-8
3+
Content-Length: 13

test/TestableHttpClient.Tests/Utils/HttpRequestMessageFormatterTests.cs

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
using System.IO;
22
using System.Runtime.CompilerServices;
3-
using System.Runtime.InteropServices;
43

54
using TestableHttpClient.Utils;
5+
using static TestableHttpClient.Utils.HttpRequestMessageFormatter;
66

77
namespace TestableHttpClient.Tests.Utils;
88

@@ -21,7 +21,7 @@ public void Format_NullRequest_CreatesExpectedString()
2121
{
2222
HttpRequestMessage? request = null;
2323

24-
var result = HttpRequestMessageFormatter.Format(request, HttpRequestMessageFormatOptions.All);
24+
var result = Format(request, HttpRequestMessageFormatOptions.All);
2525

2626
Assert.Equal("null", result);
2727
}
@@ -37,7 +37,7 @@ public void Format_SimpleGetRequest_CreatesExpectedString(string version)
3737
{
3838
Version = Version.Parse(version)
3939
};
40-
string result = HttpRequestMessageFormatter.Format(request, HttpRequestMessageFormatOptions.All);
40+
string result = Format(request, HttpRequestMessageFormatOptions.All);
4141

4242
string expected = FetchTestData($"simple_get_request_version_{version}");
4343

@@ -53,10 +53,57 @@ public void Format_SimplePostRequestWithHeadersAndBody_CreatesExpectedString()
5353
};
5454
request.Content = new StringContent("Hello, World!");
5555
request.Content.Headers.ContentLength = 13;
56-
string result = HttpRequestMessageFormatter.Format(request, HttpRequestMessageFormatOptions.All);
56+
string result = Format(request, HttpRequestMessageFormatOptions.All);
5757

5858
string expected = FetchTestData("simple_post_request");
5959

6060
Assert.Equal(expected, result);
6161
}
62+
63+
[Fact]
64+
public void FormatRequestLineOptions_AnyRequest_CreatesExpectedString()
65+
{
66+
using HttpRequestMessage request = new(HttpMethod.Get, "https://example.com") { Version = HttpVersion.Version11 };
67+
68+
Assert.Multiple(
69+
() => Assert.Equal("GET", Format(request, HttpRequestMessageFormatOptions.HttpMethod)),
70+
() => Assert.Equal("https://example.com/", Format(request, HttpRequestMessageFormatOptions.RequestUri)),
71+
() => Assert.Equal("HTTP/1.1", Format(request, HttpRequestMessageFormatOptions.HttpVersion)),
72+
() => Assert.Equal("GET https://example.com/", Format(request, HttpRequestMessageFormatOptions.HttpMethod | HttpRequestMessageFormatOptions.RequestUri)),
73+
() => Assert.Equal("https://example.com/ HTTP/1.1", Format(request, HttpRequestMessageFormatOptions.RequestUri | HttpRequestMessageFormatOptions.HttpVersion)),
74+
() => Assert.Equal("GET https://example.com/ HTTP/1.1\r\n", Format(request, HttpRequestMessageFormatOptions.RequestLine))
75+
);
76+
}
77+
78+
[Fact]
79+
public void FormatRequestLineHeaders_SimplePostRequestWithHeadersAndBody_CreatesExpectedString()
80+
{
81+
using HttpRequestMessage request = new(HttpMethod.Post, "https://example.com")
82+
{
83+
Version = HttpVersion.Version11
84+
};
85+
request.Content = new StringContent("Hello, World!");
86+
request.Content.Headers.ContentLength = 13;
87+
string result = Format(request, HttpRequestMessageFormatOptions.HttpMethod|HttpRequestMessageFormatOptions.RequestUri|HttpRequestMessageFormatOptions.Headers);
88+
89+
string expected = FetchTestData("method_uri_headers_post_request");
90+
91+
Assert.Equal(expected, result);
92+
}
93+
94+
[Fact]
95+
public void FormatRequestLineContent_SimplePostRequestWithHeadersAndBody_CreatesExpectedString()
96+
{
97+
using HttpRequestMessage request = new(HttpMethod.Post, "https://example.com")
98+
{
99+
Version = HttpVersion.Version11
100+
};
101+
request.Content = new StringContent("Hello, World!");
102+
request.Content.Headers.ContentLength = 13;
103+
string result = Format(request, HttpRequestMessageFormatOptions.HttpMethod | HttpRequestMessageFormatOptions.RequestUri | HttpRequestMessageFormatOptions.Content);
104+
105+
string expected = FetchTestData("method_uri_content_post_request");
106+
107+
Assert.Equal(expected, result);
108+
}
62109
}

0 commit comments

Comments
 (0)