2014-10-27 2 views
1

У меня есть HTTP-прокси-сервер Узел делает некоторые реакции организма переписывания, что в основном это делает:Почему я не могу удалить заголовок передачи в прокси-узел узла?

  1. Client GET локальный: 8000/API/пункты
  2. Узел прокси отправить Localhost: 8000 -> для example.com/апи
  3. сервер отвечает JSON [{ id: 1234, url: http://example.com/api/items/1234 }]
  4. Узел прокси перезаписывает JSON в [{ id: 1234, url: http://localhost:8000/api/items/1234 }]
  5. узла прокси вычисляет новый заголовок 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?

+0

Возможно, вы только что спасли мою неделю :-) –

ответ

0

Я понял это сам:

я эффективно использовать два компонента промежуточного программного обеспечения (мой собственный, описанные в этом вопросе), и сжатие express.js. Мое промежуточное программное обеспечение распаковывало ответ, но сжатие гарантирует, что ответ всегда записывается с transfer-encoding=chunked и удаляется content-length.

Извлечение модуля сжатия express.js решило это для меня.

 Смежные вопросы

  • Нет связанных вопросов^_^