Skip to content

Commit 40ab671

Browse files
authored
Merge pull request #3 from bmazzarol/response_builder
feat: support for response building [ci]
2 parents 387fb46 + b6e0b7b commit 40ab671

22 files changed

Lines changed: 860 additions & 7 deletions

.github/workflows/cd-build.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ jobs:
2020
matrix:
2121
project-name:
2222
- HttpBuildR.Request
23+
- HttpBuildR.Response
2324
steps:
2425
- uses: actions/checkout@v3
2526
- name: Setup .NET

.github/workflows/ci-build.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ jobs:
1212
matrix:
1313
project-name:
1414
- HttpBuildR.Request
15+
- HttpBuildR.Response
1516
steps:
1617
- uses: actions/checkout@v3
1718
- name: Setup .NET

.github/workflows/report-coverage.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ jobs:
1414
matrix:
1515
project-name:
1616
- HttpBuildR.Request
17+
- HttpBuildR.Response
1718
steps:
1819
- uses: actions/checkout@v3
1920
- name: Setup .NET

HttpBuildR.Request.Tests/RequestTests.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,14 @@ public static void Case4() =>
6565
Version = HttpVersion.Version11
6666
}
6767
);
68+
69+
[Fact(DisplayName = "2 builders can be run one after the other, with independent results")]
70+
public static void Case5()
71+
{
72+
var req1 = Req.Get.To(new Uri("Http://some-host")).WithHeader("a", "1");
73+
var req2 = req1.WithHeader("b", "2");
74+
75+
req1.Headers.Should().HaveCount(1);
76+
req2.Headers.Should().HaveCount(2);
77+
}
6878
}

HttpBuildR.Request/GlobalUsings.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
global using System.Diagnostics.Contracts;

