# Transférer des requêtes vers un autre serveur

> Utilisez PROXY() pour associer un préfixe d'URL à un serveur en amont, choisissez comment le chemin est copié, et $.proxy() pour transférer une seule route.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: fr
Content-SHA256: 4a3fa9043e93294a57edd2c15f7731a92fa0236743d20236b607cfc829c3d928
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`PROXY(prefix, target)` transfère à un autre serveur toutes les requêtes situées sous un préfixe d'URL et renvoie la réponse en flux, de sorte qu'une application Total.js peut se placer devant plusieurs services. Il s'exécute avant les routes : un préfixe géré par `PROXY()` n'atteint donc jamais `ROUTE()`. La requête est transmise avec sa méthode, ses en-têtes et son corps ; les en-têtes `x-forwarded-for`, `x-forwarded-url` et `x-forwarded-host` informent le serveur en amont de la requête d'origine. `PROXY(prefix)` sans cible supprime le proxy.

L'objet renvoyé configure le proxy : `.copy(type)` choisit quelle partie du chemin est envoyée en amont (voir plus bas), `.timeout(ms)` limite l'attente, `.check(fn)` n'applique le proxy que lorsque `fn(ctrl)` renvoie true et `.before(uri, ctrl)` peut modifier la requête sortante, par exemple pour ajouter un en-tête.

`.copy()` accepte `none` (par défaut), `extend` ou `replace`. Avec **`none`**, le serveur en amont ne reçoit que le chemin de la cible plus la query string : `/none/a/b/?q=1` devient `/base/?q=1` pour la cible `http://host/base/`. Avec **`extend`**, le reste du chemin de la requête est ajouté au chemin de la cible : `/extend/a/b/?q=1` devient `/base/a/b/?q=1`, ce que vous voulez pour une passerelle. `replace` se comporte comme `extend` quand la cible a son propre chemin ; quand la cible n'est qu'un hôte, il envoie le reste du chemin **sans la query string**, préférez donc `extend`.

Pour une seule route, utilisez `$.proxy(url)` : il envoie la requête courante (méthode, query string, corps et en-têtes) à `url` et renvoie la réponse du serveur en amont avec son code de statut.

```js controllers/proxy.js
const Http = require('http');

// A small upstream server that reports what it received
Http.createServer(function(req, res) {
	res.writeHead(200, { 'content-type': 'application/json' });
	res.end(JSON.stringify({ method: req.method, url: req.url, token: req.headers['x-token'] || null, forwarded: !!req.headers['x-forwarded-url'] }));
}).listen(9411, '127.0.0.1');

// One proxy per copy mode, to see the difference (the target has the path /base/)
PROXY('/none/', 'http://127.0.0.1:9411/base/');
PROXY('/extend/', 'http://127.0.0.1:9411/base/').copy('extend');
PROXY('/plain/', 'http://127.0.0.1:9411/base/').copy('replace');

// Everything below /service/ goes to the upstream, and a header is added on the way
PROXY('/service/', 'http://127.0.0.1:9411/').copy('extend').before(function(uri, ctrl) {
	uri.headers['x-token'] = 'secret';
});

exports.install = function() {
	ROUTE('GET /single/', single);
};

function single($) {
	$.proxy('http://127.0.0.1:9411/from-route/');
}
```
