Skip to content

Commit

Permalink
Merge pull request #3 from bmazzarol/response_builder
Browse files Browse the repository at this point in the history
feat: support for response building [ci]
  • Loading branch information
bmazzarol authored Jan 8, 2023
2 parents 387fb46 + b6e0b7b commit 40ab671
Show file tree
Hide file tree
Showing 22 changed files with 860 additions and 7 deletions.
1 change: 1 addition & 0 deletions .github/workflows/cd-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ jobs:
matrix:
project-name:
- HttpBuildR.Request
- HttpBuildR.Response
steps:
- uses: actions/checkout@v3
- name: Setup .NET
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/ci-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ jobs:
matrix:
project-name:
- HttpBuildR.Request
- HttpBuildR.Response
steps:
- uses: actions/checkout@v3
- name: Setup .NET
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/report-coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ jobs:
matrix:
project-name:
- HttpBuildR.Request
- HttpBuildR.Response
steps:
- uses: actions/checkout@v3
- name: Setup .NET
Expand Down
10 changes: 10 additions & 0 deletions HttpBuildR.Request.Tests/RequestTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,14 @@ public static void Case4() =>
Version = HttpVersion.Version11
}
);

[Fact(DisplayName = "2 builders can be run one after the other, with independent results")]
public static void Case5()
{
var req1 = Req.Get.To(new Uri("Http://some-host")).WithHeader("a", "1");
var req2 = req1.WithHeader("b", "2");

req1.Headers.Should().HaveCount(1);
req2.Headers.Should().HaveCount(2);
}
}
1 change: 1 addition & 0 deletions HttpBuildR.Request/GlobalUsings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
global using System.Diagnostics.Contracts;
4 changes: 2 additions & 2 deletions HttpBuildR.Request/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ it from [NuGet](https://www.nuget.org/packages/HttpBuildR.Request/), and add
this to the top of each `.cs` file that needs it:

```C#
using static HttpBuildR.Request;
using HttpBuildR;
using Req = HttpMethod;
```

Then get building!,

```c#
using static HttpBuildR.Request;
using HttpBuildR;

// its helpful to alias this for readability
using Req = HttpMethod;
Expand Down
8 changes: 8 additions & 0 deletions HttpBuildR.Request/Request.Content.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public static partial class Request
/// <param name="request">request</param>
/// <param name="content">request content</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithContent(
this HttpRequestMessage request,
HttpContent content
Expand All @@ -30,6 +31,7 @@ HttpContent content
/// <param name="content">request content</param>
/// <param name="options">json serializer options</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithJsonContent<T>(
this HttpRequestMessage request,
T content,
Expand All @@ -48,6 +50,7 @@ private sealed class Utf8StringWriter : StringWriter
public override Encoding Encoding => Encoding.UTF8;
}

[Pure]
private static string SerializeToXml<T>(
this XmlSerializer serializer,
T content,
Expand All @@ -68,6 +71,7 @@ private static string SerializeToXml<T>(
/// <param name="serializer">xml serializer to use</param>
/// <param name="settings">optional settings</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithXmlContent<T>(
this HttpRequestMessage request,
T content,
Expand All @@ -90,6 +94,7 @@ public static HttpRequestMessage WithXmlContent<T>(
/// <param name="settings">optional settings</param>
/// <param name="defaultNamespace">default namespace</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithXmlContent<T>(
this HttpRequestMessage request,
T content,
Expand All @@ -105,6 +110,7 @@ public static HttpRequestMessage WithXmlContent<T>(
/// <param name="content">request content</param>
/// <param name="mediaTypeName">media type of the text content, defaults to text/plain</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithTextContent(
this HttpRequestMessage request,
string content,
Expand All @@ -120,6 +126,7 @@ public static HttpRequestMessage WithTextContent(
/// <param name="request">request</param>
/// <param name="content">request content</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithFormUrlContent(
this HttpRequestMessage request,
params KeyValuePair<string, string>[] content
Expand All @@ -131,6 +138,7 @@ params KeyValuePair<string, string>[] content
/// <param name="request">request</param>
/// <param name="content">request content</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithFormUrlContent(
this HttpRequestMessage request,
IDictionary<string, string> content
Expand Down
20 changes: 20 additions & 0 deletions HttpBuildR.Request/Request.Headers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public static partial class Request
/// <param name="request">request</param>
/// <param name="action">header modification action</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithHeaderModifications(
this HttpRequestMessage request,
Action<HttpRequestHeaders> action
Expand All @@ -26,6 +27,7 @@ Action<HttpRequestHeaders> action
/// <param name="name">header name</param>
/// <param name="value">value</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithHeader(
this HttpRequestMessage request,
string name,
Expand All @@ -39,6 +41,7 @@ public static HttpRequestMessage WithHeader(
/// <param name="name">header name</param>
/// <param name="values">values</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithHeader(
this HttpRequestMessage request,
string name,
Expand All @@ -52,6 +55,7 @@ params string[] values
/// <param name="scheme">authentication scheme</param>
/// <param name="parameter">authentication parameter</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithAuthorization(
this HttpRequestMessage request,
string scheme,
Expand All @@ -68,6 +72,7 @@ string parameter
/// <param name="scheme">authentication scheme</param>
/// <param name="parameter">authentication parameter</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithProxyAuthorization(
this HttpRequestMessage request,
string scheme,
Expand All @@ -83,6 +88,7 @@ string parameter
/// <param name="request">request</param>
/// <param name="token">bearer token</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithBearerToken(
this HttpRequestMessage request,
string token
Expand All @@ -94,6 +100,7 @@ string token
/// <param name="request">request</param>
/// <param name="token">basic token</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithBasicToken(
this HttpRequestMessage request,
string token
Expand All @@ -105,6 +112,7 @@ string token
/// <param name="request">request</param>
/// <param name="value">cache control value</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithCacheControl(
this HttpRequestMessage request,
CacheControlHeaderValue value
Expand All @@ -116,6 +124,7 @@ CacheControlHeaderValue value
/// <param name="request">request</param>
/// <param name="value">value</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithConnectionClose(
this HttpRequestMessage request,
bool? value
Expand All @@ -127,6 +136,7 @@ public static HttpRequestMessage WithConnectionClose(
/// <param name="request">request</param>
/// <param name="value">value</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithDate(
this HttpRequestMessage request,
DateTimeOffset? value
Expand All @@ -139,6 +149,7 @@ public static HttpRequestMessage WithDate(
/// <param name="value">value</param>
/// <param name="quality">quality</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithAccept(
this HttpRequestMessage request,
string value,
Expand All @@ -159,6 +170,7 @@ public static HttpRequestMessage WithAccept(
/// <param name="request">request</param>
/// <param name="value">value</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithIfModifiedSince(
this HttpRequestMessage request,
DateTimeOffset? value
Expand All @@ -170,6 +182,7 @@ public static HttpRequestMessage WithIfModifiedSince(
/// <param name="request">request</param>
/// <param name="value">value</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithIfRange(
this HttpRequestMessage request,
DateTimeOffset value
Expand All @@ -181,6 +194,7 @@ DateTimeOffset value
/// <param name="request">request</param>
/// <param name="value">value</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithIfRange(
this HttpRequestMessage request,
EntityTagHeaderValue value
Expand All @@ -192,6 +206,7 @@ EntityTagHeaderValue value
/// <param name="request">request</param>
/// <param name="value">value</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithIfUnmodifiedSince(
this HttpRequestMessage request,
DateTimeOffset? value
Expand All @@ -203,6 +218,7 @@ public static HttpRequestMessage WithIfUnmodifiedSince(
/// <param name="request">request</param>
/// <param name="value">value</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithMaxForwards(this HttpRequestMessage request, int? value) =>
request.WithHeaderModifications(x => x.MaxForwards = value);

Expand All @@ -213,6 +229,7 @@ public static HttpRequestMessage WithMaxForwards(this HttpRequestMessage request
/// <param name="from">The position at which to start sending data.</param>
/// <param name="to">The position at which to stop sending data.</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithRange(
this HttpRequestMessage request,
long? from,
Expand All @@ -225,6 +242,7 @@ public static HttpRequestMessage WithRange(
/// <param name="request">request</param>
/// <param name="value">value</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithReferrer(this HttpRequestMessage request, string value) =>
request.WithReferrer(new Uri(value));

Expand All @@ -234,6 +252,7 @@ public static HttpRequestMessage WithReferrer(this HttpRequestMessage request, s
/// <param name="request">request</param>
/// <param name="value">value</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithReferrer(this HttpRequestMessage request, Uri value) =>
request.WithHeaderModifications(x => x.Referrer = value);

Expand All @@ -243,6 +262,7 @@ public static HttpRequestMessage WithReferrer(this HttpRequestMessage request, U
/// <param name="request">request</param>
/// <param name="value">value</param>
/// <returns>request</returns>
[Pure]
public static HttpRequestMessage WithTransferEncodingChunked(
this HttpRequestMessage request,
bool? value
Expand Down
25 changes: 22 additions & 3 deletions HttpBuildR.Request/Request.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
// ReSharper disable once CheckNamespace

namespace HttpBuildR;

/// <summary>
Expand All @@ -14,6 +13,7 @@ public static partial class Request
/// <param name="uri">uri</param>
/// <param name="version">http version, default is 2.0</param>
/// <returns>request message</returns>
[Pure]
public static HttpRequestMessage To(
this HttpMethod method,
string uri,
Expand All @@ -27,18 +27,37 @@ public static HttpRequestMessage To(
/// <param name="uri">uri</param>
/// <param name="version">http version, default is 2.0</param>
/// <returns>request message</returns>
[Pure]
public static HttpRequestMessage To(
this HttpMethod method,
Uri uri,
Version? version = default
) => new(method, uri) { Version = version ?? new Version(2, 0) };

[Pure]
private static HttpRequestMessage Clone(this HttpRequestMessage request)
{
HttpRequestMessage clone =
new(request.Method, request.RequestUri)
{
Version = request.Version,
Content = request.Content // without async cloning content will not work
};

foreach (var kvp in request.Headers)
clone.Headers.TryAddWithoutValidation(kvp.Key, kvp.Value);

return clone;
}

[Pure]
private static HttpRequestMessage Modify(
this HttpRequestMessage request,
Action<HttpRequestMessage> modifyAction
)
{
modifyAction(request);
return request;
var clone = request.Clone();
modifyAction(clone);
return clone;
}
}
4 changes: 4 additions & 0 deletions HttpBuildR.Response.Tests/GlobalUsings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
global using BunsenBurner;
global using FluentAssertions;
global using Xunit;
global using Scenario = BunsenBurner.Scenario<BunsenBurner.Syntax.Aaa>;
35 changes: 35 additions & 0 deletions HttpBuildR.Response.Tests/HttpBuildR.Response.Tests.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="BunsenBurner" Version="5.3.1" />
<PackageReference Include="FluentAssertions" Version="6.8.0" />
<PackageReference Include="Meziantou.Xunit.ParallelTestFramework" Version="2.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.2.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\HttpBuildR.Response\HttpBuildR.Response.csproj" />
</ItemGroup>

<ItemGroup>
<AssemblyAttribute Include="System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute" />
</ItemGroup>

</Project>
Loading

0 comments on commit 40ab671

Please sign in to comment.