Skip to content

Commit d326b57

Browse files
authored
Enable nullable (#18)
1 parent 7af237d commit d326b57

6 files changed

+37
-21
lines changed

src/FluentHttpClient/FluentHttpClient.csproj

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<LangVersion>10.0</LangVersion>
7+
<Nullable>enable</Nullable>
78
<PackageId>FluentHttpClient</PackageId>
89
<PackageVersion>$(Version)</PackageVersion>
910
<Authors>Scott Offen</Authors>
@@ -14,7 +15,7 @@
1415
<PackageTags>fluent httpclient rest http api web client</PackageTags>
1516
<AssemblyVersion>$(Version)</AssemblyVersion>
1617
<FileVersion>$(Version)</FileVersion>
17-
<Version>3.0.3</Version>
18+
<Version>3.0.4</Version>
1819
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
1920
<PackageReadmeFile>README.md</PackageReadmeFile>
2021
<PackageLicenseFile>LICENSE</PackageLicenseFile>

src/FluentHttpClient/FluentJsonDeserialization.cs

+10-10
Original file line numberDiff line numberDiff line change
@@ -4,56 +4,56 @@ namespace FluentHttpClient;
44

55
public static class FluentJsonDeserialization
66
{
7-
public static async Task<T> DeserializeJsonAsync<T>(this Task<Stream> result)
7+
public static async Task<T?> DeserializeJsonAsync<T>(this Task<Stream> result)
88
{
99
return await result.DeserializeJsonAsync<T>(FluentHttpClient.DefaultJsonSerializerOptions);
1010
}
1111

12-
public static async Task<T> DeserializeJsonAsync<T>(this Task<Stream> result, JsonSerializerOptions options)
12+
public static async Task<T?> DeserializeJsonAsync<T>(this Task<Stream> result, JsonSerializerOptions options)
1313
{
1414
return await JsonSerializer.DeserializeAsync<T>(await result, options);
1515
}
1616

17-
public static async Task<T> DeserializeJsonAsync<T>(this Task<String> result)
17+
public static async Task<T?> DeserializeJsonAsync<T>(this Task<String> result)
1818
{
1919
return await result.DeserializeJsonAsync<T>(FluentHttpClient.DefaultJsonSerializerOptions);
2020
}
2121

22-
public static async Task<T> DeserializeJsonAsync<T>(this Task<string> result, JsonSerializerOptions options)
22+
public static async Task<T?> DeserializeJsonAsync<T>(this Task<string> result, JsonSerializerOptions options)
2323
{
2424
return JsonSerializer.Deserialize<T>(await result, options);
2525
}
2626

27-
public static async Task<T> DeserializeJsonAsync<T>(this Task<HttpResponseMessage> result)
27+
public static async Task<T?> DeserializeJsonAsync<T>(this Task<HttpResponseMessage> result)
2828
{
2929
return await result.DeserializeJsonAsync<T>(FluentHttpClient.DefaultJsonSerializerOptions);
3030
}
3131

32-
public static async Task<T> DeserializeJsonAsync<T>(this Task<HttpResponseMessage> taskResponse, JsonSerializerOptions options)
32+
public static async Task<T?> DeserializeJsonAsync<T>(this Task<HttpResponseMessage> taskResponse, JsonSerializerOptions options)
3333
{
3434
var response = await taskResponse;
3535
return JsonSerializer.Deserialize<T>(await response.GetResponseStreamAsync(), options);
3636
}
3737

38-
public static async Task<T> DeserializeJsonAsync<T>(this Task<HttpResponseMessage> result, Func<HttpResponseMessage, T> defaultAction)
38+
public static async Task<T?> DeserializeJsonAsync<T>(this Task<HttpResponseMessage> result, Func<HttpResponseMessage, T> defaultAction)
3939
{
4040
return await result.DeserializeJsonAsync<T>(defaultAction, FluentHttpClient.DefaultJsonSerializerOptions);
4141
}
4242

43-
public static async Task<T> DeserializeJsonAsync<T>(this Task<HttpResponseMessage> taskResponse, Func<HttpResponseMessage, T> defaultAction, JsonSerializerOptions options)
43+
public static async Task<T?> DeserializeJsonAsync<T>(this Task<HttpResponseMessage> taskResponse, Func<HttpResponseMessage, T> defaultAction, JsonSerializerOptions options)
4444
{
4545
var response = await taskResponse;
4646
return (response.IsSuccessStatusCode)
4747
? JsonSerializer.Deserialize<T>(await response.GetResponseStreamAsync(), options)
4848
: defaultAction(response);
4949
}
5050

51-
public static async Task<T> DeserializeJsonAsync<T>(this Task<HttpResponseMessage> result, Func<HttpResponseMessage, Task<T>> defaultAction)
51+
public static async Task<T?> DeserializeJsonAsync<T>(this Task<HttpResponseMessage> result, Func<HttpResponseMessage, Task<T>> defaultAction)
5252
{
5353
return await result.DeserializeJsonAsync<T>(defaultAction, FluentHttpClient.DefaultJsonSerializerOptions);
5454
}
5555

56-
public static async Task<T> DeserializeJsonAsync<T>(this Task<HttpResponseMessage> taskResponse, Func<HttpResponseMessage, Task<T>> defaultAction, JsonSerializerOptions options)
56+
public static async Task<T?> DeserializeJsonAsync<T>(this Task<HttpResponseMessage> taskResponse, Func<HttpResponseMessage, Task<T>> defaultAction, JsonSerializerOptions options)
5757
{
5858
var response = await taskResponse;
5959
return (response.IsSuccessStatusCode)

src/FluentHttpClient/FluentXmlDeserialization.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,24 @@ public static async Task<XElement> DeserializeXmlAsync(this Task<HttpResponseMes
2323
return await XElement.LoadAsync(await response.GetResponseStreamAsync(), options, token.Value);
2424
}
2525

26-
public static async Task<T> DeserializeXmlAsync<T>(this Task<HttpResponseMessage> taskResponse, Func<HttpResponseMessage, Task<T>> defaultAction)
26+
public static async Task<T?> DeserializeXmlAsync<T>(this Task<HttpResponseMessage> taskResponse, Func<HttpResponseMessage, Task<T>> defaultAction)
2727
{
2828
var response = await taskResponse;
2929
return (response.IsSuccessStatusCode)
3030
? await response.DeserializeXmlAsync<T>()
3131
: await defaultAction(response);
3232
}
3333

34-
public static async Task<T> DeserializeXmlAsync<T>(this Task<HttpResponseMessage> taskResponse)
34+
public static async Task<T?> DeserializeXmlAsync<T>(this Task<HttpResponseMessage> taskResponse)
3535
{
3636
var response = await taskResponse;
3737
return await response.DeserializeXmlAsync<T>();
3838
}
3939

40-
public static async Task<T> DeserializeXmlAsync<T>(this HttpResponseMessage response)
40+
public static async Task<T?> DeserializeXmlAsync<T>(this HttpResponseMessage response)
4141
{
4242
using var reader = new StreamReader(await response.GetResponseStreamAsync());
4343
var serializer = new XmlSerializer(typeof(T));
44-
return (T)serializer.Deserialize(reader);
44+
return (T?)serializer.Deserialize(reader);
4545
}
4646
}

src/FluentHttpClient/HttpClientExtensions.cs

+11-1
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,18 @@ public static class HttpClientExtensions
88
/// <param name="client">HttpClient instance to be used for request</param>
99
/// <param name="route">Endpoint URL, can be empty if the base address already targets the endpoint</param>
1010
/// <returns></returns>
11-
public static HttpRequestBuilder UsingRoute(this HttpClient client, string route = null)
11+
public static HttpRequestBuilder UsingRoute(this HttpClient client, string route)
1212
{
1313
return new HttpRequestBuilder(client).UsingRoute(route);
1414
}
15+
16+
/// <summary>
17+
/// Returns an <see cref="HttpRequestBuilder"/> with an empty route
18+
/// </summary>
19+
/// <param name="client">HttpClient instance to be used for request</param>
20+
/// <remarks>The request will be sent to the BaseUrl of the <see cref="HttpClient"/> </remarks>
21+
public static HttpRequestBuilder WithoutRoute(this HttpClient client)
22+
{
23+
return new HttpRequestBuilder(client).UsingRoute(string.Empty);
24+
}
1525
}

src/FluentHttpClient/HttpRequestBuilder.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ public class HttpRequestBuilder
44
{
55
private readonly HttpClient _client;
66

7-
public HttpContent Content
7+
public HttpContent? Content
88
{
99
get { return Request.Content; }
1010
set { Request.Content = value; }
@@ -23,7 +23,7 @@ public HttpContent Content
2323
/// <summary>
2424
/// Get or set an exception handler for exceptions of type <see cref="HttpRequestException"/>
2525
/// </summary>
26-
public Action<HttpRequestException> HttpRequestExceptionHandler { get; set; }
26+
public Action<HttpRequestException>? HttpRequestExceptionHandler { get; set; }
2727

2828
/// <summary>
2929
/// Get or set request query parameters
@@ -39,7 +39,7 @@ public HttpContent Content
3939
/// The request route
4040
/// </summary>
4141
/// <remarks>If the HttpClient has a base address, this value will be appended to the end of the base address, and extra slashes removed.</remarks>
42-
public string Route { get; set; }
42+
public string Route { get; set; } = string.Empty;
4343

4444
/// <summary>
4545
/// Gets or sets the timespan to wait before the request times out
@@ -82,7 +82,7 @@ public async Task<HttpResponseMessage> SendAsync(HttpMethod method, Cancellation
8282
{
8383
Request.RequestUri = noBaseAddress
8484
? new Uri($"{Route}{QueryParams}")
85-
: new Uri($"{_client.BaseAddress.ToString().TrimEnd('/')}/{Route.TrimStart('/')}{QueryParams}");
85+
: new Uri($"{_client.BaseAddress?.ToString().TrimEnd('/')}/{Route.TrimStart('/')}{QueryParams}");
8686
}
8787

8888
token ??= CancellationToken.None;

src/FluentHttpClient/HttpRequestBuilderExtensions.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ namespace FluentHttpClient;
1111
/// </summary>
1212
public static partial class HttpRequestBuilderExtensions
1313
{
14-
public static HttpRequestBuilder UsingRoute(this HttpRequestBuilder builder, string route = null)
14+
public static HttpRequestBuilder UsingRoute(this HttpRequestBuilder builder)
15+
{
16+
return builder.UsingRoute(string.Empty);
17+
}
18+
19+
public static HttpRequestBuilder UsingRoute(this HttpRequestBuilder builder, string route)
1520
{
1621
builder.Route = route;
1722
return builder;

0 commit comments

Comments
 (0)