502 La puerta de enlace es incorrecta - DescompresiónFailureAtResponse

Estás viendo la documentación de Apigee Edge.
Ve a la Documentación de Apigee X.
información

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 la API llamadas.

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 veas 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 de respuesta HTTP (desde el servidor de destino o backend) Content-Encoding es válido y compatibles con Apigee Edge,
  • PERO

  • El formato de carga útil que envía el servidor de destino o backend como parte de la respuesta HTTP no Debe coincidir 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 usando la codificación especificada, ya que el 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 se espera que la representación de la carga útil sea en esos casos:

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

El formato gzip de Unix

Consulta Formato GZIP RFC1952.

Codificación única disminuir

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

Consulta RFC1950 y RFC1951.

Codificación múltiple

Codificación múltiple

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

  • gzip, deflate
  • gzip y gzip
  • deflate, gzip
  • desinflar, reducir
Se aplicó una codificación múltiple a la carga útil en el orden especificado, 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 respuesta no coincide con la codificación de contenido El formato de la carga útil de la respuesta que envía el servidor de destino o backend es no está codificado o no tiene coincida con la codificación especificada en el encabezado Content-Encoding. Usuarios perimetrales de nubes públicas y privadas

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 API, haz lo siguiente:

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

  3. Navega a Analyze > 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é configurado en Todos.
  6. Traza Código de error en Tiempo.
  7. Selecciona una celda que tenga el código de error messaging.adaptors.http.flow.DecompressionFailureAtResponse como como se muestra a continuación:

    ( ver imagen más grande)

  8. Información sobre el código de falla messaging.adaptors.http.flow.DecompressionFailureAtResponse se muestra 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 502.

    ( ver imagen más grande)

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

