Estás viendo la documentación de Apigee Edge.
Ir a la documentación de
Apigee X. info
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 observes 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 la solicitud HTTP
Content-Encodinges válida y compatible con Apigee Edge. - El formato de carga útil que envía el cliente como parte de la solicitud HTTP no coincide con el formato de codificación especificado en el encabezado
Content-Encoding
PERO
Esto se debe a que Apigee Edge no puede decodificar la carga útil con la codificación especificada, ya que el formato de la carga útil no coincide con el formato de codificación especificado en el encabezado Content-Encoding.
Estos son algunos ejemplos de valores de Content-Encodingadmitidos y cómo Apigee Edge espera que sea el formato de la carga útil en esos casos:
| Situación | Content-Encoding | Formato de carga útil esperado |
|---|---|---|
| Codificación única | gzip | Es el formato Consulta RFC1952 GZIP Format. |
| Codificación única | deflate | Este formato usa la estructura |
| Codificación múltiple | Codificación múltiple Por ejemplo, en los casos en que la codificación se realiza dos veces, puede ser lo siguiente:
|
Se aplica codificación múltiple a la carga útil en el orden indicado, tal 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 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 envía 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 API Monitoring, haz lo siguiente:
- Accede a la IU de Apigee Edge como usuario con un rol adecuado.
Cambia a la organización en la que deseas investigar el problema.
- Navega a la página Analizar > Supervisión de API > Investigar.
- Selecciona el período específico en el que observaste los errores.
- Asegúrate de que el filtro Proxy esté establecido en All.
- Representa gráficamente el código de falla en función del tiempo.
Selecciona una celda que tenga el código de falla
messaging.adaptors.http.flow.DecompressionFailureAtRequest, como se muestra a continuación:( aumentar el tamaño de la imagen)
La información sobre el código de falla
messaging.adaptors.http.flow.DecompressionFailureAtRequestse muestra como se indica a continuación:( aumentar el tamaño de la imagen)
Haz clic en Ver registros y expande la fila que falla con el error
400.( aumentar el tamaño de la imagen)
- En la ventana Registros, ten en cuenta los siguientes detalles:
- Código de estado:
400 - Fuente del error:
proxy - Código de falla:
messaging.adaptors.http.flow.DecompressionFailureAtRequest.
- Código de estado:
- Si la Fuente de la falla tiene el valor
proxy, esto indica que el formato de carga útil de la solicitud no coincidió con la codificación compatible especificada en el encabezadoContent-Encoding.
Herramienta de Trace
Para diagnosticar el error con la herramienta Trace, haz lo siguiente:
- Habilita la sesión de registro y realiza una de las siguientes acciones:
- Espera a que se produzca el error
400 Bad Request. - Si puedes reproducir el problema, realiza la llamada a la API y reproduce
400 Bad Request.
- Espera a que se produzca el error
Asegúrate de que la opción Mostrar todos los FlowInfos esté habilitada:
- Selecciona una de las solicitudes con errores y examina el registro.
- Navega por las diferentes fases del registro y ubica dónde se produjo la falla.
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:
( aumentar el tamaño de la imagen)
-
Ten en cuenta los valores de las propiedades del registro:
- 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. - error:
Determina el valor del encabezado de la solicitud
Content-Encoding. Para ello, navega a la fase Request Received from Client, como se muestra a continuación:( aumentar el tamaño de la imagen)
Ten en cuenta que el valor del encabezado de la solicitud
Content-Encodinges, de hecho,gzip.El registro de seguimiento de ejemplo anterior muestra que la codificación especificada en el encabezado de la solicitud
Content-Encodingesgzip; sin embargo, la carga útil de la solicitud no está en formato GZIP. Por lo tanto, Apigee no puede descomprimir la carga útil con gzip y devuelve el errorDecompression failure at request.- Ten en cuenta el código de estado y el mensaje de error que muestra Apigee Edge. Para ello, navega a
a la fase Response Sent to Client en el registro, como se muestra a continuación:
( aumentar el tamaño de la imagen)
Ten en cuenta los siguientes detalles del registro:
- Código de estado:
400 Bad Request. - Contenido del error:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- Código de estado:
Navega a la fase AX (datos de Analytics registrados) en el registro y haz clic en ella.
- Desplázate hacia abajo hasta las secciones Phase Details y Error Headers, y determina los valores de X-Apigee-fault-code y X-Apigee-fault-source, como se muestra a continuación:
( aumentar el tamaño de la imagen)
- Verás los valores de X-Apigee-fault-code y X-Apigee-fault-source como
messaging.adaptors.http.flow.DecompressionFailureAtRequestypolicy, lo que indica que el formato de la carga útil de la solicitud no coincidió con la codificación especificada en el encabezadoContent-Encoding.Encabezados de respuesta Valor X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
NGINX
Para diagnosticar el error con los registros de acceso de NGINX, haz lo siguiente:
- Si eres usuario de Private Cloud, puedes usar los registros de acceso de NGINX para determinar la información clave sobre los errores de HTTP
400. Verifica los registros de acceso de NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logDónde: ORG, ENV y PORT# se reemplazan por valores reales.
- Busca si hay errores de
400durante un período específico (si el problema ocurrió en el pasado) o si hay solicitudes que siguen fallando con400. Si encuentras errores de
400con el X-Apigee-fault-code que coincida con el valor demessaging.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-source:
Encabezados de respuesta Valor X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
Causa: El formato de la carga útil de la solicitud no coincide con la codificación especificada en el encabezado Content-Encoding
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 falta de coincidencia, recibirás este error.
Diagnóstico
- Determina el código de error y la fuente del error que se observó con la supervisión de API, la herramienta Trace o los registros de acceso de NGINX, como se explica en Pasos de diagnóstico comunes.
- Si el código de error es
messaging.adaptors.http.flow.DecompressionFailureAtRequesty la fuente del error tiene el valorpolicyoproxy, 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 solicitudContent-Encoding. Puedes determinar la discrepancia como parte de la solicitud HTTP con uno de los siguientes métodos:
Mensaje de error
Para realizar la validación con el mensaje de error, haz lo siguiente:
-
Si tienes acceso al mensaje de error completo que recibiste de Apigee Edge, consulta
faultstring.Ejemplo de mensaje de error:
"faultstring":"Decompression failure at request"
- En el mensaje de error anterior, se muestra
"Decompression failure at request", lo que implica que la solicitud no se pudo descomprimir con la codificación especificada en el encabezadoContent-Encoding.
Seguimiento
Para validar con Trace, haz lo siguiente:
- Determina el valor del encabezado de la solicitud Content-Encoding y la propiedad error.cause con Trace, como se explica en Pasos de diagnóstico comunes.
Los valores del registro de muestra son los siguientes:
- Content-Encoding:
gzip - error.cause:
Not in GZIP format
El valor del encabezado de la solicitud Content-Encoding es gzip; sin embargo, la carga útil de la solicitud no está en formato GZIP (como se indica en error.cause). Por lo tanto, Apigee Edge responde con
400 Bad Requesty el código de errormessaging.adaptors.http.flow.DecompressionFailureAtRequest.- Content-Encoding:
Solicitud real
Para validar con la solicitud real, haz lo siguiente:
Si tienes acceso a la solicitud real que realizó la aplicación cliente, sigue estos pasos:
- Determina el valor que se pasa al encabezado de la solicitud
Content-Encoding. - Determina el formato de la carga útil que se envía como parte de la solicitud.
Si el valor del encabezado
Content-Encodingse encuentra en la lista de codificaciones compatibles, pero el formato de la carga útil de la solicitud no coincide con la codificación especificada en el encabezadoContent-Encoding, esa es la causa del problema.Solicitud de muestra:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"-X POST -d @request_payload.zipLa solicitud de muestra anterior envía el valor
gzipal encabezadoContent-Encoding, que es una codificación compatible en Apigee Edge. Sin embargo, la carga útil de la solicitudrequest_payload.zipestá en formato ZIP. Por lo tanto, esta solicitud falla con un código de estado400 Bad Requesty el código de errormessaging.adaptors.http.flow.DecompressionFailureAtRequest.
Registros de Message Processor
Para realizar la validación con los registros de Message Processor, haz lo siguiente:
Si eres usuario de Private Cloud, puedes usar los registros de Message Processor para determinar la información clave sobre los errores de HTTP
400.- Determina el ID del mensaje de la solicitud que falló con la Supervisión de API, la herramienta Trace o los registros de acceso de NGINX, como se explica en Pasos de diagnóstico comunes.
Busca el ID del mensaje en el registro de Message Processor:
/opt/apigee/var/log/edge-message-processor/logs/system.logVerá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() : Exceptionjava.util.zip.ZipException: Not in GZIP formatoccurred 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 formatLa línea
java.util.zip.ZipException: Not in GZIP formatdel mensaje de error anterior indica que la carga útil de la solicitud no se envía en formato GZIP, aunqueContent-Encodingse especifica como gzip. Por lo tanto, Apigee Edge arroja la excepción y devuelve un código de estado400con el código de fallamessaging.adaptors.http.flow.DecompressionFailureAtRequesta 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 checkyCaused by: java.util.zip.DataFormatException: incorrect header checken el mensaje de error anterior indican que la carga útil de la solicitud no se envía en formato deflate y no coincide con la codificación especificada en el encabezadoContent-Encodingde deflate. Por lo tanto, Apigee Edge arroja la excepción y devuelve un código de estado400con el código de fallamessaging.adaptors.http.flow.DecompressionFailureAtRequesta las aplicaciones cliente.
-
Solución
- Si no es necesario que la carga útil de la solicitud comprimida esté en el flujo del proxy de API en Apigee Edge ni 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. - Asegúrate de que la aplicación cliente siempre envíe lo siguiente:
- Cualquiera de las
codificaciones compatibles como valor del encabezado
Content-Encodingen 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
- Cualquiera de las
codificaciones compatibles como valor del encabezado
- 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 comoContent-Encoding: gzipy la carga útil de la solicitud también en formatogzip: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 y 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 ayuda del equipo de asistencia de Apigee, consulta Recopila 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 usuario de la nube pública, proporciona la siguiente información:
- Nombre de la organización
- Nombre del entorno
- Nombre del proxy de API
- Comando
curlcompleto que se usó para reproducir el error400 - Archivo de registro de las solicitudes a la API
Si eres 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 registro de las solicitudes a la API
Registros de acceso de NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logDónde: ORG, ENV y PORT# se reemplazan por valores reales.
- Registros del sistema de Message Processor
/opt/apigee/var/log/edge-message-processor/logs/system.log