Skip to content

Commit

Permalink
call EnsureSuccessStatusCode for HttpResponseMessage;
Browse files Browse the repository at this point in the history
  • Loading branch information
stratosblue committed Jun 11, 2022
1 parent 3627891 commit 787cf3a
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 32 deletions.
4 changes: 0 additions & 4 deletions .github/workflows/PublishNugetPackage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,8 @@ jobs:
- uses: actions/checkout@v2
- name: Setup .NET Core SDK
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.x
- uses: actions/setup-dotnet@v1
with:
dotnet-version: '6.0.x'
include-prerelease: true
- name: restore dependencies
run: dotnet restore
- name: build
Expand Down
8 changes: 8 additions & 0 deletions Cuture.Http.sln
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{7919F974
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A0B881FB-EC00-4AEC-BA79-E96D4B6D43C8}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "github", "github", "{825B9007-9121-440C-9A2A-BC7128BB9F78}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{2E74B385-B74D-46BC-A7E5-2C3CD6433879}"
ProjectSection(SolutionItems) = preProject
.github\workflows\PublishNugetPackage.yml = .github\workflows\PublishNugetPackage.yml
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -47,6 +54,7 @@ Global
{3456EFFC-BC71-4B15-806F-52986D81B541} = {A0B881FB-EC00-4AEC-BA79-E96D4B6D43C8}
{D0923D42-8D04-48D8-88B9-1B652735CEDB} = {7919F974-50C9-4046-90D8-0869B72752D2}
{74200310-7C28-41F8-9484-4F27A59820FB} = {7919F974-50C9-4046-90D8-0869B72752D2}
{2E74B385-B74D-46BC-A7E5-2C3CD6433879} = {825B9007-9121-440C-9A2A-BC7128BB9F78}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {51BA2EAC-5B89-4D64-9A32-C1662333F156}
Expand Down
17 changes: 13 additions & 4 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Install-Package Cuture.Http

1. 创建请求
```C#
var request = "http://www.domain.com/api".ToHttpRequest();
var request = "http://www.domain.com/api".CreateHttpRequest();
```

2. 设置请求
Expand Down Expand Up @@ -54,24 +54,33 @@ Console.WriteLine($"response:{response.Data}");

### 获取网页数据
```C#
var response = await "http://www.baidu.com".ToHttpRequest()
var response = await "http://www.baidu.com".CreateHttpRequest()
.GetAsStringAsync();
Console.WriteLine(response);
```
### 获取并解析接口数据
```C#
var url = "https://docs.microsoft.com/api/privacy/cookieConsent?locale=zh-cn";
var response = await url.ToHttpRequest()
var response = await url.CreateHttpRequest()
.GetAsJsonDocumentAsync();
Console.WriteLine(response["message"]["message"]);
```
-------
使用 `dynamic`:
```C#
var url = "https://docs.microsoft.com/api/privacy/cookieConsent?locale=zh-cn";
var response = await url.CreateHttpRequest()
.GetAsDynamicJsonAsync();
Console.WriteLine(response.message.message);
```

