# Presmerovanie požiadaviek na iný server

> Použite PROXY() na priradenie prefixu URL k cieľovému serveru, zvoľte spôsob kopírovania cesty a $.proxy() na presmerovanie jednej trasy.

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

`PROXY(prefix, target)` presmeruje všetky požiadavky pod prefixom URL na iný server a odpoveď streamuje späť, takže jedna aplikácia Total.js môže stáť pred viacerými službami. Spúšťa sa pred trasami, takže prefix spracovaný cez `PROXY()` sa nikdy nedostane k `ROUTE()`. Požiadavka sa odovzdá s metódou, hlavičkami a telom; hlavičky `x-forwarded-for`, `x-forwarded-url` a `x-forwarded-host` informujú cieľový server o pôvodnej požiadavke. `PROXY(prefix)` bez cieľa proxy odstráni.

Objekt, ktorý vráti, proxy konfiguruje: `.copy(type)` určuje, ktorá časť cesty sa pošle cieľu (pozri nižšie), `.timeout(ms)` obmedzuje čakanie, `.check(fn)` spôsobí, že sa proxy uplatní len vtedy, keď `fn(ctrl)` vráti true, a `.before(uri, ctrl)` môže zmeniť odchádzajúcu požiadavku, napríklad pridať hlavičku.

`.copy()` prijíma `none` (predvolené), `extend` alebo `replace`. S **`none`** cieľ dostane len cestu cieľa plus query string: `/none/a/b/?q=1` sa stane `/base/?q=1` pre cieľ `http://host/base/`. S **`extend`** sa zvyšok cesty požiadavky pripojí k ceste cieľa: `/extend/a/b/?q=1` sa stane `/base/a/b/?q=1`, čo je to, čo chcete pri bráne. `replace` sa správa ako `extend`, keď má cieľ vlastnú cestu; ak je cieľom len hostiteľ, pošle zvyšok cesty **bez query stringu**, preto uprednostnite `extend`.

Pre jednu trasu použite `$.proxy(url)`: pošle aktuálnu požiadavku (metódu, query string, telo a hlavičky) na `url` a vráti odpoveď cieľa s jej stavovým kódom.

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