# 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(name string, value string)` Ajouter une valeur à un entête HTTP via son nom `name` et sa valeur `value`. ##### `set_header(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(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(host string)` Modifier la valeur de l'entête `Host` de la requête. ##### `set_url(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 ##### `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 (:) de l'URL "path": "string", // Chemin de l'URL (format assaini) "rawPath": "string", // Chemin de l'URL (format brut) "rawQuery": "string", // Variables d'URL (format brut) "fragment" : "string", // Fragment d'URL (format assaini) "rawFragment" : "string" // Fragment d'URL (format brut) }, rawUrl: "string", // URL associée à la requête (format assaini) proto: "string", // Numéro de version du protocole utilisé protoMajor: "int", // Numéro de version majeure du protocole utilisé protoMinor: "int", // Numéro de version mineur du protocole utilisé header: { // Table associative des entêtes HTTP associés à la requête "string": ["string"] }, contentLength: "int", // Taille du corps de la requête transferEncoding: ["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"] }, remoteAddr: "string", // Adresse du client HTTP à l'origine de la requête requestUri: "string" // URL "brute" associée à la requêtes (avant opérations d'assainissement, utiliser "url" plutôt) } ``` #### Réponse ##### `response` La réponse en cours de traitement. ```js { statusCode: "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é protoMajor: "int", // Numéro de version majeure du protocole utilisé protoMinor: "int", // Numéro de version mineur du protocole utilisé header: { // Table associative des entêtes HTTP associés à la requête "string": ["string"] }, contentLength: "int", // Taille du corps de la réponse transferEncoding: ["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"] }, } ``` ##### `request` _Voir section précédente._ ## Métriques _Pas de métriques spécifiques._