Loupe

ASP.NET Core : supporter le contenu compressé dans la requête (2/2)

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 de décompresser le body des requêtes qui ont comme entête Content-Encoding avec les valeurs gzip, deflate ou br.
Si le client ne fournit aucune de ces 3 valeurs d'entête le contenu ne sera pas décompressé et sera traité comme d'habitude.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class RequestCompressionMiddleware
{
    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

1
app.UseMiddleware.<RequestCompressionMiddleware>();

Happy coding !

Pour aller plus loin

Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus