400 Bad Request - DuplicateHeader

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Symptom

Клиентское приложение получает код статуса HTTP 400 Bad Request с кодом ошибки protocol.http.DuplicateHeader в качестве ответа на вызовы API.

Сообщение об ошибке

Клиентское приложение получает следующий код ответа:

HTTP/1.1 400 Bad Request

Кроме того, вы можете увидеть сообщение об ошибке, похожее на приведенное ниже:

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

Возможные причины

Эта ошибка возникает, если определенный заголовок HTTP, который не должен дублироваться в Apigee Edge, появляется более одного раза с одинаковыми или разными значениями в HTTP-запросе, отправленном клиентом в Apigee Edge.

Согласно RFC 7230, раздел 3.2.2: Порядок полей, отправитель НЕ ДОЛЖЕН создавать несколько полей заголовка с одним и тем же именем поля в сообщении, если только все значение поля заголовка не определено как список, разделенный запятыми, [т.е. #(values)] или поле заголовка является известным исключением. Если Apigee Edge обнаружит, что определенный заголовок, который не должен дублироваться, встречается в HTTP-запросе , отправленном клиентом, более одного раза, то он ответит кодом 400 Bad Request и кодом ошибки protocol.http.DuplicateHeader.

Вот возможные причины этой ошибки:

Причина Описание Инструкции по устранению неполадок, применимые к
Повторяющийся заголовок в запросе HTTP-запрос от клиентского приложения к Apigee содержит повторяющиеся заголовки. Пользователи общедоступного и частного облака Edge

Распространенные этапы диагностики

Чтобы диагностировать эту ошибку, используйте один из следующих инструментов или методов:

Мониторинг API

Чтобы диагностировать ошибку с помощью мониторинга API:

  1. Войдите в интерфейс Apigee Edge как пользователь с подходящей ролью.
  2. Перейдите к организации, в которой хотите изучить проблему.

  3. Перейдите на страницу Анализ > Мониторинг API > Исследование.
  4. Выберите период времени, в течение которого вы наблюдали ошибки.
  5. Убедитесь, что для фильтра прокси-сервера задано значение Все.
  6. Постройте график Код ошибки по оси Y и Время по оси X.
  7. Выберите ячейку с кодом ошибки protocol.http.DuplicateHeader, как показано ниже.

  8. Информация о коде ошибки protocol.http.DuplicateHeader будет показана, как на изображении ниже:

  9. Нажмите Посмотреть журналы и разверните строку с неудачным запросом.
  10. В окне Журналы обратите внимание на следующие сведения:
    1. Код статуса: 400.
    2. Источник ошибки: apigee
    3. Код ошибки: protocol.http.DuplicateHeader.
  11. Если в поле Источник ошибки указано значение apigee или MP , а в поле Код ошибки – protocol.http.DuplicateHeader, это означает, что HTTP-запрос от клиента содержал дублирующиеся заголовки.

Инструмент "Трассировка"

nginx

Чтобы диагностировать ошибку с помощью журналов доступа NGINX:

  1. Если вы используете частное облако, то можете использовать журналы доступа NGINX, чтобы определить ключевую информацию об ошибках HTTP 400.
  2. Проверьте журналы доступа NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Где: ORG, ENV и PORT# заменяются фактическими значениями.

  3. Выполните поиск, чтобы узнать, возникали ли ошибки 400 за определенный период времени (если проблема возникла в прошлом) или есть ли запросы, которые по-прежнему завершаются с ошибкой 400.
  4. Если вы обнаружите ошибки 400 с кодом X-Apigee-fault-code, соответствующим значению protocol.http.DuplicateHeader, определите значение X-Apigee-fault-source.

    Пример ошибки 400 из журнала доступа NGINX

    В приведенной выше записи из журнала доступа NGINX для атрибутов X-Apigee-fault-code и X-Apigee-fault-source заданы следующие значения:

    Заголовки ответов Значение
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

Причина: в запросе дублируется заголовок

диагностика;

  1. Определите код ошибки и источник ошибки, используя мониторинг API или журналы доступа NGINX, как описано в разделе Распространенные действия по диагностике.
  2. Если в поле Fault Source указано значение apigee или MP, это означает, что запрос, отправленный клиентским приложением в Apigee, содержит дублирующиеся заголовки.
  3. Определить, какой именно заголовок отправляется несколько раз в составе запроса, можно одним из следующих способов:

    Сообщение об ошибке

    Как использовать сообщение об ошибке

    1. Если у вас есть доступ к полному сообщению об ошибке, полученному от Apigee Edge, ознакомьтесь с разделом faultstring. В faultstring указано название заголовка, который был отправлен более одного раза.

      Пример сообщения об ошибке

      "faultstring":"Duplicate Header \"Expires\""
    2. В приведенном выше сообщении об ошибке видно, что заголовок Expires отправлен несколько раз, как указано в faultstring.

    Фактический запрос

    Используя фактический запрос

    1. Если у вас есть доступ к фактическому запросу, отправленному клиентским приложением, выполните следующие действия:

      1. Проверьте список заголовков, переданных в запросе.
      2. Если вы обнаружите, что определенный заголовок появляется в запросе более одного раза с одним и тем же или разными значениями, то это и будет причиной ошибки.

      Образец запроса:

      curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
      

      В приведенном выше примере запроса заголовок Expires отправляется более одного раза. Поэтому запрос завершается с ошибкой 400 Bad Request и кодом ошибки protocol.http.DuplicateHeader.

    2. Если у вас есть доступ к журналам клиента, вы можете посмотреть, есть ли в них информация о фактическом запросе, отправленном в Apigee Edge, и определить заголовок, который отправляется более одного раза.

Разрешение

Как устранить дублирование

Вариант 1 (рекомендуется). Исправьте клиентское приложение, чтобы оно не включало повторяющиеся заголовки.

  1. Проанализируйте, почему определенный клиент отправляет дублирующиеся заголовки. Например, в приведенном выше случае это Expires. Убедитесь, что прокси API могут принимать дублирующиеся заголовки. Как правило, это нежелательно согласно спецификации HTTP RFC7230.
  2. Если это нежелательно, измените клиентское приложение, чтобы оно не отправляло дублирующиеся заголовки.

    В приведенном выше примере заголовок Expires отправляется дважды с одним и тем же значением, что нежелательно. Чтобы устранить проблему, передайте заголовок Expires только один раз, как показано ниже:

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. Если вы хотите разрешить дублирование заголовков, перейдите к разделу Вариант 2. Использование свойства CwC.

CwC

Вариант 2. Использование ресурса "Конверсии в магазинах"

Apigee предоставляет свойство CwC HTTPHeader.<HeaderName> ,которое позволяет клиентским приложениям и целевым серверам отправлять дублирующиеся заголовки прокси API в Apigee Edge.

Ресурс CwC Значения
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Например, следующее свойство можно задать для обработчиков сообщений, чтобы разрешить дубликаты и несколько значений для заголовка Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Если вы пользователь частного облака, вы можете настроить свойство, чтобы Apigee Edge не выдавал ошибку 400 Bad Request, даже если запрос содержит повторяющиеся заголовки. Инструкции приведены в практическом руководстве Настройка процессоров сообщений для использования повторяющихся заголовков.
  2. Если вы пользователь общедоступного облака, обратитесь в службу поддержки Apigee Edge, чтобы настроить это свойство для вашей организации.

Спецификация

Apigee ожидает, что клиентское приложение не будет отправлять дублирующиеся заголовки в составе запроса в соответствии со следующими спецификациями RFC:

Спецификация
RFC 7230, раздел 3.2.2: порядок полей
RFC 7230, раздел 3.2 "Поля заголовка"

Если вам по-прежнему нужна помощь службы поддержки Apigee, перейдите к разделу Сбор диагностической информации.

Необходимо собрать диагностическую информацию

Соберите указанную ниже диагностическую информацию и обратитесь в службу поддержки Apigee Edge.

Если вы пользователь общедоступного облака, предоставьте следующую информацию:

  • Название организации
  • Название среды
  • Название прокси API
  • Команда curl, использованная для воспроизведения ошибки 400
  • Файл трассировки для запросов к API

Если вы используете частное облако, предоставьте следующую информацию:

  • Полное сообщение об ошибке, которое появляется при неудачных запросах.
  • Название среды
  • Пакет прокси-сервера API
  • Полная команда curl, которую вы использовали для воспроизведения ошибки 400
  • Файл трассировки для запросов к API
  • Журналы доступа NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Где: ORG, ENV и PORT# заменяются фактическими значениями.

  • Системные журналы обработчика сообщений /opt/apigee/var/log/edge-message-processor/logs/system.log