# Kérések továbbítása másik szerverre

> A PROXY()-val rendelj URL-előtagot egy upstream szerverhez, válaszd meg, hogyan másolódik az útvonal, és használd a $.proxy()-t egyetlen útvonal továbbítására.

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

A `PROXY(prefix, target)` egy URL-előtag alatti minden kérést továbbít egy másik szerverre, és visszastreameli a választ, így egy Total.js-alkalmazás több szolgáltatás előtt állhat. Az útvonalak előtt fut, ezért egy `PROXY()` által kezelt előtag sosem ér el a `ROUTE()`-ig. A kérés a metódusával, fejléceivel és törzsével megy tovább; az `x-forwarded-for`, `x-forwarded-url` és `x-forwarded-host` fejlécek tájékoztatják az upstreamet az eredeti kérésről. A cél nélküli `PROXY(prefix)` eltávolítja a proxyt.

A visszaadott objektum a proxyt konfigurálja: a `.copy(type)` választja ki, hogy az útvonal mely része megy az upstreamnek (lásd lent), a `.timeout(ms)` korlátozza a várakozást, a `.check(fn)` azt éri el, hogy a proxy csak akkor érvényesüljön, ha az `fn(ctrl)` true-t ad, a `.before(uri, ctrl)` pedig módosíthatja a kimenő kérést, például fejlécet adhat hozzá.

A `.copy()` a `none` (alapértelmezett), az `extend` vagy a `replace` értéket fogadja. A **`none`** esetén az upstream csak a cél útvonalát és a query stringet kapja: a `/none/a/b/?q=1` a `http://host/base/` célnál `/base/?q=1` lesz. Az **`extend`** esetén a kérés útvonalának maradéka hozzáfűződik a cél útvonalához: a `/extend/a/b/?q=1` `/base/a/b/?q=1` lesz, ami egy átjárónál kell. A `replace` úgy viselkedik, mint az `extend`, ha a célnak saját útvonala van; ha a cél csak egy host, az útvonal maradékát **a query string nélkül** küldi, ezért az `extend`-et részesítsd előnyben.

Egyetlen útvonalra használd a `$.proxy(url)`-t: a jelenlegi kérést (metódus, query string, törzs és fejlécek) az `url`-re küldi, és az upstream válaszát adja vissza az állapotkódjával együtt.

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