# Verzoeken doorsturen naar een andere server

> Gebruik PROXY() om een URL-prefix aan een upstream-server te koppelen, kies hoe het pad wordt gekopieerd en gebruik $.proxy() om één route door te sturen.

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

`PROXY(prefix, target)` stuurt elk verzoek onder een URL-prefix door naar een andere server en streamt het antwoord terug, zodat één Total.js-applicatie voor meerdere diensten kan staan. Het draait vóór de routes, dus een prefix dat door `PROXY()` wordt afgehandeld, bereikt `ROUTE()` nooit. Het verzoek wordt doorgegeven met zijn methode, headers en body; de headers `x-forwarded-for`, `x-forwarded-url` en `x-forwarded-host` vertellen de upstream over het oorspronkelijke verzoek. `PROXY(prefix)` zonder doel verwijdert de proxy.

Het object dat het teruggeeft configureert de proxy: `.copy(type)` kiest welk deel van het pad naar de upstream wordt gestuurd (zie hieronder), `.timeout(ms)` begrenst de wachttijd, `.check(fn)` zorgt dat de proxy alleen geldt wanneer `fn(ctrl)` true teruggeeft en `.before(uri, ctrl)` kan het uitgaande verzoek wijzigen, bijvoorbeeld om een header toe te voegen.

`.copy()` accepteert `none` (standaard), `extend` of `replace`. Met **`none`** ontvangt de upstream alleen het pad van het doel plus de query string: `/none/a/b/?q=1` wordt `/base/?q=1` voor het doel `http://host/base/`. Met **`extend`** wordt de rest van het verzoekpad aan het pad van het doel toegevoegd: `/extend/a/b/?q=1` wordt `/base/a/b/?q=1`, wat je voor een gateway wilt. `replace` gedraagt zich als `extend` wanneer het doel een eigen pad heeft; als het doel alleen een host is, stuurt het de rest van het pad **zonder de query string**, geef dus de voorkeur aan `extend`.

Voor één enkele route gebruik je `$.proxy(url)`: het stuurt het huidige verzoek (methode, query string, body en headers) naar `url` en geeft het antwoord van de upstream met zijn statuscode terug.

```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/');
}
```
