/// <summary> /// Overrides the default order of compression from Smidge, since Brotli is super slow (~10 seconds for backoffice.js) /// </summary> /// <param name="headers"></param> /// <returns></returns> public CompressionType GetClientCompression(IDictionary <string, StringValues> headers) { CompressionType type = CompressionType.None; if (headers is not IHeaderDictionary headerDictionary) { headerDictionary = new HeaderDictionary(headers.Count); foreach ((var key, StringValues stringValues) in headers) { headerDictionary[key] = stringValues; } } var acceptEncoding = headerDictionary.GetCommaSeparatedValues(HeaderNames.AcceptEncoding); if (acceptEncoding.Length > 0) { // Prefer in order: GZip, Deflate, Brotli. for (var i = 0; i < acceptEncoding.Length; i++) { var encoding = acceptEncoding[i].Trim(); var parsed = CompressionType.Parse(encoding); // Not pack200-gzip. if (parsed == CompressionType.GZip) { return(CompressionType.GZip); } if (parsed == CompressionType.Deflate) { type = CompressionType.Deflate; } // Brotli is typically last in the accept encoding header. if (type != CompressionType.Deflate && parsed == CompressionType.Brotli) { type = CompressionType.Brotli; } } } return(type); }