2024-06-25 14:03:49 +02:00
# 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
2024-09-24 15:46:42 +02:00
##### `add_header(ctx, name string, value string)`
2024-06-25 14:03:49 +02:00
Ajouter une valeur à un entête HTTP via son nom `name` et sa valeur `value` .
2024-09-24 15:46:42 +02:00
##### `set_header(ctx, name string, value string)`
2024-06-25 14:03:49 +02:00
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.
2024-09-24 15:46:42 +02:00
##### `del_headers(ctx, pattern string)`
2024-06-25 14:03:49 +02:00
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.
2024-09-25 15:50:13 +02:00
##### `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**
```js
// 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)
}
```
2024-10-21 13:48:07 +02:00
##### `add_cookie(ctx, cookie Cookie)`
2024-09-25 15:50:13 +02:00
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.
2024-06-25 14:03:49 +02:00
#### Requête
2024-09-24 15:46:42 +02:00
##### `set_host(ctx, host string)`
2024-06-25 14:03:49 +02:00
Modifier la valeur de l'entête `Host` de la requête.
2024-09-24 15:46:42 +02:00
##### `set_url(ctx, url string)`
2024-06-25 14:03:49 +02:00
Modifier l'URL du serveur cible.
2024-09-25 15:50:13 +02:00
##### `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).
2024-06-25 14:03:49 +02:00
#### 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
2024-09-24 15:46:42 +02:00
##### `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)
2024-09-25 15:50:13 +02:00
raw_path: "string", // Chemin de l'URL (format brut)
2024-09-24 15:46:42 +02:00
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`
2024-06-25 14:03:49 +02:00
La requête en cours de traitement.
```js
{
method: "string", // Méthode HTTP
host: "string", // Nom d'hôte (`Host`) associé à la requête
2024-06-28 10:46:38 +02:00
url: { // URL associée à la requête sous sa forme structurée
2024-09-24 15:46:42 +02:00
scheme: "string", // Schéma HTTP de l'URL
opaque: "string", // Données opaque de l'URL
user: { // Identifiants d'URL (Basic Auth)
username: "",
password: ""
2024-06-28 10:46:38 +02:00
},
2024-09-24 15:46:42 +02:00
host: "string", // Nom d'hôte (< domaine > :< port > ) de l'URL
path: "string", // Chemin de l'URL (format assaini)
2024-09-25 15:50:13 +02:00
raw_path: "string", // Chemin de l'URL (format brut)
2024-09-24 15:46:42 +02:00
raw_query: "string", // Variables d'URL (format brut)
fragment : "string", // Fragment d'URL (format assaini)
raw_fragment : "string" // Fragment d'URL (format brut)
2024-06-28 10:46:38 +02:00
},
2024-09-24 15:46:42 +02:00
raw_url: "string", // URL associée à la requête (format assaini)
2024-06-25 14:03:49 +02:00
proto: "string", // Numéro de version du protocole utilisé
2024-09-24 15:46:42 +02:00
proto_major: "int", // Numéro de version majeure du protocole utilisé
proto_minor: "int", // Numéro de version mineur du protocole utilisé
2024-06-25 14:03:49 +02:00
header: { // Table associative des entêtes HTTP associés à la requête
"string": ["string"]
},
2024-09-24 15:46:42 +02:00
content_length: "int", // Taille du corps de la requête
transfer_encoding: ["string"], // MIME-Type(s) d'encodage du corps de la requête
2024-06-25 14:03:49 +02:00
trailer: { // Table associative des entêtes HTTP associés à la requête, transmises après le corps de la requête
"string": ["string"]
},
2024-09-24 15:46:42 +02:00
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)
2024-06-25 14:03:49 +02:00
}
```
#### Réponse
2024-09-24 15:46:42 +02:00
##### `vars.response`
2024-06-25 14:03:49 +02:00
La réponse en cours de traitement.
```js
{
2024-09-24 15:46:42 +02:00
status_code: "int", // Code de statut de la réponse
2024-06-25 14:03:49 +02:00
status: "string", // Message associé au code de statut
proto: "string", // Numéro de version du protocole utilisé
2024-09-24 15:46:42 +02:00
proto_major: "int", // Numéro de version majeure du protocole utilisé
proto_minor: "int", // Numéro de version mineur du protocole utilisé
2024-06-25 14:03:49 +02:00
header: { // Table associative des entêtes HTTP associés à la requête
"string": ["string"]
},
2024-09-24 15:46:42 +02:00
content_length: "int", // Taille du corps de la réponse
transfer_encoding: ["string"], // MIME-Type(s) d'encodage du corps de la requête
2024-06-25 14:03:49 +02:00
trailer: { // Table associative des entêtes HTTP associés à la requête, transmises après le corps de la requête
"string": ["string"]
},
}
```
2024-09-24 15:46:42 +02:00
##### `vars.request`
_Voir section précédente._
##### `vars.original_url`
2024-06-25 14:03:49 +02:00
_Voir section précédente._
## Métriques
_Pas de métriques spécifiques._