### 需要进度的下载
```C#
var url = "https://download.visualstudio.microsoft.com/download/pr/a16689d1-0872-4ef9-a592-406d3038d8f7/cf4f84504385a599f0cb6a5c113ccb34/aspnetcore-runtime-3.1.0-win-x64.exe";
try
{
using var stream = File.OpenWrite("d:\\runtime.exe");
await url.ToHttpRequest()
await url.CreateHttpRequest()
.DownloadToStreamWithProgressAsync((contentLength, downloaded) =>
{
if (contentLength > 0)
Expand Down
66 changes: 44 additions & 22 deletions src/Cuture.Http/Extensions/HttpResponseMessageExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,10 @@ public static async Task<HttpRequestExecuteState> WrapAsExecuteState(this Task<H
public static async Task<byte[]> ReceiveAsBytesAsync(this Task<HttpRequestExecuteState> requestTask, CancellationToken cancellationToken = default)
{
using var executeState = await requestTask.ConfigureAwait(false);
return await executeState.HttpResponseMessage.Content.ReadAsByteArrayAsync(cancellationToken).ConfigureAwait(false);
return await executeState.HttpResponseMessage.EnsureSuccessStatusCode()
.Content
.ReadAsByteArrayAsync(cancellationToken)
.ConfigureAwait(false);
}

/// <summary>
Expand All @@ -60,8 +63,12 @@ public static async Task<HttpOperationResult<byte[]>> TryReceiveAsBytesAsync(thi
try
{
using var executeState = await requestTask.ConfigureAwait(false);
result.ResponseMessage = executeState.HttpResponseMessage;
result.Data = await result.ResponseMessage.Content.ReadAsByteArrayAsync(cancellationToken).ConfigureAwait(false);

var responseMessage = executeState.HttpResponseMessage;
result.ResponseMessage = responseMessage;
responseMessage.EnsureSuccessStatusCode();

result.Data = await responseMessage.Content.ReadAsByteArrayAsync(cancellationToken).ConfigureAwait(false);
}
catch (Exception ex)
{
Expand All @@ -84,7 +91,10 @@ public static async Task<HttpOperationResult<byte[]>> TryReceiveAsBytesAsync(thi
public static async Task<string> ReceiveAsStringAsync(this Task<HttpRequestExecuteState> requestTask, CancellationToken cancellationToken = default)
{
using var executeState = await requestTask.ConfigureAwait(false);
return await executeState.HttpResponseMessage.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
return await executeState.HttpResponseMessage.EnsureSuccessStatusCode()
.Content
.ReadAsStringAsync(cancellationToken)
.ConfigureAwait(false);
}

/// <summary>
Expand All @@ -100,8 +110,12 @@ public static async Task<HttpOperationResult<string>> TryReceiveAsStringAsync(th
try
{
using var executeState = await requestTask.ConfigureAwait(false);
result.ResponseMessage = executeState.HttpResponseMessage;
result.Data = await result.ResponseMessage.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);

var responseMessage = executeState.HttpResponseMessage;
result.ResponseMessage = responseMessage;
responseMessage.EnsureSuccessStatusCode();

result.Data = await responseMessage.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
}
catch (Exception ex)
{
Expand All @@ -125,7 +139,9 @@ public static async Task<HttpOperationResult<string>> TryReceiveAsStringAsync(th
public static async Task<JsonDocument?> ReceiveAsJsonDocumentAsync(this Task<HttpRequestExecuteState> requestTask, JsonDocumentOptions jsonDocumentOptions = default, CancellationToken cancellationToken = default)
{
using var executeState = await requestTask.ConfigureAwait(false);
return await executeState.HttpResponseMessage.ReceiveAsJsonDocumentAsync(jsonDocumentOptions, cancellationToken).ConfigureAwait(false);
return await executeState.HttpResponseMessage.EnsureSuccessStatusCode()
.ReceiveAsJsonDocumentAsync(jsonDocumentOptions, cancellationToken)
.ConfigureAwait(false);
}

/// <summary>
Expand All @@ -144,15 +160,17 @@ public static async Task<TextHttpOperationResult<JsonDocument>> TryReceiveAsJson
{
using var executeState = await requestTask.ConfigureAwait(false);

result.ResponseMessage = executeState.HttpResponseMessage;
var responseMessage = executeState.HttpResponseMessage;
result.ResponseMessage = responseMessage;
responseMessage.EnsureSuccessStatusCode();

if (!textRequired)
{
result.Data = await result.ResponseMessage.ReceiveAsJsonDocumentAsync(jsonDocumentOptions, cancellationToken).ConfigureAwait(false);
result.Data = await responseMessage.ReceiveAsJsonDocumentAsync(jsonDocumentOptions, cancellationToken).ConfigureAwait(false);
}
else
{
var json = await result.ResponseMessage.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
var json = await responseMessage.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
result.Text = json;

if (!string.IsNullOrEmpty(json))
Expand Down Expand Up @@ -186,7 +204,9 @@ public static async Task<TextHttpOperationResult<JsonDocument>> TryReceiveAsJson
public static async Task<T?> ReceiveAsObjectAsync<T>(this Task<HttpRequestExecuteState> requestTask, ISerializer<string>? serializer = null, CancellationToken cancellationToken = default)
{
using var executeState = await requestTask.ConfigureAwait(false);
return await executeState.HttpResponseMessage.ReceiveAsObjectAsync<T>(serializer ?? HttpRequestGlobalOptions.DefaultJsonSerializer, cancellationToken).ConfigureAwait(false);
return await executeState.HttpResponseMessage.EnsureSuccessStatusCode()
.ReceiveAsObjectAsync<T>(serializer ?? HttpRequestGlobalOptions.DefaultJsonSerializer, cancellationToken)
.ConfigureAwait(false);
}

/// <summary>
Expand All @@ -208,15 +228,17 @@ public static async Task<TextHttpOperationResult<T>> TryReceiveAsObjectAsync<T>(
{
using var executeState = await requestTask.ConfigureAwait(false);

result.ResponseMessage = executeState.HttpResponseMessage;

var responseMessage = executeState.HttpResponseMessage;
result.ResponseMessage = responseMessage;
responseMessage.EnsureSuccessStatusCode();

if (!textRequired)
{
result.Data = await result.ResponseMessage.ReceiveAsObjectAsync<T>(serializer, cancellationToken).ConfigureAwait(false);
result.Data = await responseMessage.ReceiveAsObjectAsync<T>(serializer, cancellationToken).ConfigureAwait(false);
}
else
{
var json = await result.ResponseMessage.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
var json = await responseMessage.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
result.Text = json;

if (!string.IsNullOrEmpty(json))
Expand Down Expand Up @@ -271,7 +293,7 @@ public static async Task<TextHttpOperationResult<T>> TryReceiveAsObjectAsync<T>(

using var executeState = await requestTask.ConfigureAwait(false);

using var response = executeState.HttpResponseMessage;
using var response = executeState.HttpResponseMessage.EnsureSuccessStatusCode();

var contentLength = response.Content.Headers.ContentLength;

Expand Down Expand Up @@ -342,7 +364,7 @@ public static async Task<TextHttpOperationResult<T>> TryReceiveAsObjectAsync<T>(

using var executeState = await requestTask.ConfigureAwait(false);

using var response = executeState.HttpResponseMessage;
using var response = executeState.HttpResponseMessage.EnsureSuccessStatusCode();

var contentLength = response.Content.Headers.ContentLength;

Expand Down Expand Up @@ -443,7 +465,7 @@ public static async Task<TextHttpOperationResult<T>> TryReceiveAsObjectAsync<T>(

using var executeState = await requestTask.ConfigureAwait(false);

using var response = executeState.HttpResponseMessage;
using var response = executeState.HttpResponseMessage.EnsureSuccessStatusCode();

var contentLength = response.Content.Headers.ContentLength;

Expand Down Expand Up @@ -582,7 +604,7 @@ public static string GetCookie(this HttpResponseMessage responseMessage)
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static async Task<byte[]> ReceiveAsBytesAsync(this HttpResponseMessage responseMessage, CancellationToken cancellationToken = default)
{
using (responseMessage)
using (responseMessage.EnsureSuccessStatusCode())
{
return await responseMessage.Content.ReadAsByteArrayAsync(cancellationToken).ConfigureAwait(false);
}
Expand All @@ -600,7 +622,7 @@ public static async Task<byte[]> ReceiveAsBytesAsync(this HttpResponseMessage re
JsonDocumentOptions jsonDocumentOptions = default,
CancellationToken cancellationToken = default)
{
using (responseMessage)
using (responseMessage.EnsureSuccessStatusCode())
{
using var stream = await responseMessage.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
return await JsonDocument.ParseAsync(stream, jsonDocumentOptions, cancellationToken).ConfigureAwait(false);
Expand All @@ -620,7 +642,7 @@ public static async Task<byte[]> ReceiveAsBytesAsync(this HttpResponseMessage re
ISerializer<string>? serializer = null,
CancellationToken cancellationToken = default)
{
using (responseMessage)
using (responseMessage.EnsureSuccessStatusCode())
{
using var stream = await responseMessage.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
return await (serializer ?? HttpRequestGlobalOptions.DefaultJsonSerializer).DeserializeAsync<T>(stream, cancellationToken).ConfigureAwait(false);
Expand All @@ -636,7 +658,7 @@ public static async Task<byte[]> ReceiveAsBytesAsync(this HttpResponseMessage re
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static async Task<string> ReceiveAsStringAsync(this HttpResponseMessage responseMessage, CancellationToken cancellationToken = default)
{
using (responseMessage)
using (responseMessage.EnsureSuccessStatusCode())
{
return await responseMessage.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,9 @@ public static async Task<HttpRequestExecuteState> ExecuteAsync(this IHttpRequest
? messageInvoker.InternalExecuteWithAutoRedirectCoreAsync(httpRequestMessage, request.MaxAutomaticRedirections, cancellationToken)
: messageInvoker.SendAsync(httpRequestMessage, cancellationToken);

var result = await task.ConfigureAwait(false);
var responseMessage = await task.ConfigureAwait(false);

return new(result, invokerOwner);
return new(responseMessage, invokerOwner);
}
catch
{
Expand Down

0 comments on commit 787cf3a

Please sign in to comment.