У меня есть HTTP-прокси-сервер Узел делает некоторые реакции организма переписывания, что в основном это делает:Почему я не могу удалить заголовок передачи в прокси-узел узла?
- Client GET локальный: 8000/API/пункты
- Узел прокси отправить Localhost: 8000 -> для example.com/апи
- сервер отвечает JSON
[{ id: 1234, url: http://example.com/api/items/1234 }]
- Узел прокси перезаписывает JSON в
[{ id: 1234, url: http://localhost:8000/api/items/1234 }]
- узла прокси вычисляет новый заголовок
content-length
, устанавливает его и возвращает ответ клиенту
Это работало нормально, пока серверный сервер не включил сжатие. Итак, теперь, по умолчанию, ответы были gzipped. Я работал вокруг этого, установив это в моем прокси:
req.headers['accept-encoding'] = 'deflate';
Таким образом, после того, ответы не были архивированным, я мог разобрать их и переписать тело по мере необходимости и раньше. Однако это перестало работать с IE. Я думаю, проблема заключается в том, что в ответе все еще есть заголовок transfer-encoding=chunked
, поэтому IE ожидает ответную реакцию. Поскольку заголовок transfer-encoding
присутствует, заголовок content-length
отсутствует, хотя я явно его устанавливаю (эти два заголовка являются взаимоисключающими). Я пробовал все, что мог, чтобы удалить заголовок transfer-encoding
и получить вместо него заголовок content-length
, но ничего не работает. Я пробовал все эти:
// In the context of my middleware response.writeHead function
res.setHeader('transfer-encoding', null);
res.setHeader('transfer-encoding', '');
res.removeHeader('transfer-encoding');
res.setHeader('content-length', modifiedBuffer.length); // this line alone worked before
res.originalWriteHead.call(res, statusCode, { 'Content-Length', modifiedBuffer.length });
// In the context of my middleware response.write function res.write(data, encoding)
// Here, encoding parameter is undefined
// According to docs, encoding defaults to utf8, could be 'chunked'
res.oldWrite.call(res, modifiedBuffer, 'utf8');
res.oldWrite.call(res, modifiedBuffer, '');
res.oldWrite.call(res, modifiedBuffer, null);
// tried all three previous the same for res.end
В принципе, независимо от того, что я делаю, то Отклик не фрагментированные, но имеет множество transfer-encoding
заголовка, а не content-length
. Firefox, сафари, хром все, похоже, справляются с этим, но IE терпит неудачу с ошибкой XMLHttpRequest: Network Error 0x800c0007, No data is available for the requested resource.
. Это (из того, что я могу сказать), потому что он ждет кусков (из-за заголовка transfer-encoding
), но получает конец ответа и не имеет длины содержимого для его чтения.
Кто-нибудь знает, как я могу это решить? Делаю ли я что-то не так, пытаясь удалить заголовок transfer-encoding
в пользу content-length
?
Возможно, вы только что спасли мою неделю :-) –