# Przekazuj żądania do innego serwera

> Użyj PROXY(), aby przypisać prefiks URL do serwera docelowego, wybierz sposób kopiowania ścieżki oraz $.proxy(), aby przekazać pojedynczą trasę.

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

`PROXY(prefix, target)` przekazuje na inny serwer każde żądanie pod prefiksem URL i strumieniuje odpowiedź z powrotem, dzięki czemu jedna aplikacja Total.js może stać przed kilkoma usługami. Działa przed trasami, więc prefiks obsłużony przez `PROXY()` nigdy nie dociera do `ROUTE()`. Żądanie jest przekazywane z metodą, nagłówkami i ciałem; nagłówki `x-forwarded-for`, `x-forwarded-url` i `x-forwarded-host` informują serwer docelowy o oryginalnym żądaniu. `PROXY(prefix)` bez celu usuwa proxy.

Zwrócony obiekt konfiguruje proxy: `.copy(type)` wybiera, która część ścieżki jest wysyłana dalej (zob. niżej), `.timeout(ms)` ogranicza czas oczekiwania, `.check(fn)` sprawia, że proxy działa tylko wtedy, gdy `fn(ctrl)` zwróci true, a `.before(uri, ctrl)` może zmienić żądanie wychodzące, na przykład dodać nagłówek.

`.copy()` przyjmuje `none` (domyślnie), `extend` lub `replace`. Z **`none`** serwer docelowy otrzymuje tylko ścieżkę celu plus query string: `/none/a/b/?q=1` staje się `/base/?q=1` dla celu `http://host/base/`. Z **`extend`** reszta ścieżki żądania jest doklejana do ścieżki celu: `/extend/a/b/?q=1` staje się `/base/a/b/?q=1`, czyli tym, czego potrzebujesz w bramie. `replace` zachowuje się jak `extend`, gdy cel ma własną ścieżkę; gdy celem jest sam host, wysyła resztę ścieżki **bez query stringu**, więc preferuj `extend`.

Dla pojedynczej trasy użyj `$.proxy(url)`: wysyła bieżące żądanie (metodę, query string, ciało i nagłówki) na `url` i zwraca odpowiedź serwera docelowego z jej kodem statusu.

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