Подтвердить что ты не робот

Редактировать заголовки ответов перед трубопроводом

У меня есть небольшой прокси для некоторых запросов в 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?

4b9b3361

Ответ 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)