msgraph-sdk-dotnet
msgraph-sdk-dotnet copied to clipboard
Response content in custom RetryHandler remains compressed
Describe the bug
When trying to read response content within custom RetryHandler, it remains compressed and needs to be manually decompressed. Default compression handler is called after it and it gets decompressed too late.
Expected behavior
Content should be already decompressed in custom RetryHandler
How to reproduce
Graph client initialization:
HttpClientHandler httpClientHandler = new HttpClientHandler();
CustomRetryHandler customRetryHandler = new CustomRetryHandler(httpClientHandler);
var handlers = GraphClientFactory.CreateDefaultHandlers();
var defaultRetryHandler = handlers.Where(h => h is RetryHandler).FirstOrDefault();
var retryHandlerIndex = handlers.IndexOf(defaultRetryHandler);
handlers.Remove(defaultRetryHandler);
handlers[retryHandlerIndex] = customRetryHandler;
var httpClient = GraphClientFactory.Create(handlers);
_graphServiceClient = new GraphServiceClient(httpClient, onBehalfOfCredential, scopes);
Custom RetryHandler where the problem is:
public class CustomRetryHandler : DelegatingHandler
{
private readonly int _maxRetries;
private readonly TimeSpan _baseDelay;
public CustomRetryHandler(HttpMessageHandler innerHandler, int maxRetries = 5, TimeSpan? baseDelay = null)
: base(innerHandler)
{
_maxRetries = maxRetries;
_baseDelay = baseDelay ?? TimeSpan.FromSeconds(4);
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
response = await base.SendAsync(request, cancellationToken);
var content = response.Content // COMPRESSED
Content here is compressed and it requires manual decompression like below, which I think should not be necessary?
using (var compressedStream = new MemoryStream(response.Content.ReadAsByteArrayAsync().Result))
using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
using (var resultStream = new MemoryStream())
{
zipStream.CopyTo(resultStream);
resultStream.Position = 0;
var streamArray = resultStream.ToArray();
var stringFromStream = System.Text.Encoding.Default.GetString(streamArray);
var odataError = JsonConvert.DeserializeObject<ODataError>(stringFromStream);
}
}
SDK Version
5.53.0
Latest version known to work for scenario above?
No response
Known Workarounds
Manual decompression
Debug output
Click to expand log
```</details>
### Configuration
_No response_
### Other information
The problem seems to be order of handlers execution, default CompressionHandler gets called after RetryHandler. The default order of handlers is:
CompressionHandler
UriReplacementHandler`1[Microsoft.Kiota.Http.HttpClientLibrary.Middleware.Options.UriReplacementHandlerOption]
CustomRetryHandler (this is the same place as default RetryHandler)
ParametersNameDecodingHandler
UserAgentHandler
HeadersInspectionHandler
TelemetryHandler