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.
get_cookie(ctx, name string) Cookie
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)
}
set_cookie(ctx, cookie Cookie)
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.