Редактировать заголовки ответов перед трубопроводом
У меня есть небольшой прокси для некоторых запросов в Express. Используя библиотеку request, у меня есть довольно сжатый код:
app.use('/api', function(req, res) {
var url = rewriteUrl(req.url);
var newReq = request(url, function(error) {
if (error) {
logError(error);
}
});
req.pipe(newReq).pipe(res);
});
Моя проблема в том, что ответ сервера API содержит кучу нежелательных заголовков, которые я хочу удалить. Как удалить заголовки из ответа newReq
перед тем, как отправить его на res
?
Ответы
Ответ 1
С модулем request
в настоящее время нет способа (AFAIK) иметь обратный вызов и не буферизовать ответ сервера. Итак, вот как вы можете сделать это со встроенным http.request
:
app.use('/api', function(req, res) {
var url = rewriteUrl(req.url);
var newReq = http.request(url, function(newRes) {
var headers = newRes.headers;
// modify `headers` here ...
res.writeHead(newRes.statusCode, headers);
newRes.pipe(res);
}).on('error', function(err) {
res.statusCode = 500;
res.end();
});
req.pipe(newReq);
});
Ответ 2
Ответ mscdex работал у меня, но я нашел способ, который, по моему мнению, немного чище. В моем исходном коде у меня была эта строка:
req.pipe(newReq).pipe(res);
Я заменил это следующими строками:
req.pipe(newReq).on('response', function(res) {
delete res.headers['user-agent'];
// ...
}).pipe(res);
Ответ 3
Существует более элегантный способ изменения/удаления заголовков, установив фильтр для труб следующим образом:
const req = request.get(url);
req.pipefilter = function(response, dest) {
// remove headers
for(const h in response.headers) {
dest.removeHeader(h);
}
// or modify
dest.setHeader('Content-Type', 'text/html')
}
req.pipe(resp)