diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/WechatAdsClient.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/WechatAdsClient.cs index da301aca..4ab17e2d 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Ads/WechatAdsClient.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/WechatAdsClient.cs @@ -1,8 +1,8 @@ using System; using System.Collections.ObjectModel; using System.Linq; -using System.Net; using System.Net.Http; +using System.Text; using System.Threading; using System.Threading.Tasks; using Flurl.Http; @@ -121,14 +121,13 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads private async Task GetResposneAsync(IFlurlResponse flurlResponse) where T : WechatAdsResponse, new() { - string contentType = flurlResponse.Headers.GetAll("Content-Type").FirstOrDefault() ?? string.Empty; - string contentDisposition = flurlResponse.Headers.GetAll("Content-Disposition").FirstOrDefault() ?? string.Empty; - bool contentTypeIsNotJson = - (flurlResponse.StatusCode != (int)HttpStatusCode.OK) || - (!contentType.StartsWith("application/json") && !contentType.StartsWith("text/json")) || - (contentDisposition.StartsWith("attachment")); + byte[] bytes = await flurlResponse.GetBytesAsync().ConfigureAwait(false); + bool jsonable = bytes.Length > 1 && + (bytes[0] == 91 && bytes[bytes.Length - 1] == 93) || // "[...]" + (bytes[0] == 123 && bytes[bytes.Length - 1] == 125); // "{...}" + + T result = jsonable ? JsonSerializer.Deserialize(Encoding.UTF8.GetString(bytes)) : new T(); - T result = contentTypeIsNotJson ? new T() : await flurlResponse.GetJsonAsync().ConfigureAwait(false); result.RawStatus = flurlResponse.StatusCode; result.RawHeaders = new ReadOnlyDictionary( flurlResponse.Headers @@ -138,7 +137,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads v => string.Join(", ", v.Select(e => e.Value)) ) ); - result.RawBytes = await flurlResponse.ResponseMessage.Content.ReadAsByteArrayAsync().ConfigureAwait(false); + result.RawBytes = bytes; + return result; } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiClient.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiClient.cs index 975ea0db..ca8e5dd3 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiClient.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiClient.cs @@ -1,8 +1,8 @@ using System; using System.Collections.ObjectModel; using System.Linq; -using System.Net; using System.Net.Http; +using System.Text; using System.Threading; using System.Threading.Tasks; using Flurl.Http; @@ -110,12 +110,13 @@ namespace SKIT.FlurlHttpClient.Wechat.Api private async Task GetResposneAsync(IFlurlResponse flurlResponse) where T : WechatApiResponse, new() { - string contentType = flurlResponse.Headers.GetAll("Content-Type").FirstOrDefault() ?? string.Empty; - bool contentTypeIsNotJson = - (flurlResponse.StatusCode != (int)HttpStatusCode.OK) || - (!contentType.StartsWith("application/json") && !contentType.StartsWith("text/json") && !contentType.StartsWith("text/plain")); + byte[] bytes = await flurlResponse.GetBytesAsync().ConfigureAwait(false); + bool jsonable = bytes.Length > 1 && + (bytes[0] == 91 && bytes[bytes.Length - 1] == 93) || // "[...]" + (bytes[0] == 123 && bytes[bytes.Length - 1] == 125); // "{...}" + + T result = jsonable ? JsonSerializer.Deserialize(Encoding.UTF8.GetString(bytes)) : new T(); - T result = contentTypeIsNotJson ? new T() : await flurlResponse.GetJsonAsync().ConfigureAwait(false); result.RawStatus = flurlResponse.StatusCode; result.RawHeaders = new ReadOnlyDictionary( flurlResponse.Headers @@ -125,7 +126,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api v => string.Join(", ", v.Select(e => e.Value)) ) ); - result.RawBytes = await flurlResponse.ResponseMessage.Content.ReadAsByteArrayAsync().ConfigureAwait(false); + result.RawBytes = bytes; + return result; } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/WechatOpenAIPlatformClient.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/WechatOpenAIPlatformClient.cs index 70031aef..d8484c5b 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/WechatOpenAIPlatformClient.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/WechatOpenAIPlatformClient.cs @@ -1,8 +1,8 @@ using System; using System.Collections.ObjectModel; using System.Linq; -using System.Net; using System.Net.Http; +using System.Text; using System.Threading; using System.Threading.Tasks; using Flurl.Http; @@ -150,12 +150,13 @@ namespace SKIT.FlurlHttpClient.Wechat.OpenAI private async Task GetResposneAsync(IFlurlResponse flurlResponse) where T : WechatOpenAIPlatformResponse, new() { - string contentType = flurlResponse.Headers.GetAll("Content-Type").FirstOrDefault() ?? string.Empty; - bool contentTypeIsNotJson = - (flurlResponse.StatusCode != (int)HttpStatusCode.OK) || - (!contentType.StartsWith("application/json") && !contentType.StartsWith("text/json")); + byte[] bytes = await flurlResponse.GetBytesAsync().ConfigureAwait(false); + bool jsonable = bytes.Length > 1 && + (bytes[0] == 91 && bytes[bytes.Length - 1] == 93) || // "[...]" + (bytes[0] == 123 && bytes[bytes.Length - 1] == 125); // "{...}" + + T result = jsonable ? JsonSerializer.Deserialize(Encoding.UTF8.GetString(bytes)) : new T(); - T result = contentTypeIsNotJson ? new T() : await flurlResponse.GetJsonAsync().ConfigureAwait(false); result.RawStatus = flurlResponse.StatusCode; result.RawHeaders = new ReadOnlyDictionary( flurlResponse.Headers @@ -165,7 +166,8 @@ namespace SKIT.FlurlHttpClient.Wechat.OpenAI v => string.Join(", ", v.Select(e => e.Value)) ) ); - result.RawBytes = await flurlResponse.ResponseMessage.Content.ReadAsByteArrayAsync().ConfigureAwait(false); + result.RawBytes = bytes; + return result; } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/WechatOpenAIThirdPartyClient.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/WechatOpenAIThirdPartyClient.cs index bd009dcd..35d9d088 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/WechatOpenAIThirdPartyClient.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/WechatOpenAIThirdPartyClient.cs @@ -1,8 +1,8 @@ using System; using System.Collections.ObjectModel; using System.Linq; -using System.Net; using System.Net.Http; +using System.Text; using System.Threading; using System.Threading.Tasks; using Flurl.Http; @@ -127,12 +127,13 @@ namespace SKIT.FlurlHttpClient.Wechat.OpenAI private async Task GetResposneAsync(IFlurlResponse flurlResponse) where T : WechatOpenAIThirdPartyResponse, new() { - string contentType = flurlResponse.Headers.GetAll("Content-Type").FirstOrDefault() ?? string.Empty; - bool contentTypeIsNotJson = - (flurlResponse.StatusCode != (int)HttpStatusCode.OK) || - (!contentType.StartsWith("application/json") && !contentType.StartsWith("text/json")); + byte[] bytes = await flurlResponse.GetBytesAsync().ConfigureAwait(false); + bool jsonable = bytes.Length > 1 && + (bytes[0] == 91 && bytes[bytes.Length - 1] == 93) || // "[...]" + (bytes[0] == 123 && bytes[bytes.Length - 1] == 125); // "{...}" + + T result = jsonable ? JsonSerializer.Deserialize(Encoding.UTF8.GetString(bytes)) : new T(); - T result = contentTypeIsNotJson ? new T() : await flurlResponse.GetJsonAsync().ConfigureAwait(false); result.RawStatus = flurlResponse.StatusCode; result.RawHeaders = new ReadOnlyDictionary( flurlResponse.Headers @@ -142,7 +143,8 @@ namespace SKIT.FlurlHttpClient.Wechat.OpenAI v => string.Join(", ", v.Select(e => e.Value)) ) ); - result.RawBytes = await flurlResponse.ResponseMessage.Content.ReadAsByteArrayAsync().ConfigureAwait(false); + result.RawBytes = bytes; + return result; } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClient.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClient.cs index bd8c68bb..e46496dc 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClient.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClient.cs @@ -1,7 +1,6 @@ using System; using System.Collections.ObjectModel; using System.Linq; -using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Text; @@ -149,11 +148,10 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 private async Task GetResposneAsync(IFlurlResponse flurlResponse) where T : WechatTenpayResponse, new() { - string mediaType = flurlResponse.Headers.GetAll("Content-Type").FirstOrDefault() ?? "application/octet-stream"; - bool jsonable = (flurlResponse.StatusCode != (int)HttpStatusCode.NoContent) && - (mediaType.StartsWith("application/json") || !mediaType.StartsWith("text/json")); - byte[] bytes = await flurlResponse.GetBytesAsync().ConfigureAwait(false); + bool jsonable = bytes.Length > 1 && + (bytes[0] == 91 && bytes[bytes.Length - 1] == 93) || // "[...]" + (bytes[0] == 123 && bytes[bytes.Length - 1] == 125); // "{...}" T result = jsonable ? JsonSerializer.Deserialize(Encoding.UTF8.GetString(bytes)) : new T(); result.RawStatus = flurlResponse.StatusCode; diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/WechatWorkClient.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/WechatWorkClient.cs index 4600bd81..fd82f392 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Work/WechatWorkClient.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/WechatWorkClient.cs @@ -1,8 +1,8 @@ using System; using System.Collections.ObjectModel; using System.Linq; -using System.Net; using System.Net.Http; +using System.Text; using System.Threading; using System.Threading.Tasks; using Flurl.Http; @@ -111,14 +111,13 @@ namespace SKIT.FlurlHttpClient.Wechat.Work private async Task GetResposneAsync(IFlurlResponse flurlResponse) where T : WechatWorkResponse, new() { - string contentType = flurlResponse.Headers.GetAll("Content-Type").FirstOrDefault() ?? string.Empty; - string contentDisposition = flurlResponse.Headers.GetAll("Content-Disposition").FirstOrDefault() ?? string.Empty; - bool contentTypeIsNotJson = - (flurlResponse.StatusCode != (int)HttpStatusCode.OK) || - (!contentType.StartsWith("application/json") && !contentType.StartsWith("text/json") && !contentType.StartsWith("text/plain")) || - (contentDisposition.StartsWith("attachment")); + byte[] bytes = await flurlResponse.GetBytesAsync().ConfigureAwait(false); + bool jsonable = bytes.Length > 1 && + (bytes[0] == 91 && bytes[bytes.Length - 1] == 93) || // "[...]" + (bytes[0] == 123 && bytes[bytes.Length - 1] == 125); // "{...}" + + T result = jsonable ? JsonSerializer.Deserialize(Encoding.UTF8.GetString(bytes)) : new T(); - T result = contentTypeIsNotJson ? new T() : await flurlResponse.GetJsonAsync().ConfigureAwait(false); result.RawStatus = flurlResponse.StatusCode; result.RawHeaders = new ReadOnlyDictionary( flurlResponse.Headers @@ -128,7 +127,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Work v => string.Join(", ", v.Select(e => e.Value)) ) ); - result.RawBytes = await flurlResponse.ResponseMessage.Content.ReadAsByteArrayAsync().ConfigureAwait(false); + result.RawBytes = bytes; + return result; } }