Error 400 de solicitud incorrecta - DescompresiónFailureAtRequest

Estás consultando la documentación de Apigee Edge.
Consulta la documentación de Apigee X.
Información

Síntoma

La aplicación cliente obtiene un código de estado HTTP de 400 Bad Request con el código de error messaging.adaptors.http.flow.DecompressionFailureAtRequest como respuesta a las llamadas a la API.

Mensaje de error

La aplicación cliente obtiene el siguiente código de respuesta:

HTTP/1.1 400 Bad Request

Además, es posible que veas un mensaje de error similar al que se muestra a continuación:

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

Causas posibles

Este error ocurre solo si se cumplen estas condiciones:

  • La codificación especificada en el encabezado de solicitud HTTP Content-Encoding es válida y es compatible con Apigee Edge.
  • PERO

  • El formato de carga útil que envió el cliente como parte de la solicitud HTTP no coincide con el formato de codificación especificado en el encabezado Content-Encoding .

Esto se debe a que Apigee Edge no puede decodificar la carga útil mediante la codificación especificada, ya que el formato de la carga útil no tiene el mismo formato que la codificación especificada en el encabezado Content-Encoding.

Estos son algunos ejemplos de valores Content-Encoding admitidos y cómo Apigee Edge espera que sea el formato de carga útil en esos casos:

Situación Content-Encoding Formato de carga útil esperado
Codificación única gzip

El formato gzip de Unix.

Consulta el formato GZIP RFC1952.

Codificación única reducir deflación

Este formato usa la estructura zlib con el algoritmo de compresión de reducción de tamaño.

Consulta RFC1950 y RFC1951.

Codificación múltiple

Codificación múltiple

Por ejemplo, en los casos en que la codificación se realiza dos veces, puede ser:

  • gzip, deflate
  • gzip y gzip
  • deflate, gzip
  • deflar, deflar
Codificación múltiple aplicada a la carga útil en el orden determinado como aparece en el encabezado.

Las posibles causas de este error son las siguientes:

Causa Descripción Instrucciones de solución de problemas aplicables para
El formato de la carga útil de la solicitud no coincide con la codificación especificada en el encabezado Content-Encoding El formato de la carga útil de la solicitud que envió el cliente no está codificado o no coincide con la codificación especificada en el encabezado Content-Encoding. Usuarios de la nube pública y privada de Edge

Pasos comunes de diagnóstico

Usa una de las siguientes herramientas o técnicas para diagnosticar este error:

Supervisión de API

Para diagnosticar el error con la supervisión de la API, sigue estos pasos:

  1. Accede a la IU de Apigee Edge como un usuario con el rol adecuado.
  2. Cambia a la organización en la que quieres investigar el problema.

  3. Navega a la página Analyze > API Monitoring > Investigate.
  4. Selecciona el período específico en el que observaste los errores.
  5. Asegúrate de que el filtro Proxy esté configurado en Todos.
  6. Traza el código de falla en función del valor Time.
  7. Selecciona una celda que tenga el código de falla messaging.adaptors.http.flow.DecompressionFailureAtRequest, como se muestra a continuación:

    ( ver imagen más grande)

  8. Se muestra información sobre el código de falla messaging.adaptors.http.flow.DecompressionFailureAtRequest como se muestra a continuación:

    ( ver imagen más grande)

  9. Haz clic en Ver registros y expande la fila que falla con el error 400.

    ( ver imagen más grande)

  10. En la ventana Registros, ten en cuenta los siguientes detalles:
    • Código de estado: 400
    • Fuente de la falla: proxy
    • Código de fallas: messaging.adaptors.http.flow.DecompressionFailureAtRequest.
  11. Si la fuente de errores tiene el valor proxy, eso indica que el formato de la carga útil de la solicitud no coincidió con la codificación compatible especificada en el encabezado Content-Encoding.

Herramienta de seguimiento

