ASP.NET Core : supporter le contenu compressé

ASP.NET Core : supporter le contenu compressé

Dans l’article précédent, nous avions vu comment activer la compression des réponses, dans cet article nous allons voir comment accepter des requêtes dont le contenu est compressé.

ASP.Net Core ne fournit aucune classe built-in pour supporter ce scénario. Mais heureusement celui-ci est assez flexible pour ajouter ce comportement en quelques lignes.
L’idée est décompresser le body des requêtes qui ont comme entête Content-Encoding avec les valeurs gzip, deflate ou br.

    public class CompressionMiddleware
    {
        private readonly RequestDelegate _next;

        public CompressionMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            // Récupération de l'entête Content-Encoding.
            var content = context.Request.Headers["Content-Encoding"];
            if (!string.IsNullOrWhiteSpace(content) && context.Request.Body != null)
            {
                if (content.Contains("gzip"))
                {
                    // On remplace le stream par un stream Gzip
                    context.Request.Body = new GZipStream(context.Request.Body, CompressionMode.Decompress);
                }
                else if (content.Contains("br"))
                {
                    // On remplace le stream par un stream Brotli
                    context.Request.Body = new BrotliStream(context.Request.Body, CompressionMode.Decompress);
                }
                else if (content.Contains("deflate"))
                {
                    // On remplace le stream par un stream deflate
                    context.Request.Body = new DeflateStream(context.Request.Body, CompressionMode.Decompress);
                }
            }

            await _next(context);
        }
    }

Une fois le middleware défini, il faut l’ajouter dans la méthode Configure de la classe Startup

            app.UseMiddleware<CompressionMiddleware>();

Happy coding !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Pin It on Pinterest