73 lines
2.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|