Files
2026-07-03 05:02:26 +03:00

73 lines
2.2 KiB
C#

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;
}
}
}