@@ -159,22 +159,21 @@ protected internal async Task<TrybeResponse<TResponse>> FetchAsync<TResponse>(
159
159
httpResp = await _http . SendAsync ( httpReq , cancellationToken )
160
160
. ConfigureAwait ( false ) ;
161
161
162
- var transformedResponse = await TransformResponse < TResponse > (
162
+ var ( transformedResponse , capturedResponseContent ) = await TransformResponse < TResponse > (
163
163
httpReq . Method ,
164
164
httpReq . RequestUri ,
165
165
httpResp )
166
166
. ConfigureAwait ( false ) ; ;
167
167
168
- if ( _settings . CaptureRequestContent && httpReq . Content is not null )
168
+ if ( ( _settings . CaptureRequestContent || ! httpResp . IsSuccessStatusCode ) && httpReq . Content is not null )
169
169
{
170
170
transformedResponse . RequestContent = await httpReq . Content . ReadAsStringAsync ( )
171
171
. ConfigureAwait ( false ) ; ;
172
172
}
173
173
174
- if ( _settings . CaptureResponseContent && httpResp . Content is not null )
174
+ if ( _settings . CaptureResponseContent || ! httpResp . IsSuccessStatusCode )
175
175
{
176
- transformedResponse . ResponseContent = await httpResp . Content . ReadAsStringAsync ( )
177
- . ConfigureAwait ( false ) ;
176
+ transformedResponse . ResponseContent = capturedResponseContent ;
178
177
}
179
178
180
179
return transformedResponse ;
@@ -219,22 +218,21 @@ protected internal async Task<TrybeResponse<TResponse>> FetchAsync<TRequest, TRe
219
218
httpResp = await _http . SendAsync ( httpReq , cancellationToken )
220
219
. ConfigureAwait ( false ) ;
221
220
222
- var transformedResponse = await TransformResponse < TResponse > (
221
+ var ( transformedResponse , capturedResponseContent ) = await TransformResponse < TResponse > (
223
222
httpReq . Method ,
224
223
httpReq . RequestUri ,
225
224
httpResp )
226
225
. ConfigureAwait ( false ) ; ;
227
226
228
- if ( _settings . CaptureRequestContent && httpReq . Content is not null )
227
+ if ( ( _settings . CaptureRequestContent || ! httpResp . IsSuccessStatusCode ) && httpReq . Content is not null )
229
228
{
230
229
transformedResponse . RequestContent = await httpReq . Content . ReadAsStringAsync ( )
231
- . ConfigureAwait ( false ) ;
230
+ . ConfigureAwait ( false ) ; ;
232
231
}
233
232
234
- if ( _settings . CaptureResponseContent && httpResp . Content is not null )
233
+ if ( _settings . CaptureResponseContent || ! httpResp . IsSuccessStatusCode )
235
234
{
236
- transformedResponse . ResponseContent = await httpResp . Content . ReadAsStringAsync ( )
237
- . ConfigureAwait ( false ) ;
235
+ transformedResponse . ResponseContent = capturedResponseContent ;
238
236
}
239
237
240
238
return transformedResponse ;
@@ -351,7 +349,7 @@ async Task<Error> GetTrybeError()
351
349
}
352
350
}
353
351
354
- protected internal async Task < TrybeResponse < TResponse > > TransformResponse < TResponse > (
352
+ protected internal async Task < ( TrybeResponse < TResponse > , string ? ) > TransformResponse < TResponse > (
355
353
HttpMethod method ,
356
354
Uri uri ,
357
355
HttpResponseMessage response ,
@@ -386,15 +384,31 @@ async Task<Error> GetTrybeError()
386
384
387
385
var rateLimiting = GetRateLimiting ( response ) ;
388
386
387
+ Stream ? content = null ;
388
+ string ? stringContent = null ;
389
+ if ( response . Content is not null )
390
+ {
391
+ if ( _settings . CaptureResponseContent || ! response . IsSuccessStatusCode )
392
+ {
393
+ stringContent = await response . Content . ReadAsStringAsync ( )
394
+ . ConfigureAwait ( false ) ;
395
+ }
396
+ else
397
+ {
398
+ content = await response . Content . ReadAsStreamAsync ( )
399
+ . ConfigureAwait ( false ) ;
400
+ }
401
+ }
402
+
389
403
if ( response . IsSuccessStatusCode )
390
404
{
391
405
DataContainer < TResponse > ? data = default ;
392
406
Meta ? meta = default ;
393
- if ( response . Content is not null )
407
+ if ( content is not null )
394
408
{
395
- data = await response . Content . ReadFromJsonAsync < DataContainer < TResponse > > (
396
- _deserializerOptions , cancellationToken )
397
- . ConfigureAwait ( false ) ; ;
409
+ data = stringContent is { Length : > 0 }
410
+ ? JsonSerializer . Deserialize < DataContainer < TResponse > > ( stringContent , _deserializerOptions )
411
+ : await JsonSerializer . DeserializeAsync < DataContainer < TResponse > > ( content , _deserializerOptions ) . ConfigureAwait ( false ) ;
398
412
399
413
if ( data ? . Meta is not null )
400
414
{
@@ -408,29 +422,29 @@ async Task<Error> GetTrybeError()
408
422
}
409
423
}
410
424
411
- return new TrybeResponse < TResponse > (
425
+ return ( new TrybeResponse < TResponse > (
412
426
method ,
413
427
uri ,
414
428
response . IsSuccessStatusCode ,
415
429
response . StatusCode ,
416
430
data : data ? . Data ,
417
431
meta : meta ,
418
432
rateLimiting : rateLimiting
419
- ) ;
433
+ ) , stringContent ) ;
420
434
}
421
435
else
422
436
{
423
437
Error ? error = await GetTrybeError ( )
424
438
. ConfigureAwait ( false ) ;
425
439
426
- return new TrybeResponse < TResponse > (
440
+ return ( new TrybeResponse < TResponse > (
427
441
method ,
428
442
uri ,
429
443
response . IsSuccessStatusCode ,
430
444
response . StatusCode ,
431
445
rateLimiting : rateLimiting ,
432
446
error : error
433
- ) ;
447
+ ) , stringContent ) ;
434
448
}
435
449
}
436
450
0 commit comments