# 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. ##### `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) } ``` ##### `add_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. ```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 (:) 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. ```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) 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. ```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._