502 La puerta de enlace es incorrecta - DescompresiónFailureAtResponse

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 502 Bad Gateway con el código de error messaging.adaptors.http.flow.DecompressionFailureAtResponse 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 502 Bad Gateway

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

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

Causas posibles

Este error ocurre solo si se cumplen estas condiciones:

  • La codificación especificada en el encabezado Content-Encoding de la respuesta HTTP (del servidor de destino o backend) es válida y compatible con Apigee Edge.
  • PERO

  • El formato de carga útil que envía el servidor de backend o de destino como parte de la respuesta 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 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 se represente la carga útil en esos casos:

Situación Content-Encoding Representación de la carga útil
Codificación única gzip

Es el formato gzip de Unix.

Consulta RFC1952 GZIP Format.

Codificación única deflate

Este formato usa la estructura zlib con el algoritmo de compresión deflate.

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 lo siguiente:

  • gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • deflate, deflate
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 la carga útil de la respuesta no coincide con Content-Encoding El formato de la carga útil de la respuesta que envía el servidor de backend o de destino 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:

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

  3. Navega a la página Analizar > Supervisión de API > Investigar.
  4. Selecciona el período específico en el que observaste los errores.
  5. Asegúrate de que el filtro Proxy esté establecido en All.
  6. Representa gráficamente el código de falla en función del tiempo.
  7. Selecciona una celda que tenga el código de falla messaging.adaptors.http.flow.DecompressionFailureAtResponse, como se muestra a continuación:

    ( aumentar el tamaño de la imagen)

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

    ( aumentar el tamaño de la imagen)

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

    ( aumentar el tamaño de la imagen)

  10. En la ventana Registros, ten en cuenta los siguientes detalles:
    • Código de estado: 502
    • Fuente del error: target
    • Código de falla: messaging.adaptors.http.flow.DecompressionFailureAtResponse.
  11. Si la Fuente de error tiene el valor target, significa que el formato de carga útil de la respuesta no coincidió con la codificación compatible especificada en el encabezado de respuesta del servidor de backend Content-Encoding.

Herramienta de Trace

Para diagnosticar el error con la herramienta Trace, haz lo siguiente:

  1. Habilita la sesión de registro y realiza una de las siguientes acciones:
    1. Espera a que se produzca el error 502 Bad Gateway.
    2. Si puedes reproducir el problema, realiza la llamada a la API y reproduce 502 Bad Gateway.
  2. Asegúrate de que la opción Mostrar todos los FlowInfos esté habilitada:

  3. Selecciona una de las respuestas con errores y examina el registro.
  4. Navega por las diferentes fases del registro y ubica dónde se produjo la falla.
  5. Por lo general, encontrarás el error en un flujo justo después de la fase Response Received from target server, como se muestra a continuación:

    ( aumentar el tamaño de la imagen)

  6. Ten en cuenta los valores de las propiedades del registro:

    • Content-Encoding: gzip
    • Cuerpo del contenido de la respuesta: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. Navega a la fase de error justo después de la fase Response Received from target server:

    ( aumentar el tamaño de la imagen)

    Ten en cuenta las propiedades:

    • error: Decompression failure at response
    • error.class: com.apigee.errors.http.server.BadGateway
    • error.cause: Not in GZIP format

      El campo error.cause indica que la carga útil de la respuesta no está en formato GZIP. Esto significa que Apigee Edge esperaba que la carga útil de la respuesta estuviera en formato GZIP, como se especificó en el encabezado Content-Encoding (determinado en el paso anterior).Por lo tanto, Apigee Edge no puede descomprimir la carga útil con gzip y devuelve el error Decompression failure at response.

    Ten en cuenta que la respuesta del servidor de destino o de backend es 200 en este caso. Sin embargo, la aplicación cliente recibirá una respuesta 502, ya que Apigee Edge devuelve el error.

  8. Navega a la fase Response Sent to Client en el registro y haz clic en ella.

    ( aumentar el tamaño de la imagen)

    Ten en cuenta los siguientes detalles del registro:

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

  10. 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)

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

NGINX

Para diagnosticar el error con los registros de acceso de NGINX, haz lo siguiente:

  1. 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 502.
  2. Verifica los registros de acceso de NGINX:

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

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

  3. Busca si hay errores de 502 durante un período específico (si el problema ocurrió en el pasado) o si hay respuestas que aún fallan con 502.
  4. Si encuentras errores de 502 con el X-Apigee-fault-code que coincida con el valor de messaging.adaptors.http.flow.DecompressionFailureAtResponse, determina el valor de X-Apigee-fault-source.

    Ejemplo de error 502 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.DecompressionFailureAtResponse
    X-Apigee-fault-source target

Causa: El formato de la carga útil de la respuesta no coincide con Content-Encoding

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