Para diagnosticar el error con la herramienta Trace, sigue estos pasos:

  1. Habilita la sesión de seguimiento y realiza una de estas acciones:
    1. Espera a que ocurra el error 400 Bad Request.
    2. Si puedes reproducir el problema, realiza la llamada a la API y reproduce 400 Bad Request.
  2. Asegúrate de que la opción Show all FlowInfos esté habilitada:

  3. Selecciona una de las solicitudes con errores y examina el seguimiento.
  4. Navega por las diferentes fases del seguimiento y localiza dónde ocurrió la falla.
  5. Por lo general, encontrarás el error en un flujo justo después de la fase Request Received from Client, como se muestra a continuación:

    ( ver imagen más grande)

  6. Observa los valores de las propiedades del seguimiento:

    • error: Decompression failure at request
    • error.class: com.apigee.rest.framework.BadRequestException
    • error.cause: Not in GZIP format

    El campo error.cause indica que la carga útil de la solicitud NO está en formato GZIP. Esto significa que Apigee Edge esperaba que la carga útil de la solicitud estuviera en formato GZIP como se habría especificado en el encabezado Content-Encoding.

  7. Determina el valor del encabezado de solicitud Content-Encoding. Para ello, navega a la fase Solicitud recibida del cliente (Request Received from Client), como se muestra a continuación:

    ( ver imagen más grande)

    Ten en cuenta que el valor del encabezado de solicitud Content-Encoding es realmente gzip.

    En el seguimiento de ejemplo anterior, se muestra que la codificación especificada en el encabezado de la solicitud Content-Encoding es gzip. Sin embargo, la carga útil de la solicitud no está en formato GZIP. Por lo tanto, Apigee no puede descomprimir la carga útil mediante gzip y muestra el error Decompression failure at request.

  8. Observa el código de estado y el mensaje de error que muestra Apigee Edge desde la navegación

    a la fase Response Sent to Client (Respuesta enviada al cliente) en el registro, como se muestra a continuación:

    ( ver imagen más grande)

    Observa los siguientes detalles del seguimiento:

    • Código de estado: 400 Bad Request.
    • Contenido del error: {"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
  9. Navega a la fase AX (datos registrados de Analytics) en el seguimiento y haz clic en ella.

  10. Desplázate hacia abajo hasta la sección Detalles de la fase, Encabezados de error y determina los valores de X-Apigee-fault-code y X-Apigee-fault-source como se muestra a continuación:

    ( ver imagen más grande)

  11. Verás los valores de X-Apigee-fault-code y X-Apigee-fault-source como messaging.adaptors.http.flow.DecompressionFailureAtRequest y policy, lo que indica que el formato de la carga útil de la solicitud no coincidió con la codificación especificada en el encabezado Content-Encoding.
    Encabezados de respuesta Valor
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
    X-Apigee-fault-source policy

NGINX

Para diagnosticar el error con los registros de acceso de NGINX, sigue estos pasos:

  1. Si eres un usuario de la nube privada, puedes usar los registros de acceso de NGINX para determinar la información clave de los errores HTTP 400.
  2. Verifica los registros de acceso de NGINX:

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

    Dónde: Se reemplazan ORG, ENV y PORT# por valores reales.

  3. Busca para ver si hay errores 400 durante un período específico (si el problema ocurrió en el pasado) o si hay alguna solicitud que aún falla con 400.
  4. Si encuentras algún error 400 con el código X-Apigee-fault-code que coincide con el valor de messaging.adaptors.http.flow.DecompressionFailureAtRequest, determina el valor de X-Apigee-fault-source.

    Ejemplo de error 400 del registro de acceso de NGINX:

    La entrada de ejemplo anterior del registro de acceso de NGINX tiene los siguientes valores para X-Apigee-fault-code y X-Apigee-fault-code

    Encabezados de respuesta Valor
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
    X-Apigee-fault-source policy

Causa: El formato de la carga útil de la solicitud no coincide con la codificación especificada en el encabezado Codificación de contenido.

De forma predeterminada, Apigee Edge siempre descomprime la carga útil si el encabezado de la solicitud Content-Encoding contiene una codificación válida y compatible. Por lo tanto, se espera que el formato de la carga útil de la solicitud coincida con la codificación especificada en el encabezado de la solicitud Content-Encoding. Si hay una discrepancia, aparecerá este error.

Diagnóstico

  1. Determina el código de error y la fuente de errores del error observado con la supervisión de la API, la herramienta de Trace o los registros de acceso de NGINX, como se explica en Pasos comunes de diagnóstico.
  2. Si el código de falla es messaging.adaptors.http.flow.DecompressionFailureAtRequest y la fuente de errores tiene el valor policy o proxy, esto indica que la solicitud enviada por la aplicación cliente tiene una carga útil que no coincide con la codificación compatible especificada en el encabezado de la solicitud Content-Encoding.
  3. Puedes determinar la falta de coincidencia como parte de la solicitud HTTP mediante uno de los siguientes métodos:

    Mensaje de error

    Para validar mediante el mensaje de error, haz lo siguiente:

    1. Si tienes acceso al mensaje de error completo que recibiste de Apigee Edge, consulta la faultstring.

      Ejemplo de mensaje de error:

      "faultstring":"Decompression failure at request"
      
    2. En el mensaje de error anterior, muestra "Decompression failure at request", lo que implica que no se pudo descomprimir la solicitud con la codificación especificada en el encabezado Content-Encoding.

    Trace

    Para validar el uso de Trace, sigue estos pasos:

    1. Determina el valor del encabezado de la solicitud Content-Encoding y la propiedad error.Cause con Trace como se explica en Pasos comunes de diagnóstico.
    2. Los valores del seguimiento de muestra son los siguientes:

      • Codificación del contenido: gzip
      • error.cause: Not in GZIP format

      El valor en el encabezado de la solicitud Content-Encoding es gzip; sin embargo, la carga útil de la solicitud no está en formato GZIP (como lo indica error.Cause). Por lo tanto, Apigee Edge responde con 400 Bad Request y el código de error messaging.adaptors.http.flow.DecompressionFailureAtRequest.

    Solicitud real

    Para validar el uso de la solicitud real, sigue estos pasos:

    Si tienes acceso a la solicitud real que realizó la aplicación cliente, sigue estos pasos:

    1. Determina el valor que se pasa al encabezado de la solicitud Content-Encoding.
    2. Determina el formato de la carga útil enviada como parte de la solicitud.
    3. Si el valor del encabezado Content-Encoding está en la lista de codificación compatible, pero el formato de la carga útil de la solicitud no coincide con la codificación especificada en el encabezado Content-Encoding, esa es la causa del problema.

      Ejemplo de solicitud:

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

      La solicitud de ejemplo anterior envía el valor gzip al encabezado Content-Encoding, que es una codificación compatible en Apigee Edge. Sin embargo, la carga útil request_payload.zip de la solicitud está en formato ZIP. Por lo tanto, esta solicitud falla con un código de estado 400 Bad Request y el código de error messaging.adaptors.http.flow.DecompressionFailureAtRequest.

    Registros de Message Processor

    Para validar el uso de los registros de Message Processor, haz lo siguiente:

    Si eres un usuario de la nube privada, puedes usar los registros de Message Processor para determinar la información clave de los errores HTTP 400.

    1. Determina el ID del mensaje de la solicitud con errores mediante la supervisión de la API, la herramienta de Trace o los registros de acceso de NGINX, como se explica en Pasos comunes de diagnóstico.
    2. Busca el ID del mensaje en el registro de Message Processor:

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

    3. Verás una de las siguientes excepciones:

      Situación 1

      Situación 1: Cuando la solicitud a la API tiene el encabezado 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
      

      La línea java.util.zip.ZipException: Not in GZIP format del mensaje de error anterior indica que la carga útil de la solicitud no se envía en formato GZIP, aunque Content-Encoding se especifica como gzip. Por lo tanto, Apigee Edge genera la excepción y muestra un código de estado 400 con el código de falla messaging.adaptors.http.flow.DecompressionFailureAtRequest a las aplicaciones cliente.

      Situación 2

      Situación 2: Cuando la solicitud a la API tiene el encabezado 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)
      

      Las líneas java.util.zip.ZipException: incorrect header check y Caused by: java.util.zip.DataFormatException: incorrect header check del mensaje de error anterior indican que la carga útil de la solicitud no se envía en formato desinflado y no coincide con la codificación especificada en el encabezado Content-Encoding de reducción de tamaño. Por lo tanto, Apigee Edge genera la excepción y muestra un código de estado 400 con el código de falla messaging.adaptors.http.flow.DecompressionFailureAtRequest a las aplicaciones cliente.

