Обходной путь со стороны клиента для недопустимых заголовков ответа HTTP, которые содержат как Transfer-Encoding, так и Content-Length?
Я вызываю API, который возвращает 5 ключей в заголовке, включая значения Transfer-encoding: chunked и Content-Length в заголовке.
В соответствии с вопросом stackru, и это ниже, это незаконно:
"... Сервер Node.js возвращает ошибку синтаксического анализа с кодом HPE_UNEXPECTED_CONTENT_LENGTH при использовании конечной точки, поскольку заголовки ответа содержат значения как Transfer-encoding:chunked, так и Content-Length. Это считается с ошибкой, указанной в разделе 3.3 RFC 7230.3.3: Если сообщение получено как с полем заголовка Transfer-Encoding, так и с заголовком Content-Length, Transfer-Encoding переопределяет Content-Length. Такое сообщение может указывать на попытку выполнить контрабанду запроса (раздел 9.5) или разделение ответа (Раздел 9.4) и должен обрабатываться как ошибка. Отправитель ДОЛЖЕН удалить полученное поле Content-Length до пересылки такого сообщения в нисходящем направлении ". (1)
Я использую node.js и модуль npm-request, чтобы отправить запрос и попытаться разобрать ответ. Вызываемая функция
function createPostAPI(req, res, userid, detailText, title, location, custImpact){
var myJSONObject = {
"userId" : userid,
"apiKey" : "{API-Key}",
"detail" : {
"detailText" : detailText
},
"info" : {
"title":title
"location" : location,
"priority" : 0,
"customerImpact" : custImpact
}
}
request1({
url: "http://theAPIurl",
method: "POST",
body:JSON.stringify(myJSONObject)
json: true, // <--Very important!!!
body: myJSONObject
}, function (error, response, body){
console.log(error);
console.log(response);
console.log(body);
});
}
Это ошибка, которую я получаю, как и ожидалось:
{ Error: Parse Error
at Error (native)
at Socket.socketOnData (_http_client.js:362:20)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.push (_stream_readable.js:134:10)
at TCP.onread (net.js:547:20) bytesParsed: 194, code: 'HPE_UNEXPECTED_CONTENT_LENGTH' }
Однако я вижу, что вызов API работает, поскольку я могу визуально убедиться, что он работает! Также с помощью Почтальона я вижу ответ, который мне нужен!
Ответ почтальона:
Заголовок с 2 заголовками (длина содержимого и кодировка передачи):
Тело ответа, в котором я нуждаюсь, я вижу возвращаемым:
Итак, наконец, мой вопрос: могу ли я что-нибудь сделать со своей стороны (клиента), чтобы избежать ошибки и прочитать ответ HTTP с сервера (даже если формат неправильный)? Почему я могу видеть тело в Почтальоне? Любые идеи будут по достоинству оценены!
Использование узла v6.10.3
Ссылка: (1) https://jira.spring.io/browse/SPR-15212