Diagnóstico

  1. 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.
  2. Si el código de error es messaging.adaptors.http.flow.DecompressionFailureAtResponse y la fuente del error tiene el valor target, esto indica que el formato de la carga útil de la respuesta que envía el servidor de backend o de destino no coincide con la codificación compatible especificada en el encabezado de respuesta Content-Encoding.
  3. Puedes determinar la discrepancia como parte de la respuesta HTTP con uno de los siguientes métodos:

    Mensaje de error

    Para realizar la validación con el mensaje de error, haz lo siguiente:

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

      Ejemplo de mensaje de error:

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

    Seguimiento

    Para validar con Trace, haz lo siguiente:

    1. Determina Content-Type y error.cause con Trace como se explica en Pasos de diagnóstico comunes.
    2. Los valores del registro de muestra son los siguientes:

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

      El valor del encabezado de respuesta Content-Encoding es gzip; sin embargo, la carga útil de la respuesta no está en formato GZIP (como se indica en error.cause). Por lo tanto, Apigee Edge responde con 502 Bad Gateway y el código de error messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    Solicitud real

    Para validar con la solicitud real, haz lo siguiente:

    Si tienes acceso a la solicitud real que se realizó a la aplicación del servidor de destino o de backend, sigue estos pasos:

    1. Si eres usuario de nube pública o privada, realiza una solicitud directamente al servidor de backend desde el mismo servidor o cualquier otra máquina desde la que se te permita realizar la solicitud al servidor de backend.
    2. Si eres usuario de la nube privada, también puedes realizar la solicitud al servidor de backend desde uno de los procesadores de mensajes.
    3. Examina la respuesta que envió el servidor de backend y determina el valor que se pasó en el encabezado de respuesta Content-Encoding..
    4. Determina el formato de la carga útil que se envía como parte de la solicitud.
    5. Si el valor del encabezado Content-Encoding se encuentra en la lista de codificaciones compatibles, pero el formato de la carga útil de la respuesta no coincide con la codificación especificada en el encabezado Content-Encoding, esa es la causa del problema.

      Ejemplo:

      curl -v https://HOSTALIAS/test
      

      ***trimmed***
      >
      < HTTP/1.1 200 OK
      < Accept-Ranges: bytes
      < Content-Encoding: gzip
      < Date: Mon, 02 Aug 2021 08:17:35 GMT
      < Transfer-Encoding: chunked
      <
      < response_payload.zip Response Body(not in GZIP format)>
      

      La respuesta de ejemplo anterior envía el valor gzip al encabezado Content-Encoding, que es una codificación compatible en Apigee Edge. Sin embargo, el archivo response_payload.zip se envía como un archivo ZIP. Por lo tanto, esta respuesta falla con un error 502 Bad Gateway y el código de error messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    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 502.

    1. Verifica el registro del Message Processor:

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

    2. Busca si hay errores de 502 durante un período específico (si el problema ocurrió en el pasado) o si hay respuestas que aún fallan con 502. Puedes usar la siguiente cadena de búsqueda:

      grep -ri "ZipException"
      
    3. Encontrarás líneas de system.log similares a las siguientes:

      Situación 1

      Situación 1: Cuando la respuesta de la API tiene el encabezado Content-Encoding: gzip

      2021-08-02 06:50:25,433  NIOThread@2 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:10.0.115.32:41298]@38140 useCount=1 bytesRead=0
      bytesWritten=203 age=469ms  lastIO=0ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: Not in GZIP format
      ---trimmed--
      2021-08-02 06:50:25,433  NIOThread@2 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details : host=null
      path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:50:25,434  NIOThread@2 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@4806fdab, Not in GZIP format)
      2021-08-02 06:50:25,434  NIOThread@2 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: Not in GZIP format
      occurred while writing to channel null
      2021-08-02 06:50:25,434  NIOThread@2 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 respuesta no se envía en formato GZIP, aunque Content-Encoding se especifica como gzip. Por lo tanto, Apigee Edge arroja la excepción y devuelve un código de estado 502 con el código de falla messaging.adaptors.http.flow.DecompressionFailureAtResponse a las aplicaciones cliente.

      Situación 2

      Situación 2: Cuando la respuesta de la API tiene el encabezado Content-Encoding: deflate

      2021-08-02 06:35:21,215  NIOThread@0 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:192.168.194.140:35224]@36014 useCount=1 bytesRead=0
      bytesWritten=202 age=439ms  lastIO=2ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: incorrect header check
      ---trimmed----
      Caused by:
      java.util.zip.DataFormatException: incorrect header check
      ---trimmed---
      2021-08-02 06:35:21,215  NIOThread@0 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details :
      host=null path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:35:21,216  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@3966e277,
      incorrect header check)
      2021-08-02 06:35:21,216  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: incorrect header check occurred while writing to channel null
      2021-08-02 06:35:21,217  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: incorrect header check
      
      

      Las líneas java.util.zip.ZipException: incorrect header check y Caused by: java.util.zip.DataFormatException: incorrect header check en el mensaje de error anterior indican que la carga útil de la respuesta no se envía en formato deflate y no coincide con la codificación especificada en el encabezado Content-Encoding de deflate. Por lo tanto, Apigee Edge arroja la excepción y devuelve un código de estado 502 con el código de falla messaging.adaptors.http.flow.DecompressionFailureAtResponse a las aplicaciones cliente.

Solución

  1. Si no es necesario el cuerpo de la respuesta comprimida 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 respuesta, ve al paso 2.
  2. Si es necesario comprimir la carga útil de la respuesta, asegúrate de que el servidor de backend siempre envíe lo siguiente:
    • Cualquiera de las codificaciones admitidas como valor del encabezado Content-Encoding en la respuesta
    • La carga útil de respuesta 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 respuesta está en formato ZIP, pero el encabezado de la respuesta especifica Content-Encoding: gzip. Para solucionar el problema, envía el encabezado de respuesta como Content-Encoding: gzip y la carga útil de la respuesta en formato gzip:
    curl -v https://HOSTALIAS/v1/test
    
    >
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Content-Encoding: gzip
    < Date: Mon, 02 Aug 2021 08:17:35 GMT
    < Transfer-Encoding: chunked
    <
    < response_payload.gz Response Body(in GZIP format)>
    

Especificación

Apigee Edge responde con el código de estado 502 Bad Gateway y el código de error messaging.adaptors.http.flow.DecompressionFailureAtResponse 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 curl completo que se usó para reproducir el error 502
  • Archivo de registro de las respuestas de la API

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

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

    Dó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