{"id":20448984,"url":"https://github.com/radiofrance/node-forwarder-http","last_synced_at":"2025-04-13T01:40:18.057Z","repository":{"id":18388914,"uuid":"84170210","full_name":"radiofrance/node-forwarder-http","owner":"radiofrance","description":"A nodejs http forwarder : small library that listens to http(s) requests and forwards them to a list of target servers.","archived":false,"fork":false,"pushed_at":"2022-06-16T18:01:33.000Z","size":77,"stargazers_count":12,"open_issues_count":1,"forks_count":5,"subscribers_count":29,"default_branch":"master","last_synced_at":"2025-04-13T01:40:05.091Z","etag":null,"topics":["forwarder","http","https","nodejs","proxy"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/forwarder-http","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/radiofrance.png","metadata":{"files":{"readme":"README-fr.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-03-07T07:46:24.000Z","updated_at":"2023-11-05T20:58:23.000Z","dependencies_parsed_at":"2022-09-08T00:40:44.858Z","dependency_job_id":null,"html_url":"https://github.com/radiofrance/node-forwarder-http","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radiofrance%2Fnode-forwarder-http","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radiofrance%2Fnode-forwarder-http/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radiofrance%2Fnode-forwarder-http/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radiofrance%2Fnode-forwarder-http/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/radiofrance","download_url":"https://codeload.github.com/radiofrance/node-forwarder-http/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248654026,"owners_count":21140236,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["forwarder","http","https","nodejs","proxy"],"created_at":"2024-11-15T10:37:56.045Z","updated_at":"2025-04-13T01:40:18.014Z","avatar_url":"https://github.com/radiofrance.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Forwarder HTTP\n\n[![Build\nStatus](https://travis-ci.org/radiofrance/node-forwarder-http.svg?branch=master)](https://travis-ci.org/radiofrance/node-forwarder-http)\n\n```forwarder-http``` est un utilitaire pour transférer des requêtes\nHTTP/HTTPS à une liste de serveurs cible. À chaque requête :\n\n- Répond immédiatement au client avec un code ```200``` (configurable)\n- Transfère la requête à un ensemble de serveurs\n- Peux être configuré pour faire des retry individuelement, par destination.\n\nIl est conçu pour être simple, configurable et extensible via toute sorte\nd'événements.\n\nActuellement, seule les versions de node ```\u003e=6.x.x``` sont supportées.\n\n## Le cas d'usage à @RadioFrance\n\nCertaines de nos applications reçoivent beaucoup de données en entrée, et ces\ndonnées doivent alimenter non seulement la production mais également les\nenvironnements de développement et de test. Nous avions besoin d'une application\nqui soit petite et très performante.\n\n## Utilisation\n\nLe meilleur moyen de l'expliquer est via un exemple\n\n```\nconst Forwarder = require('forwarder-http')\n\nconst server = new Forwarder({\n  // La liste de serveurs cible\n  targets: [\n    'http://target-nb-1.com', // config simple, utilise les configs par défault\n    {                         // config complète, supplante certaines configs\n      url: 'http://target-nb-2.com',\n      headers: {\n        'my-nb1-header': 'my-nb1-val'\n      },\n      retry: {\n        maxRetries: 3\n      }\n    }\n  ],\n\n  // Ajout d'un header à toute requête entrante\n  targetHeaders: {'token': 'some-complicated-hash'},\n\n  // Définition du code de retour de l'application à chaque requête\n  responseStatusCode: 204\n})\n```\n\nVous trouverez dans le répertoire [exemples](https://github.com/radiofrance/node-forwarder-http/forwarder/blob/master/examples) plusieurs autres types d'utilisation, comment utiliser les évenements, comment passer par HTTPS, ...\n\n## Options\n\nLe constructeur du `Forwarder` a quelques options dont le but est de permettre à l'utilisateur de contrôler comment chaque requête à chaque cible est faîte et la réponse au client.\n\n- **https**: _bool_. Créer un serveur HTTPS (Défaut ```false```)\n- **https**: _object_. Options à passer au constructeur _https.createServer_.\n- **timeout**: _int_. Timeout dans les requêtes aux serveurs cible. (Défaut: null)\n- **targets**: _array_. Liste des serveurs cible. Cf. [les exemples](https://github.com/radiofrance/node-forwarder-http/blob/master/examples).\n- **targetHeaders**: _object_. En-têtes à ajouter à la requête transférée. (Défaut: aucun)\n- **targetOpts**: _object_. Options  à passer au constructeur de la requête http/https. Voir [l'example](https://github.com/radiofrance/node-forwarder-http/blob/master/examples/using-https) et [toutes les options disponibles](https://nodejs.org/api/https.html#https_https_request_options_callback)\n- **targetRetry** _object_. Options de retry pour toutes les cibles\n    - **maxRetries**: _int_, default 0.\n    - **delay**: _int_, default 300 (ms). L'unité de temps pour le calcul de l'intervale entre retry successifs (cf. [Wikipedia Exponential Backoff](https://en.wikipedia.org/wiki/Exponential_backoff))\n    - **retryOnInternalError**: _bool_, default false. Le forwarder doit-il faire des retry si la cible répond avec un\n    code 5xx ?\n- **responseStatusCode**: Status code que le serveur envoie au client.\n- **responseBody**: body que le serveur envoie au client.\n- **responseHeaders**: En-têtes que le serveur doit ajouter à sa réponse.\n\n## Événements\n\nLa libraire vous permeter d'écouter des événements tout le long du cicle de vie\ndu transfer des requêtes, et de tout modifier sur la route.\n\n- **request** ```(incommingMessage, response)```: L'événement ```request``` du\nserveur HTTP/HTTPS. Si vous appelez ```response.end()``` dans un callback callback, la requête ne sera pas transférée.\n- **requestContents** ```(incommingMessage, payload)```: Le contenu de la requête, le ```body```.\n- **response** ```(incommingMessage, response)```: Appelé avant que le serveur\nne réponde au client.\n- **requestError** ```(error, incommingMessage)```: erreur dans la gestion de la\nrequête arrivante.\n- **forwardRequest** ```(options, incommingMessage)```: vous permet de modifier chaque\nrequête transférée à chaque cible. Le premier argument est le array passé aux constructeurs\n[http.request](https://nodejs.org/api/http.html#http_http_request_options_callback) and\n[https.request](https://nodejs.org/api/https.html#https_https_request_options_callback), après que\ntoutes les configurations ont été appliquées. Si vous faîtes ```options.cancel = true```, la requête actuelle ne\nsera pas transférée à la cible courante. Vous trouverez dans les exemples un ... exemple de ceci.\n- **forwardResponse** ```(request, incommingMessagei, willRetry)```: vous permet de\ngérer chaque réponse de chaque cible.\n- **forwardRequestError** ```(error, request, willRetry)```: erreur dans une des\nrequêtes transférées.\n\nVoir comment [utiliser les événements](https://github.com/radiofrance/node-forwarder-http/blob/master/examples/using-events.js).\n\n## Remerciements\n\n-\n**[node-http-proxy](https://github.com/nodejitsu/node-http-proxy)**:\nnotre librairie a commencée comme une version simplifiée et modernisée de celle-ci. ```node-http-proxy``` peut également servir de proxy et supporte des versions de node plus anciennes. Elle ne permet cependant qu'une seule cible dans le transfer des requêtes, ce qui ne répondait pas à notre besoin. Finalement nous avons tout re-écrit, mais merci beaucoup aux équipes de [nodejitsu](https://nodejitsu.com/) pour l'inspiration.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fradiofrance%2Fnode-forwarder-http","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fradiofrance%2Fnode-forwarder-http","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fradiofrance%2Fnode-forwarder-http/lists"}