Resolución

  1. Si no hay necesidad de la carga útil de solicitud comprimida en el flujo del proxy de la API en Apigee Edge y en el servidor de backend, no pases el encabezado Content-Encoding. Si es necesario comprimir la carga útil de la solicitud, ve al paso 2.
  2. Asegúrate de que la aplicación cliente siempre envíe lo siguiente:
    • Cualquiera de la codificación compatible como valor del encabezado Content-Encoding en la solicitud
    • La carga útil de la solicitud en el formato compatible con Apigee Edge coincide con el formato de codificación especificado en el encabezado Content-Encoding.
  3. En el ejemplo anterior, la carga útil de la solicitud está en formato ZIP, pero el encabezado de la solicitud especifica Content-Encoding: gzip. Para solucionar el problema, envía el encabezado de la solicitud como Content-Encoding: gzip y la carga útil de la solicitud también en formato gzip:
    curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
    

Especificación

Apigee Edge responde con el código de estado 400 Bad Request con el código de error messaging.adaptors.http.flow.DecompressionFailureAtRequest según las siguientes especificaciones de RFC:

Especificación
RFC 7231, sección 6.5.1
RFC 7231, sección 3.1.2.2

Si aún necesitas asistencia de la asistencia de Apigee, ve a Se debe recopilar información de diagnóstico.

Se debe recopilar información de diagnóstico

Recopila la siguiente información de diagnóstico y, luego, comunícate con el equipo de asistencia de Apigee Edge:

Si eres un usuario de la nube pública, proporciona la siguiente información:

  • Nombre de la organización
  • Nombre del entorno
  • Nombre del proxy de API
  • Completa el comando curl que se usa para reproducir el error 400.
  • Archivo de seguimiento para las solicitudes a la API

Si eres un usuario de la nube privada, proporciona la siguiente información:

  • Mensaje de error completo observado para las solicitudes con errores
  • Nombre del entorno
  • Paquete de proxy de API
  • Archivo de seguimiento para las solicitudes a la API
  • Registros de acceso de NGINX/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Dónde: Se reemplazan ORG, ENV y PORT# por valores reales.

  • Registros del sistema del procesador de mensajes /opt/apigee/var/log/edge-message-processor/logs/system.log