# Redirecționează cereri către un alt server

> Folosește PROXY() pentru a asocia un prefix de URL cu un server din amonte, alege cum se copiază calea și $.proxy() pentru a redirecționa o singură rută.

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

`PROXY(prefix, target)` redirecționează către alt server toate cererile aflate sub un prefix de URL și returnează răspunsul în streaming, astfel încât o aplicație Total.js poate sta în fața mai multor servicii. Rulează înaintea rutelor, deci un prefix gestionat de `PROXY()` nu ajunge niciodată la `ROUTE()`. Cererea este transmisă cu metoda, antetele și corpul ei; antetele `x-forwarded-for`, `x-forwarded-url` și `x-forwarded-host` informează serverul din amonte despre cererea originală. `PROXY(prefix)` fără destinație elimină proxy-ul.

Obiectul returnat configurează proxy-ul: `.copy(type)` alege ce parte a căii este trimisă mai departe (vezi mai jos), `.timeout(ms)` limitează așteptarea, `.check(fn)` face ca proxy-ul să se aplice doar când `fn(ctrl)` returnează true, iar `.before(uri, ctrl)` poate modifica cererea de ieșire, de exemplu pentru a adăuga un antet.

`.copy()` acceptă `none` (implicit), `extend` sau `replace`. Cu **`none`**, serverul din amonte primește doar calea destinației plus query string-ul: `/none/a/b/?q=1` devine `/base/?q=1` pentru destinația `http://host/base/`. Cu **`extend`**, restul căii cererii se adaugă la calea destinației: `/extend/a/b/?q=1` devine `/base/a/b/?q=1`, ceea ce îți dorești pentru un gateway. `replace` se comportă ca `extend` când destinația are o cale proprie; când destinația este doar un host, trimite restul căii **fără query string**, așa că preferă `extend`.

Pentru o singură rută folosește `$.proxy(url)`: trimite cererea curentă (metodă, query string, corp și antete) către `url` și returnează răspunsul serverului din amonte cu codul lui de stare.

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