156 lines
5.2 KiB
Markdown
156 lines
5.2 KiB
Markdown
# 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](https://json-schema.org/specification). Elles sont documentées dans le [schéma visible ici](../../../../internal/proxy/director/layer/rewriter/layer-options.json).
|
|
|
|
## 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`](https://expr-lang.org/) 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.
|
|
|
|
#### 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.
|
|
|
|
#### 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.
|
|
|
|
```js
|
|
{
|
|
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)
|
|
rawPath: "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.
|
|
|
|
```js
|
|
{
|
|
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)
|
|
rawPath: "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.
|
|
|
|
```js
|
|
{
|
|
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._
|