| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | using System; |
| | using System.IO; |
| | using System.IO.Compression; |
| | using System.Linq; |
| | using System.Net.Http; |
| | using System.Net.Http.Headers; |
| | using System.Threading; |
| | using System.Threading.Tasks; |
| |
|
| | namespace Google.Apis.Http |
| | { |
| | |
| | |
| | |
| | internal sealed class GzipDeflateHandler : DelegatingHandler |
| | { |
| | private const string GzipEncoding = "gzip"; |
| | private const string DeflateEncoding = "deflate"; |
| |
|
| | private static readonly StringWithQualityHeaderValue s_gzipAcceptHeader = |
| | new StringWithQualityHeaderValue(GzipEncoding); |
| | private static readonly StringWithQualityHeaderValue s_deflateAcceptHeader = |
| | new StringWithQualityHeaderValue(DeflateEncoding); |
| | |
| | private static readonly Func<Stream, Stream> s_gzipReplacement = |
| | original => new GZipStream(original, CompressionMode.Decompress); |
| |
|
| | private static readonly Func<Stream, Stream> s_deflateReplacement = |
| | original => new DeflateStream(original, CompressionMode.Decompress); |
| | |
| | internal GzipDeflateHandler(HttpMessageHandler innerHandler) : base(innerHandler) |
| | { |
| | } |
| |
|
| | protected override async Task<HttpResponseMessage> SendAsync( |
| | HttpRequestMessage request, CancellationToken cancellationToken) |
| | { |
| | request.Headers.AcceptEncoding.Add(s_gzipAcceptHeader); |
| | request.Headers.AcceptEncoding.Add(s_deflateAcceptHeader); |
| |
|
| | var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); |
| | var originalContent = response.Content; |
| | var lastContentEncoding = originalContent.Headers.ContentEncoding.LastOrDefault(); |
| |
|
| | Func<Stream, Stream> replacement = |
| | lastContentEncoding == GzipEncoding ? s_gzipReplacement |
| | : lastContentEncoding == DeflateEncoding ? s_deflateReplacement |
| | : null; |
| |
|
| | if (replacement != null) |
| | { |
| | response.Content = new StreamReplacingHttpContent(originalContent, replacement); |
| | var headers = response.Content.Headers; |
| | |
| | headers.ContentLength = null; |
| | |
| | |
| | headers.ContentEncoding.Clear(); |
| | string previous = null; |
| | foreach (var encoding in originalContent.Headers.ContentEncoding) |
| | { |
| | if (previous != null) |
| | { |
| | headers.ContentEncoding.Add(previous); |
| | } |
| | previous = encoding; |
| | } |
| | } |
| | return response; |
| | } |
| | } |
| | } |
| |
|