400 Неверный запрос — DuplicateHeader

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

Симптом

Клиентское приложение получает код состояния 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: Порядок полей , отправитель НЕ ДОЛЖЕН генерировать несколько полей заголовка с одинаковым именем поля в сообщении, если только все значение поля для этого поля заголовка не определено как список, разделенный запятыми, [т.е. , #(значения)] или поле заголовка являются хорошо известным исключением. Если Apigee Edge обнаруживает определенный заголовок, дубликаты которого недопустимы, более одного раза в HTTP-запросе , отправленном клиентом, он отвечает 400 Bad Request и кодом ошибки protocol.http.DuplicateHeader .

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

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

Общие этапы диагностики

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

API-мониторинг

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

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

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

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

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

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

НГИНКС

Чтобы диагностировать ошибку с помощью журналов доступа 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-код неисправности protocol.http.DuplicateHeader
    X-Apigee-источник-ошибки MP

Причина: повторяющийся заголовок в запросе.

Диагностика

  1. Определите код ошибки и источник ошибки , наблюдаемой с помощью мониторинга API или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
  2. Если источник сбоя имеет значение 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 .

КвК

Вариант №2: Использование свойства CwC

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 .

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

  • Название организации
  • Имя среды
  • Имя 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