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

0 ответов

Другие вопросы по тегам