400 Bad Request - DecompressionFailureAtRequest

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

Symptom

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

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

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

HTTP/1.1 400 Bad Request

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

{
   "fault":{
      "faultstring":"Decompression failure at request",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"
      }
   }
}

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

Эта ошибка возникает только в следующих случаях:

  • Кодировка, указанная в заголовке Content-Encoding HTTP-запроса, действительна и поддерживается Apigee Edge.
  • BUT

  • Формат полезной нагрузки, отправленной клиентом в составе HTTP-запроса, не соответствует формату кодировки, указанному в заголовке Content-Encoding .

Это происходит потому, что Apigee Edge не удается декодировать полезную нагрузку с помощью указанной кодировки, поскольку формат полезной нагрузки не совпадает с форматом кодировки, указанным в заголовке Content-Encoding.

Ниже приведены примеры поддерживаемых значений Content-Encoding и ожидаемый формат полезной нагрузки в Apigee Edge в этих случаях:

Сценарий Content-Encoding Ожидаемый формат полезной нагрузки
Одна кодировка gzip

Формат Unix gzip.

Подробнее о формате GZIP согласно RFC1952…

Одна кодировка deflate

В этом формате используется структура zlib с алгоритмом сжатия deflate.

См. RFC1950 и RFC1951.

Несколько кодировок

Несколько кодировок

Например, если кодирование выполняется дважды, это может быть:

  • gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • deflate, deflate
Несколько типов кодировки, примененных к полезной нагрузке в том порядке, в котором они указаны в заголовке.

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

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

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

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

Мониторинг API

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

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

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

    ( посмотреть изображение в полном размере)

  8. Информация о коде ошибки messaging.adaptors.http.flow.DecompressionFailureAtRequest будет показана, как на изображении ниже.

    ( посмотреть изображение в полном размере)

  9. Нажмите Посмотреть журналы и разверните строку, в которой произошла ошибка 400.

    ( посмотреть изображение в полном размере)

  10. В окне Журналы обратите внимание на следующие сведения:
    • Код статуса: 400.
    • Источник ошибки: proxy
    • Код ошибки: messaging.adaptors.http.flow.DecompressionFailureAtRequest.
  11. Если в поле Fault Source указано значение proxy, это означает, что формат полезной нагрузки запроса не соответствует поддерживаемой кодировке, указанной в заголовке Content-Encoding.

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

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

  1. Включите сеанс трассировки и один из следующих вариантов:
    1. Дождитесь ошибки 400 Bad Request или
    2. Если вы можете воспроизвести проблему, сделайте вызов API и воспроизведите 400 Bad Request.
  2. Убедитесь, что включен параметр Показывать все FlowInfo:

  3. Выберите один из неудачных запросов и изучите трассировку.
  4. Перемещайтесь по разным этапам трассировки и находите, где произошла ошибка.
  5. Обычно ошибка возникает в потоке сразу после этапа Запрос получен от клиента, как показано ниже.

    ( посмотреть изображение в полном размере)

  6. Запишите значения свойств из трассировки:

    • Ошибка: Decompression failure at request
    • error.class: com.apigee.rest.framework.BadRequestException
    • error.cause: Not in GZIP format

    В поле error.cause указано, что полезная нагрузка запроса не имеет формат GZIP. Это означает, что Apigee Edge ожидал, что полезная нагрузка запроса будет в формате GZIP, как указано в заголовке Content-Encoding.

  7. Определите значение заголовка запроса Content-Encoding. Для этого перейдите к этапу Запрос получен от клиента, как показано ниже:

    ( посмотреть изображение в полном размере)

    Обратите внимание, что значение заголовка запроса Content-Encoding – gzip.

    В приведенном выше примере трассировки показано, что в заголовке запроса Content-Encoding указана кодировка gzip, однако полезная нагрузка запроса не имеет формат GZIP. Поэтому Apigee не может распаковать полезную нагрузку с помощью gzip и возвращает ошибку Decompression failure at request.

  8. Запишите код статуса и сообщение об ошибке, возвращенные Apigee Edge, перейдя по ссылке

    к этапу Ответ отправлен клиенту в трассировке, как показано ниже:

    ( посмотреть изображение в полном размере)

    Обратите внимание на следующие детали трассировки:

    • Код статуса: 400 Bad Request.
    • Контент с ошибкой: {"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
  9. Перейдите к фазе AX (запись данных аналитики) в трассировке и нажмите на нее.

  10. Прокрутите страницу вниз до раздела Сведения об этапе, Заголовки ошибок и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:

    ( посмотреть изображение в полном размере)

  11. Значения X-Apigee-fault-code и X-Apigee-fault-source будут messaging.adaptors.http.flow.DecompressionFailureAtRequest и policy соответственно. Это означает, что формат полезной нагрузки запроса не соответствует кодировке, указанной в заголовке Content-Encoding.
    Заголовки ответа Значение
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
    X-Apigee-fault-source policy

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, соответствующим значению messaging.adaptors.http.flow.DecompressionFailureAtRequest, определите значение X-Apigee-fault-source.

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

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

    Заголовки ответа Значение
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
    X-Apigee-fault-source policy

Причина: формат полезной нагрузки запроса не соответствует кодировке, указанной в заголовке Content-Encoding.

По умолчанию Apigee Edge всегда распаковывает полезную нагрузку, если в заголовке запроса Content-Encoding указана действительная и поддерживаемая кодировка. Поэтому ожидается, что формат полезной нагрузки запроса будет соответствовать кодировке, указанной в заголовке запроса Content-Encoding. Если данные не совпадают, вы увидите сообщение об ошибке.

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

  1. Определите код ошибки и источник ошибки, используя мониторинг API, инструмент трассировки или журналы доступа NGINX, как описано в разделе Распространенные шаги диагностики.
  2. Если код ошибки – messaging.adaptors.http.flow.DecompressionFailureAtRequest, а источник ошибки – policy или proxy, это означает, что полезная нагрузка запроса, отправленного клиентским приложением, не соответствует поддерживаемой кодировке, указанной в заголовке запроса Content-Encoding.
  3. Вы можете определить несоответствие в рамках HTTP-запроса одним из следующих способов:

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

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

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

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

      "faultstring":"Decompression failure at request"
    2. В приведенном выше сообщении об ошибке указан код "Decompression failure at request", который означает, что запрос не удалось распаковать с помощью кодировки, указанной в заголовке Content-Encoding.

    Трассировка

    Чтобы проверить данные с помощью трассировки:

    1. Определите значение заголовка запроса Content-Encoding и свойства error.cause с помощью Trace, как описано в разделе Распространенные шаги диагностики.
    2. Значения из примера трассировки:

      • Content-Encoding: gzip
      • error.cause: Not in GZIP format

      Значение в заголовке запроса Content-Encoding – gzip, однако полезная нагрузка запроса не в формате GZIP (как указано в error.cause). Поэтому Apigee Edge возвращает код ошибки messaging.adaptors.http.flow.DecompressionFailureAtRequest и объект 400 Bad Request.

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

    Чтобы проверить запрос:

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

    1. Определите значение, переданное в заголовок запроса Content-Encoding.
    2. Определите формат полезной нагрузки, отправляемой в составе запроса.
    3. Если значение заголовка Content-Encoding есть в списке поддерживаемых кодировок, но формат полезной нагрузки запроса не соответствует кодировке, указанной в заголовке Content-Encoding, то это и является причиной проблемы.

      Пример запроса

      curl -v "http://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.zip
      

      В приведенном выше примере запроса значение gzip отправляется в заголовок Content-Encoding, который является поддерживаемой кодировкой в Apigee Edge. Однако полезная нагрузка запросаrequest_payload.zip имеет формат ZIP. Поэтому этот запрос завершается неудачно с кодом статуса 400 Bad Request и кодом ошибки messaging.adaptors.http.flow.DecompressionFailureAtRequest.

    Журналы процессора сообщений

    Чтобы проверить данные с помощью журналов Message Processor, выполните следующие действия:

    Если вы используете Private Cloud, то можете определить ключевую информацию об ошибках HTTP 400 с помощью журналов Message Processor.

    1. Определите идентификатор сообщения для запроса, который не удалось выполнить, с помощью API Monitoring, инструмента трассировки или журналов доступа NGINX, как описано в разделе Общие шаги диагностики.
    2. Найдите идентификатор сообщения в журнале Message Processor:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. Вы увидите одно из следующих исключений:

      Сценарий 1

      Сценарий 1. Запрос к API содержит заголовок Content-Encoding: gzip

      2021-07-28 10:21:16,861  NIOThread@0 ERROR HTTP.SERVER -
      HTTPServer$Context.onInputException() : Message id:rt-57-1
      SSLClientChannel[Accepted: Remote:192.168.199.8:8443
      Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0
      bytesWritten=28764 age=2739893ms  lastIO=0ms
      isOpen=true.onExceptionRead exception: {}
      java.util.zip.ZipException: Not in GZIP format
      
      2021-07-28 10:21:16,862  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() : Request:POST, uri:/test,
      message Id:rt-57-1, exception:java.util.zip.ZipException: Not in GZIP format,
      context:Context@71ea5ac input=ClientInputChannel(SSLClientChannel[Accepted:
      Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1
      bytesRead=0 bytesWritten=28764 age=2739894ms  lastIO=0ms  isOpen=true)
      2021-07-28 10:21:16,862  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() :
      Exception java.util.zip.ZipException: Not in GZIP format occurred while writing
      to channel null
      2021-07-28 10:21:16,863  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: Not in GZIP format
      

      Строка java.util.zip.ZipException: Not in GZIP format в приведенном выше сообщении об ошибке указывает на то, что полезная нагрузка запроса не отправлена в формате GZIP, хотя в качестве значения параметра Content-Encoding указан gzip. Поэтому Apigee Edge вызывает исключение и возвращает клиентским приложениям код статуса 400 с кодом ошибки messaging.adaptors.http.flow.DecompressionFailureAtRequest.

      Сценарий 2

      Сценарий 2. Запрос к API содержит заголовок Content-Encoding: deflate

      2021-07-28 15:26:31,893  NIOThread@1 ERROR HTTP.SERVER -
      HTTPServer$Context.onInputException() : Message id:rt-47875-1
      SSLClientChannel[Accepted: Remote:192.168.199.8:8443
      Local:192.168.81.72:45954]@29276 useCount=1 bytesRead=0
      bytesWritten=37230 age=3498856ms  lastIO=1ms
      isOpen=true.onExceptionRead exception: {}
      java.util.zip.ZipException: incorrect header check
                        ….
      Caused by: java.util.zip.DataFormatException: incorrect header check
             ..
      2021-07-28 15:26:31,894  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() : Request:POST, uri:/test,
      message Id:rrt-47875-1, exception:java.util.zip.ZipException:
      incorrect header check, context:Context@69b3ac45
      input=ClientInputChannel(SSLClientChannel[Accepted:
      Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276
      useCount=1 byt	esRead=0 bytesWritten=37230 age=3498856ms
      lastIO=1ms  isOpen=true)
      

      Строки java.util.zip.ZipException: incorrect header check и Caused by: java.util.zip.DataFormatException: incorrect header check в приведенном выше сообщении об ошибке указывают, что полезная нагрузка запроса не отправлена в формате deflate и не соответствует кодировке, указанной в заголовке Content-Encoding deflate. Поэтому Apigee Edge вызывает исключение и возвращает клиентским приложениям код статуса 400 с кодом ошибки messaging.adaptors.http.flow.DecompressionFailureAtRequest.

Разрешение

  1. Если сжатый запрос не нужен в потоке прокси API в Apigee Edge и на внутреннем сервере, не передавайте заголовок Content-Encoding. Если необходимо сжать полезную нагрузку запроса, перейдите к шагу 2.
  2. Убедитесь, что клиентское приложение всегда отправляет следующие данные:
    • поддерживаемую кодировку в качестве значения заголовка Content-Encoding в запросе.
    • Полезная нагрузка запроса в поддерживаемом формате для Apigee Edge соответствует формату кодировки, указанному в заголовке Content-Encoding.
  3. В примере выше полезная нагрузка запроса имеет формат ZIP, но в заголовке запроса указано Content-Encoding: gzip. Чтобы устранить проблему, отправьте заголовок запроса как Content-Encoding: gzip, а полезную нагрузку запроса – в формате gzip:
    curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
    

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

Apigee Edge отвечает кодом статуса 400 Bad Request с кодом ошибки messaging.adaptors.http.flow.DecompressionFailureAtRequest в соответствии со следующими спецификациями RFC:

Спецификация
RFC 7231, раздел 6.5.1
RFC 7231, раздел 3.1.2.2

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

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

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

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

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

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

  • Полное сообщение об ошибке, которое появляется при неудачных запросах.
  • Название среды
  • Пакет прокси API
  • Файл трассировки для запросов к API
  • Журналы доступа NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

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

  • Системные журналы Message Processor /opt/apigee/var/log/edge-message-processor/logs/system.log