Advertisement
dotMorten

WinRT HttpClient with GZIP and Deflate support

Mar 15th, 2012
2,984
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.72 KB | None | 0 0
  1. using System;
  2. using System.Net.Http;
  3. using System.Net.Http.Headers;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6.  
  7. namespace SharpGIS
  8. {
  9.     public class GZipHttpClient : HttpClient
  10.     {
  11.         private static readonly StringWithQualityHeaderValue gzip = StringWithQualityHeaderValue.Parse("gzip");
  12.         private static readonly StringWithQualityHeaderValue deflate = StringWithQualityHeaderValue.Parse("deflate");
  13.  
  14.         public GZipHttpClient() : base(new CompressedHttpMessageHandler())
  15.         {
  16.         }
  17.         public GZipHttpClient(HttpMessageHandler handler)
  18.         {
  19.             throw new NotSupportedException();
  20.         }
  21.  
  22.         private sealed class CompressedHttpMessageHandler : System.Net.Http.HttpClientHandler
  23.         {
  24.             public override bool SupportsAutomaticDecompression
  25.             {
  26.                 get { return true; }
  27.             }
  28.             protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
  29.             {
  30.                 if (!request.Headers.Contains(gzip.Value))
  31.                     request.Headers.AcceptEncoding.Add(gzip);
  32.                 if(!request.Headers.Contains(deflate.Value))
  33.                     request.Headers.AcceptEncoding.Add(deflate);
  34.                 var result = await base.SendAsync(request, cancellationToken);
  35.                 if(result.Content.Headers.ContentEncoding.Contains(gzip.Value) ||
  36.                     result.Content.Headers.ContentEncoding.Contains(deflate.Value))
  37.                 {
  38.                     result.Content = new CompressedHttpContent(result.Content);
  39.                 }
  40.                 return result;
  41.             }
  42.         }
  43.         private sealed class CompressedHttpContent : HttpContent
  44.         {
  45.             HttpContent _content;
  46.             public CompressedHttpContent(HttpContent content)
  47.             {
  48.                 _content = content;
  49.  
  50.             }
  51.             private async Task<System.IO.Stream> CreateDeflateStream()
  52.             {
  53.                 var stream = await _content.ReadAsStreamAsync();
  54.                 if (_content.Headers.ContentEncoding.Contains(gzip.Value))
  55.                     return new System.IO.Compression.GZipStream(stream, System.IO.Compression.CompressionMode.Decompress);
  56.                 else if (_content.Headers.ContentEncoding.Contains(deflate.Value))
  57.                     return new System.IO.Compression.DeflateStream(stream, System.IO.Compression.CompressionMode.Decompress);
  58.                 else
  59.                     throw new NotSupportedException("Compression type not supported or stream isn't compressed");
  60.             }
  61.             protected override Task<System.IO.Stream> CreateContentReadStreamAsync()
  62.             {
  63.                 return CreateDeflateStream();
  64.             }
  65.             protected override async Task SerializeToStreamAsync(System.IO.Stream stream, System.Net.TransportContext context)
  66.             {
  67.                 var deflateStream = await CreateDeflateStream();
  68.                 deflateStream.CopyTo(stream);
  69.             }
  70.             protected override void Dispose(bool disposing)
  71.             {
  72.                 _content.Dispose();
  73.             }
  74.             protected override bool TryComputeLength(out long length)
  75.             {
  76.                 length = 0;
  77.                 return false;
  78.             }
  79.         }
  80.     }
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement