123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- using Best.HTTP.Shared;
- using Best.HTTP.Shared.Logger;
- using Best.HTTP.Shared.PlatformSupport.Text;
- namespace Best.HTTP.Response.Decompression
- {
- public static class DecompressorFactory
- {
- public const int MinLengthToDecompress = 256;
- // cached header value
- private static string AcceptEncoding = null;
- public static void SetupHeaders(HTTPRequest request)
- {
- if (!request.HasHeader("Accept-Encoding"))
- {
- if (AcceptEncoding == null)
- {
- var sb = StringBuilderPool.Get(4);
- if (BrotliDecompressor.IsSupported())
- sb.Append("br, ");
- if (GZipDecompressor.IsSupported)
- sb.Append("gzip, ");
- if (DeflateDecompressor.IsSupported)
- sb.Append("deflate, ");
- sb.Append("identity");
- AcceptEncoding = StringBuilderPool.ReleaseAndGrab(sb);
- }
- request.AddHeader("Accept-Encoding", AcceptEncoding);
- }
- }
- public static IDecompressor GetDecompressor(string encoding, LoggingContext context)
- {
- if (encoding == null)
- return null;
- switch (encoding.ToLowerInvariant())
- {
- // https://github.com/Benedicht/BestHTTP-Issues/issues/183
- case "none":
- case "identity":
- case "utf-8":
- break;
- case "gzip": return new GZipDecompressor(MinLengthToDecompress);
- case "deflate": return new DeflateDecompressor(MinLengthToDecompress);
- case "br":
- if (BrotliDecompressor.IsSupported())
- return new BrotliDecompressor(MinLengthToDecompress);
- else
- goto default;
- default:
- HTTPManager.Logger.Warning(nameof(DecompressorFactory), $"GetDecompressor - unsupported encoding '{encoding}'!", context);
- break;
- }
- return null;
- }
- }
- }
|