Herramienta de seguimiento

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

  1. Habilita la sesión de seguimiento. y:
    1. Espera a que se produzca el error 502 Bad Gateway.
    2. Si puedes reproducir el problema, realiza la llamada a la API y reprodúcelo. 502 Bad Gateway
  2. Asegúrate de que Show all FlowInfos esté habilitado:

  3. Selecciona una de las respuestas que fallan y examina el seguimiento.
  4. Navega por las diferentes fases del seguimiento y localiza dónde se produjo la falla para determinar si se produjo un error.
  5. Generalmente, encontrarás el error en un flujo justo después de Respuesta recibida del servidor de destino, como se muestra a continuación:

    ( ver imagen más grande)

  6. Toma nota de los valores de las propiedades del seguimiento:

    • Codificación del contenido: 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 errores justo después de la Respuesta recibida del servidor de destino. fase:

    ( ver imagen más grande)

    Observa las propiedades:

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

      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 respuesta estuviera en formato GZIP, ya que se especificó en el encabezado Content-Encoding (determinado en Por lo tanto, Apigee Edge no puede descomprimir la carga útil con gzip y muestra el error Decompression failure at response.

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

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

    ( ver imagen más grande)

    Ten en cuenta los siguientes detalles del seguimiento:

    • 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 seguimiento y hago clic en ella.

  10. Desplázate hacia abajo hasta la sección Detalles de la fase, Encabezados del error y determinar 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 X-Apigee-fault-code y X-Apigee-fault-source. como messaging.adaptors.http.flow.DecompressionFailureAtResponse y target, lo que indica que el formato de la carga útil de la respuesta no coincidió con específica 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 un usuario de la nube privada, puedes usar los registros de acceso de NGINX para Determinar la información clave sobre los errores 502 de HTTP.
  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. Realiza una búsqueda para ver si hay algún error 502 durante una duración específica (si el problema ocurrió en el pasado) o si las respuestas siguen fallando 502
  4. Si encuentras algún error 502 con el código X-Apigee-fault-code coincide con el valor de messaging.adaptors.http.flow.DecompressionFailureAtResponse, Luego, determina el valor de la 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 la codificación de contenido

De forma predeterminada, Apigee Edge siempre descomprime la carga útil si el encabezado de respuesta Content-Encoding contiene un valor válido y un la codificación compatible. Por lo tanto, se espera que el formato de la carga útil de la respuesta debe coincidir con la codificación especificada en el encabezado de respuesta Content-Encoding. Si hay una discrepancia, verás este error.

Diagnóstico

  1. Determina el código de error y la fuente de errores del error observado con la API. los registros de acceso de Monitoring, Trace o NGINX, como se explica en Pasos comunes del diagnóstico.
  2. Si el Código de error es messaging.adaptors.http.flow.DecompressionFailureAtResponse y las La fuente del error tiene el valor target y, luego, este. indica que el formato de la carga útil de la respuesta enviada por el servidor de destino o backend no coincide con . la codificación compatible especificada en el encabezado de respuesta Content-Encoding.
  3. Puedes determinar la falta de coincidencia como parte de la respuesta HTTP usando una de las siguientes opciones: métodos:

    Mensaje de error

    Para validar 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, muestra "Decompression failure at response", lo que implica que la respuesta no se pudo descomprimir mediante la codificación especificada en el Content-Encoding.

    Trace

    Para validar con Trace, sigue estos pasos:

    1. Determina el Content-Type y error.cause con Trace como se explica en Pasos comunes del 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 respuesta Content-Encoding es gzip. Sin embargo, la carga útil de la respuesta no está en formato GZIP. (como lo indica error.cause). Por lo tanto, Apigee Edge responde con 502 Bad Gateway y 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ó al servidor de destino o backend y realiza los siguientes pasos:

    1. Si eres un usuario de una nube pública o privada, realiza una solicitud. directamente al servidor de backend desde el propio servidor de backend o cualquier otro desde donde puedes hacer solicitudes al servidor backend.
    2. Si eres un usuario de la Nube privada, también puedes hacer la solicitud al servidor de backend desde uno de los Message Processor.
    3. Examina la respuesta enviada por el servidor de backend y determina el valor se pasa el encabezado de respuesta Content-Encoding.
    4. Determinar el formato de la carga útil enviada como parte de la solicitud
    5. Si el valor del encabezado Content-Encoding está en la lista de codificación compatible, pero el formato de la carga útil de la respuesta sí no coincide con la codificación especificada en el encabezado Content-Encoding. esa es la causa del problema.

      Muestra:

      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 Content-Encoding, que es un la codificación compatible en Apigee Edge. Sin embargo, el Se envía response_payload.zip como archivo ZIP. Por lo tanto, este falla con un error 502 Bad Gateway con el código de error: messaging.adaptors.http.flow.DecompressionFailureAtResponse

    Registros del procesador de mensajes

    Para realizar la validación con 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 sobre los errores 502 de HTTP.

    1. Revisa el registro de Message Processor:

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

    2. Realiza una búsqueda para ver si hay algún error 502 durante una acción específica duración (si el problema ocurrió en el pasado) o si hay respuestas Sigue fallando 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 respuesta la carga útil no se envía en formato GZIP, aunque la 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 envió en reducir el formato y no coincide con la codificación especificada en el Content-Encoding encabezado de reducción. Por lo tanto, Apigee Edge arroja la excepción y muestra un código de estado 502 con código de falla messaging.adaptors.http.flow.DecompressionFailureAtResponse a las aplicaciones cliente.

Solución

  1. Si no se necesita la carga útil de respuesta comprimida en el flujo del proxy de 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 respuesta, ve al paso 2.
  2. Si es necesario comprimir la carga útil de la respuesta, asegúrate de que el servidor backend siempre envía lo siguiente:
    • Cualquiera de los Codificación admitida como el valor del encabezado Content-Encoding en el respuesta
    • La carga útil de respuesta en el formato admitido para Apigee Edge coincide con la codificación formato 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 respuesta especifica Content-Encoding: gzip. Para solucionar el problema, envía la respuesta el encabezado como Content-Encoding: gzip y la carga útil de respuesta en gzip formato:
    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 con el código de error. messaging.adaptors.http.flow.DecompressionFailureAtResponse según el siguiente RFC específicas:

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

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

Se debe recopilar información de diagnóstico

Obtén 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
  • Completa el comando curl que se usa para reproducir el error 502
  • Archivo de seguimiento de las respuestas de la API

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

  • Mensaje de error completo observado para las respuestas fallidas
  • Nombre del entorno
  • Paquete de proxy de API
  • Archivo de seguimiento 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 del procesador de mensajes /opt/apigee/var/log/edge-message-processor/logs/system.log