Skip to content

Commit eef6f0a

Browse files
committed
Fix null return bug when HttpResponseMessageException occurs
1 parent 47ff3ce commit eef6f0a

File tree

9 files changed

+86
-5
lines changed

9 files changed

+86
-5
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
8+
<IsPackable>false</IsPackable>
9+
<IsTestProject>true</IsTestProject>
10+
</PropertyGroup>
11+
12+
<ItemGroup>
13+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
14+
<PackageReference Include="Shouldly" Version="4.2.1" />
15+
<PackageReference Include="xunit" Version="2.4.2" />
16+
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
17+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
18+
<PrivateAssets>all</PrivateAssets>
19+
</PackageReference>
20+
<PackageReference Include="coverlet.collector" Version="6.0.0">
21+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
22+
<PrivateAssets>all</PrivateAssets>
23+
</PackageReference>
24+
</ItemGroup>
25+
26+
<ItemGroup>
27+
<ProjectReference Include="..\FluentHttpClient\FluentHttpClient.csproj" />
28+
</ItemGroup>
29+
30+
</Project>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
global using Xunit;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Shouldly;
2+
3+
namespace FluentHttpClient.Tests;
4+
5+
public class NullHttpResponseMessageTests
6+
{
7+
[Fact]
8+
public void IsSuccessStatusCodeTest()
9+
{
10+
var message = new NullHttpResponseMessage();
11+
message.IsSuccessStatusCode.ShouldBeFalse();
12+
}
13+
14+
[Fact]
15+
public void HttpResponseExceptionOccurredTest()
16+
{
17+
HttpResponseMessage message = new NullHttpResponseMessage();
18+
message.HttpResponseMessageExceptionOccurred().ShouldBeTrue();
19+
}
20+
}

src/FluentHttpClient.sln

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FluentHttpClient", "FluentH
77
EndProject
88
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples", "Samples\Samples.csproj", "{9EF02AE9-B2AD-4A08-A2BD-CDC573A52D65}"
99
EndProject
10+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FluentHttpClient.Tests", "FluentHttpClient.Tests\FluentHttpClient.Tests.csproj", "{7BF989ED-C2D4-426A-B525-417251AD337A}"
11+
EndProject
1012
Global
1113
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1214
Debug|Any CPU = Debug|Any CPU
@@ -24,5 +26,9 @@ Global
2426
{9EF02AE9-B2AD-4A08-A2BD-CDC573A52D65}.Debug|Any CPU.Build.0 = Debug|Any CPU
2527
{9EF02AE9-B2AD-4A08-A2BD-CDC573A52D65}.Release|Any CPU.ActiveCfg = Release|Any CPU
2628
{9EF02AE9-B2AD-4A08-A2BD-CDC573A52D65}.Release|Any CPU.Build.0 = Release|Any CPU
29+
{7BF989ED-C2D4-426A-B525-417251AD337A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
30+
{7BF989ED-C2D4-426A-B525-417251AD337A}.Debug|Any CPU.Build.0 = Debug|Any CPU
31+
{7BF989ED-C2D4-426A-B525-417251AD337A}.Release|Any CPU.ActiveCfg = Release|Any CPU
32+
{7BF989ED-C2D4-426A-B525-417251AD337A}.Release|Any CPU.Build.0 = Release|Any CPU
2733
EndGlobalSection
2834
EndGlobal

src/FluentHttpClient/FluentHttpClient.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<PackageTags>fluent httpclient rest http api web client</PackageTags>
1515
<AssemblyVersion>$(Version)</AssemblyVersion>
1616
<FileVersion>$(Version)</FileVersion>
17-
<Version>3.0.0</Version>
17+
<Version>3.0.1</Version>
1818
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
1919
<PackageReadmeFile>README.md</PackageReadmeFile>
2020
<PackageLicenseFile>LICENSE</PackageLicenseFile>
@@ -41,7 +41,7 @@
4141
<ItemGroup>
4242
<None Include="..\..\LICENSE" Pack="true" Visible="false" PackagePath="" />
4343
<None Include="..\..\fluenthttpclient.png" Pack="true" PackagePath="\" />
44-
<None Include="..\..\README.md" Pack="true" PackagePath="\" />
44+
<None Include="README.md" Pack="true" PackagePath="\" />
4545
</ItemGroup>
4646

4747
<ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' ">

src/FluentHttpClient/HttpRequestBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public async Task<HttpResponseMessage> SendAsync(HttpMethod method, Cancellation
9696
if (HttpRequestExceptionHandler != null)
9797
{
9898
HttpRequestExceptionHandler(hre);
99-
return null;
99+
return new NullHttpResponseMessage();
100100
}
101101
else
102102
{

src/FluentHttpClient/HttpResponseMessageExtensions.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public static async Task<byte[]> GetResponseBytesAsync(this Task<HttpResponseMes
4646
public static async Task<HttpResponseMessage> OnFailure(this Task<HttpResponseMessage> taskResponseMessage, Action<HttpResponseMessage> action, bool suppressException = true)
4747
{
4848
var response = await taskResponseMessage;
49-
if (!response.IsSuccessStatusCode)
49+
if (!response.IsSuccessStatusCode && !response.HttpResponseMessageExceptionOccurred())
5050
{
5151
action(response);
5252
if (!suppressException) response.EnsureSuccessStatusCode();
@@ -58,7 +58,7 @@ public static async Task<HttpResponseMessage> OnFailure(this Task<HttpResponseMe
5858
public static async Task<HttpResponseMessage> OnFailureAsync(this Task<HttpResponseMessage> taskResponseMessage, Func<HttpResponseMessage, Task> action, bool suppressException = true)
5959
{
6060
var response = await taskResponseMessage;
61-
if (!response.IsSuccessStatusCode)
61+
if (!response.IsSuccessStatusCode && !response.HttpResponseMessageExceptionOccurred())
6262
{
6363
await action(response);
6464
if (!suppressException) response.EnsureSuccessStatusCode();
@@ -80,4 +80,14 @@ public static async Task<HttpResponseMessage> OnSuccessAsync(this Task<HttpRespo
8080
if (response.IsSuccessStatusCode) await action(response);
8181
return await Task.FromResult(response);
8282
}
83+
84+
/// <summary>
85+
/// Returns true if an HttpResponseMessageException occurred while sending the request
86+
/// </summary>
87+
/// <param name="message"></param>
88+
/// <returns></returns>
89+
public static bool HttpResponseMessageExceptionOccurred(this HttpResponseMessage message)
90+
{
91+
return message is NullHttpResponseMessage;
92+
}
8393
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System.Security.Cryptography.X509Certificates;
2+
3+
namespace FluentHttpClient;
4+
5+
public class NullHttpResponseMessage : HttpResponseMessage
6+
{
7+
public NullHttpResponseMessage() : base()
8+
{
9+
StatusCode = 0;
10+
}
11+
}

src/FluentHttpClient/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# ![Logo](https://raw.githubusercontent.com/scottoffen/fluenthttpclient/main/fluenthttpclientx25.png) FluentHttpClient
2+
3+
FluentHttpClient exposes a set of extensions methods to make sending REST requests with `HttpClient` both readable and chainable.

0 commit comments

Comments
 (0)