HttpBuildR.Request/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ it from [NuGet](https://www.nuget.org/packages/HttpBuildR.Request/), and add
1717
this to the top of each `.cs` file that needs it:
1818

1919
```C#
20-
using static HttpBuildR.Request;
20+
using HttpBuildR;
2121
using Req = HttpMethod;
2222
```
2323

2424
Then get building!,
2525

2626
```c#
27-
using static HttpBuildR.Request;
27+
using HttpBuildR;
2828

2929
// its helpful to alias this for readability
3030
using Req = HttpMethod;

HttpBuildR.Request/Request.Content.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public static partial class Request
1818
/// <param name="request">request</param>
1919
/// <param name="content">request content</param>
2020
/// <returns>request</returns>
21+
[Pure]
2122
public static HttpRequestMessage WithContent(
2223
this HttpRequestMessage request,
2324
HttpContent content
@@ -30,6 +31,7 @@ HttpContent content
3031
/// <param name="content">request content</param>
3132
/// <param name="options">json serializer options</param>
3233
/// <returns>request</returns>
34+
[Pure]
3335
public static HttpRequestMessage WithJsonContent<T>(
3436
this HttpRequestMessage request,
3537
T content,
@@ -48,6 +50,7 @@ private sealed class Utf8StringWriter : StringWriter
4850
public override Encoding Encoding => Encoding.UTF8;
4951
}
5052

53+
[Pure]
5154
private static string SerializeToXml<T>(
5255
this XmlSerializer serializer,
5356
T content,
@@ -68,6 +71,7 @@ private static string SerializeToXml<T>(
6871
/// <param name="serializer">xml serializer to use</param>
6972
/// <param name="settings">optional settings</param>
7073
/// <returns>request</returns>
74+
[Pure]
7175
public static HttpRequestMessage WithXmlContent<T>(
7276
this HttpRequestMessage request,
7377
T content,
@@ -90,6 +94,7 @@ public static HttpRequestMessage WithXmlContent<T>(
9094
/// <param name="settings">optional settings</param>
9195
/// <param name="defaultNamespace">default namespace</param>
9296
/// <returns>request</returns>
97+
[Pure]
9398
public static HttpRequestMessage WithXmlContent<T>(
9499
this HttpRequestMessage request,
95100
T content,
@@ -105,6 +110,7 @@ public static HttpRequestMessage WithXmlContent<T>(
105110
/// <param name="content">request content</param>
106111
/// <param name="mediaTypeName">media type of the text content, defaults to text/plain</param>
107112
/// <returns>request</returns>
113+
[Pure]
108114
public static HttpRequestMessage WithTextContent(
109115
this HttpRequestMessage request,
110116
string content,
@@ -120,6 +126,7 @@ public static HttpRequestMessage WithTextContent(
120126
/// <param name="request">request</param>
121127
/// <param name="content">request content</param>
122128
/// <returns>request</returns>
129+
[Pure]
123130
public static HttpRequestMessage WithFormUrlContent(
124131
this HttpRequestMessage request,
125132
params KeyValuePair<string, string>[] content
@@ -131,6 +138,7 @@ params KeyValuePair<string, string>[] content
131138
/// <param name="request">request</param>
132139
/// <param name="content">request content</param>
133140
/// <returns>request</returns>
141+
[Pure]
134142
public static HttpRequestMessage WithFormUrlContent(
135143
this HttpRequestMessage request,
136144
IDictionary<string, string> content

HttpBuildR.Request/Request.Headers.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public static partial class Request
1414
/// <param name="request">request</param>
1515
/// <param name="action">header modification action</param>
1616
/// <returns>request</returns>
17+
[Pure]
1718
public static HttpRequestMessage WithHeaderModifications(
1819
this HttpRequestMessage request,
1920
Action<HttpRequestHeaders> action
@@ -26,6 +27,7 @@ Action<HttpRequestHeaders> action
2627
/// <param name="name">header name</param>
2728
/// <param name="value">value</param>
2829
/// <returns>request</returns>
30+
[Pure]
2931
public static HttpRequestMessage WithHeader(
3032
this HttpRequestMessage request,
3133
string name,
@@ -39,6 +41,7 @@ public static HttpRequestMessage WithHeader(
3941
/// <param name="name">header name</param>
4042
/// <param name="values">values</param>
4143
/// <returns>request</returns>
44+
[Pure]
4245
public static HttpRequestMessage WithHeader(
4346
this HttpRequestMessage request,
4447
string name,
@@ -52,6 +55,7 @@ params string[] values
5255
/// <param name="scheme">authentication scheme</param>
5356
/// <param name="parameter">authentication parameter</param>
5457
/// <returns>request</returns>
58+
[Pure]
5559
public static HttpRequestMessage WithAuthorization(
5660
this HttpRequestMessage request,
5761
string scheme,
@@ -68,6 +72,7 @@ string parameter
6872
/// <param name="scheme">authentication scheme</param>
6973
/// <param name="parameter">authentication parameter</param>
7074
/// <returns>request</returns>
75+
[Pure]
7176
public static HttpRequestMessage WithProxyAuthorization(
7277
this HttpRequestMessage request,
7378
string scheme,
@@ -83,6 +88,7 @@ string parameter
8388
/// <param name="request">request</param>
8489
/// <param name="token">bearer token</param>
8590
/// <returns>request</returns>
91+
[Pure]
8692
public static HttpRequestMessage WithBearerToken(
8793
this HttpRequestMessage request,
8894
string token
@@ -94,6 +100,7 @@ string token
94100
/// <param name="request">request</param>
95101
/// <param name="token">basic token</param>
96102
/// <returns>request</returns>
103+
[Pure]
97104
public static HttpRequestMessage WithBasicToken(
98105
this HttpRequestMessage request,
99106
string token
@@ -105,6 +112,7 @@ string token
105112
/// <param name="request">request</param>
106113
/// <param name="value">cache control value</param>
107114
/// <returns>request</returns>
115+
[Pure]
108116
public static HttpRequestMessage WithCacheControl(
109117
this HttpRequestMessage request,
110118
CacheControlHeaderValue value
@@ -116,6 +124,7 @@ CacheControlHeaderValue value
116124
/// <param name="request">request</param>
117125
/// <param name="value">value</param>
118126
/// <returns>request</returns>
127+
[Pure]
119128
public static HttpRequestMessage WithConnectionClose(
120129
this HttpRequestMessage request,
121130
bool? value
@@ -127,6 +136,7 @@ public static HttpRequestMessage WithConnectionClose(
127136
/// <param name="request">request</param>
128137
/// <param name="value">value</param>
129138
/// <returns>request</returns>
139+
[Pure]
130140
public static HttpRequestMessage WithDate(
131141
this HttpRequestMessage request,
132142
DateTimeOffset? value
@@ -139,6 +149,7 @@ public static HttpRequestMessage WithDate(
139149
/// <param name="value">value</param>
140150
/// <param name="quality">quality</param>
141151
/// <returns>request</returns>
152+
[Pure]
142153
public static HttpRequestMessage WithAccept(
143154
this HttpRequestMessage request,
144155
string value,
@@ -159,6 +170,7 @@ public static HttpRequestMessage WithAccept(
159170
/// <param name="request">request</param>
160171
/// <param name="value">value</param>
161172
/// <returns>request</returns>
173+
[Pure]
162174
public static HttpRequestMessage WithIfModifiedSince(
163175
this HttpRequestMessage request,
164176
DateTimeOffset? value
@@ -170,6 +182,7 @@ public static HttpRequestMessage WithIfModifiedSince(
170182
/// <param name="request">request</param>
171183
/// <param name="value">value</param>
172184
/// <returns>request</returns>
185+
[Pure]
173186
public static HttpRequestMessage WithIfRange(
174187
this HttpRequestMessage request,
175188
DateTimeOffset value
@@ -181,6 +194,7 @@ DateTimeOffset value
181194
/// <param name="request">request</param>
182195
/// <param name="value">value</param>
183196
/// <returns>request</returns>
197+
[Pure]
184198
public static HttpRequestMessage WithIfRange(
185199
this HttpRequestMessage request,
186200
EntityTagHeaderValue value
@@ -192,6 +206,7 @@ EntityTagHeaderValue value
192206
/// <param name="request">request</param>
193207
/// <param name="value">value</param>
194208
/// <returns>request</returns>
209+
[Pure]
195210
public static HttpRequestMessage WithIfUnmodifiedSince(
196211
this HttpRequestMessage request,
197212
DateTimeOffset? value
@@ -203,6 +218,7 @@ public static HttpRequestMessage WithIfUnmodifiedSince(
203218
/// <param name="request">request</param>
204219
/// <param name="value">value</param>
205220
/// <returns>request</returns>
221+
[Pure]
206222
public static HttpRequestMessage WithMaxForwards(this HttpRequestMessage request, int? value) =>
207223
request.WithHeaderModifications(x => x.MaxForwards = value);
208224

@@ -213,6 +229,7 @@ public static HttpRequestMessage WithMaxForwards(this HttpRequestMessage request
213229
/// <param name="from">The position at which to start sending data.</param>
214230
/// <param name="to">The position at which to stop sending data.</param>
215231
/// <returns>request</returns>
232+
[Pure]
216233
public static HttpRequestMessage WithRange(
217234
this HttpRequestMessage request,
218235
long? from,
@@ -225,6 +242,7 @@ public static HttpRequestMessage WithRange(
225242
/// <param name="request">request</param>
226243
/// <param name="value">value</param>
227244
/// <returns>request</returns>
245+
[Pure]
228246
public static HttpRequestMessage WithReferrer(this HttpRequestMessage request, string value) =>
229247
request.WithReferrer(new Uri(value));
230248

@@ -234,6 +252,7 @@ public static HttpRequestMessage WithReferrer(this HttpRequestMessage request, s
234252
/// <param name="request">request</param>
235253
/// <param name="value">value</param>
236254
/// <returns>request</returns>
255+
[Pure]
237256
public static HttpRequestMessage WithReferrer(this HttpRequestMessage request, Uri value) =>
238257
request.WithHeaderModifications(x => x.Referrer = value);
239258

@@ -243,6 +262,7 @@ public static HttpRequestMessage WithReferrer(this HttpRequestMessage request, U
243262
/// <param name="request">request</param>
244263
/// <param name="value">value</param>
245264
/// <returns>request</returns>
265+
[Pure]
246266
public static HttpRequestMessage WithTransferEncodingChunked(
247267
this HttpRequestMessage request,
248268
bool? value

HttpBuildR.Request/Request.cs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
// ReSharper disable once CheckNamespace
2-
32
namespace HttpBuildR;
43

54
/// <summary>
@@ -14,6 +13,7 @@ public static partial class Request
1413
/// <param name="uri">uri</param>
1514
/// <param name="version">http version, default is 2.0</param>
1615
/// <returns>request message</returns>
16+
[Pure]
1717
public static HttpRequestMessage To(
1818
this HttpMethod method,
1919
string uri,
@@ -27,18 +27,37 @@ public static HttpRequestMessage To(
2727
/// <param name="uri">uri</param>
2828
/// <param name="version">http version, default is 2.0</param>
2929
/// <returns>request message</returns>
30+
[Pure]
3031
public static HttpRequestMessage To(
3132
this HttpMethod method,
3233
Uri uri,
3334
Version? version = default
3435
) => new(method, uri) { Version = version ?? new Version(2, 0) };
3536

37+
[Pure]
38+
private static HttpRequestMessage Clone(this HttpRequestMessage request)
39+
{
40+
HttpRequestMessage clone =
41+
new(request.Method, request.RequestUri)
42+
{
43+
Version = request.Version,
44+
Content = request.Content // without async cloning content will not work
45+
};
46+
47+
foreach (var kvp in request.Headers)
48+
clone.Headers.TryAddWithoutValidation(kvp.Key, kvp.Value);
49+
50+
return clone;
51+
}
52+
53+
[Pure]
3654
private static HttpRequestMessage Modify(
3755
this HttpRequestMessage request,
3856
Action<HttpRequestMessage> modifyAction
3957
)
4058
{
41-
modifyAction(request);
42-
return request;
59+
var clone = request.Clone();
60+
modifyAction(clone);
61+
return clone;
4362
}
4463
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
global using BunsenBurner;
2+
global using FluentAssertions;
3+
global using Xunit;
4+
global using Scenario = BunsenBurner.Scenario<BunsenBurner.Syntax.Aaa>;

0 commit comments

Comments
 (0)