bouncer/doc/fr/references/layers/rewriter.md
2024-09-25 15:52:49 +02:00

6.7 KiB

Layer "Rewriter"

Description

Ce layer permet de modifier dynamiquement certains attributs de requêtes/réponses transitant par le proxy.

Type

rewriter

Schéma des options

Les options disponibles pour le layer sont décrites via un schéma JSON. Elles sont documentées dans le schéma visible ici.

Moteur de règles

Les options rules.request et rules.response permettent de définir des listes de règles utilisant un DSL modifiant de manière dynamique les attributs des requêtes/réponses transitant par le proxy.

Les listes d'instructions sont exécutées séquentiellement.

Bouncer utilise le projet expr comme DSL. En plus des fonctionnalités natives du langage, Bouncer ajoute un certain nombre de fonctions spécifiques au contexte d'utilisation.

Fonctions

Communes

add_header(ctx, name string, value string)

Ajouter une valeur à un entête HTTP via son nom name et sa valeur value.

set_header(ctx, name string, value string)

Définir la valeur d'un entête HTTP via son nom name et sa valeur value. La valeur précédente est écrasée.

del_headers(ctx, pattern string)

Supprimer un ou plusieurs entêtes HTTP dont le nom correspond au patron pattern.

Le patron est défini par une chaîne comprenant un ou plusieurs caractères *, signifiant un ou plusieurs caractères arbitraires.

Récupère un cookie depuis la requête/réponse (en fonction du contexte d'utilisation). Retourne nil si le cookie n'existe pas.

Cookie

// Plus d'informations sur https://pkg.go.dev/net/http#Cookie
{
  name: "string", // Nom du cookie
  value: "string", // Valeur associée au cookie
  path: "string", // Chemin associé au cookie (présent uniquement dans un contexte de réponse)
  domain: "string", // Domaine associé au cookie (présent uniquement dans un contexte de réponse)
  expires: "string", // Date d'expiration du cookie (présent uniquement dans un contexte de réponse)
  max_age: "string", // Age maximum du cookie (présent uniquement dans un contexte de réponse)
  secure: "boolean", // Le cookie doit-il être présent uniquement en HTTPS ? (présent uniquement dans un contexte de réponse)
  http_only: "boolean", // Le cookie est il accessible en Javascript ? (présent uniquement dans un contexte de réponse)
  same_site: "int" // Voir https://pkg.go.dev/net/http#SameSite (présent uniquement dans un contexte de réponse)
}

Définit un cookie sur la requête/réponse (en fonction du contexte d'utilisation). Voir la méthode get_cookie() pour voir les attributs potentiels.

Requête

set_host(ctx, host string)

Modifier la valeur de l'entête Host de la requête.

set_url(ctx, url string)

Modifier l'URL du serveur cible.

redirect(ctx, statusCode int, url string)

Interrompt la requête et retourne une redirection HTTP au client.

Le code HTTP utilisé doit être supérieur ou égale à 300 et inférieur à 400 (non inclus).

Réponse

Pas de fonctions spécifiques.

Environnement

Les règles ont accès aux variables suivantes pendant leur exécution. Ces données sont en lecture seule.

Requête

vars.original_url

L'URL originale, avant réécriture du Host par Bouncer.

{
    scheme: "string", // Schéma HTTP de l'URL
    opaque: "string", // Données opaque de l'URL
    user: { // Identifiants d'URL (Basic Auth)
        username: "",
        password: ""
    },
    host: "string", // Nom d'hôte (<domaine>:<port>) de l'URL
    path: "string", // Chemin de l'URL (format assaini)
    raw_path: "string", // Chemin de l'URL (format brut)
    raw_query: "string", // Variables d'URL (format brut)
    fragment : "string", // Fragment d'URL (format assaini)
    raw_fragment : "string" // Fragment d'URL (format brut)
}
vars.request

La requête en cours de traitement.

{
    method: "string", // Méthode HTTP
    host: "string", // Nom d'hôte (`Host`) associé à la requête
    url: { // URL associée à la requête sous sa forme structurée
        scheme: "string", // Schéma HTTP de l'URL
        opaque: "string", // Données opaque de l'URL
        user: { // Identifiants d'URL (Basic Auth)
            username: "",
            password: ""
        },
        host: "string", // Nom d'hôte (<domaine>:<port>) de l'URL
        path: "string", // Chemin de l'URL (format assaini)
        raw_path: "string", // Chemin de l'URL (format brut)
        raw_query: "string", // Variables d'URL (format brut)
        fragment : "string", // Fragment d'URL (format assaini)
        raw_fragment : "string" // Fragment d'URL (format brut)
    },
    raw_url: "string", // URL associée à la requête (format assaini)
    proto: "string", // Numéro de version du protocole utilisé
    proto_major: "int", // Numéro de version majeure du protocole utilisé
    proto_minor: "int",  // Numéro de version mineur du protocole utilisé
    header: { // Table associative des entêtes HTTP associés à la requête
        "string": ["string"]
    },
    content_length: "int", // Taille du corps de la requête
    transfer_encoding: ["string"], // MIME-Type(s) d'encodage du corps de la requête
    trailer: { // Table associative des entêtes HTTP associés à la requête, transmises après le corps de la requête
        "string": ["string"]
    },
    remote_addr: "string", // Adresse du client HTTP à l'origine de la requête
    request_uri: "string" // URL "brute" associée à la requêtes (avant opérations d'assainissement, utiliser "url" plutôt)
}

Réponse

vars.response

La réponse en cours de traitement.

{
    status_code: "int", // Code de statut de la réponse
    status: "string", // Message associé au code de statut
    proto: "string", // Numéro de version du protocole utilisé
    proto_major: "int", // Numéro de version majeure du protocole utilisé
    proto_minor: "int",  // Numéro de version mineur du protocole utilisé
    header: { // Table associative des entêtes HTTP associés à la requête
        "string": ["string"]
    },
    content_length: "int", // Taille du corps de la réponse
    transfer_encoding: ["string"], // MIME-Type(s) d'encodage du corps de la requête
    trailer: { // Table associative des entêtes HTTP associés à la requête, transmises après le corps de la requête
        "string": ["string"]
    },
}
vars.request

Voir section précédente.

vars.original_url

Voir section précédente.

Métriques

Pas de métriques spécifiques.