DecompressorFactory.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using Best.HTTP.Shared;
  2. using Best.HTTP.Shared.Logger;
  3. using Best.HTTP.Shared.PlatformSupport.Text;
  4. namespace Best.HTTP.Response.Decompression
  5. {
  6. public static class DecompressorFactory
  7. {
  8. public const int MinLengthToDecompress = 256;
  9. // cached header value
  10. private static string AcceptEncoding = null;
  11. public static void SetupHeaders(HTTPRequest request)
  12. {
  13. if (!request.HasHeader("Accept-Encoding"))
  14. {
  15. if (AcceptEncoding == null)
  16. {
  17. var sb = StringBuilderPool.Get(4);
  18. if (BrotliDecompressor.IsSupported())
  19. sb.Append("br, ");
  20. if (GZipDecompressor.IsSupported)
  21. sb.Append("gzip, ");
  22. if (DeflateDecompressor.IsSupported)
  23. sb.Append("deflate, ");
  24. sb.Append("identity");
  25. AcceptEncoding = StringBuilderPool.ReleaseAndGrab(sb);
  26. }
  27. request.AddHeader("Accept-Encoding", AcceptEncoding);
  28. }
  29. }
  30. public static IDecompressor GetDecompressor(string encoding, LoggingContext context)
  31. {
  32. if (encoding == null)
  33. return null;
  34. switch (encoding.ToLowerInvariant())
  35. {
  36. // https://github.com/Benedicht/BestHTTP-Issues/issues/183
  37. case "none":
  38. case "identity":
  39. case "utf-8":
  40. break;
  41. case "gzip": return new GZipDecompressor(MinLengthToDecompress);
  42. case "deflate": return new DeflateDecompressor(MinLengthToDecompress);
  43. case "br":
  44. if (BrotliDecompressor.IsSupported())
  45. return new BrotliDecompressor(MinLengthToDecompress);
  46. else
  47. goto default;
  48. default:
  49. HTTPManager.Logger.Warning(nameof(DecompressorFactory), $"GetDecompressor - unsupported encoding '{encoding}'!", context);
  50. break;
  51. }
  52. return null;
  53. }
  54. }
  55. }