# 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: "string", // URL associée à la requête 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._