502 Bad Gateway - ResponseWithBody

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 502 Bad Gateway con el código de error protocol.http.ResponseWithBody 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 uno de los siguientes mensajes de error:

{
   "fault":{
      "faultstring":"Received 204 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}
{
   "fault":{
      "faultstring":"Received 205 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}

Causas posibles

Este error se produce si la respuesta HTTP del servidor de backend a Apigee Edge es 204 No Content o 205 Reset Content, pero contiene el cuerpo de la respuesta o uno o más de los siguientes encabezados:

  • Content-Length
  • Content-Encoding
  • Transfer-Encoding

Según las especificaciones RFC 7231, sección 6.3.5: 204 No Content y RFC 7231, sección 6.3.6: 205 Reset Content, se espera que el servidor de origen no envíe contenido adicional como parte del cuerpo de la carga útil de la respuesta con el código de estado 204 No Content o 205 Reset Content. Los encabezados de respuesta como Content-Length, Content-Encoding o Transfer-Encoding indican el tamaño, el tipo o el formato de la carga útil de la respuesta.

Por lo tanto, Apigee Edge muestra un código de estado 502 Bad Gateway con el código de error protocol.http.ResponseWithBody al cliente en las siguientes circunstancias:

Código de estado del servidor de backend
La respuesta del servidor de backend contiene 204 No Content 205 Reset Content
Cuerpo de la respuesta ERROR ERROR

Encabezado Content-Length

(establecido en un valor distinto de cero)

ERROR ERROR

Content-Encoding

(establecido en una codificación compatible en Apigee Edge)

ERROR NO ERROR
Transfer-Encoding ERROR ERROR

Estas son las posibles causas de este error:

Causa Descripción Instrucciones de solución de problemas aplicables para
Cuerpo de la respuesta o encabezados con respuesta 204 del servidor de backend El servidor de backend envía una respuesta 204 No Content o 205 Reset Content con un cuerpo de respuesta o uno o más de los encabezados Content-Type, Content-Encoding o Transfer-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 API, haz lo siguiente:

  1. Accede a la IU de Apigee Edge como usuario con una función adecuada.
  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. Traza el Código de falla en función del Tiempo.
  6. Selecciona una celda que tenga el código de falla protocol.http.ResponseWithBody como se muestra a continuación:

    ( aumentar el tamaño de la imagen)

  7. Verás la información sobre el código de falla protocol.http.ResponseWithBody como se muestra a continuación:

    ( aumentar el tamaño de la imagen)

  8. Haz clic en Ver registros y expande la fila de la solicitud con errores.

    ( aumentar el tamaño de la imagen)

  9. En la ventana Registros, observa los siguientes detalles:
    • Código de estado: 502
    • Fuente de falla: target
    • Código de falla: protocol.http.ResponseWithBody.
  10. Si la Fuente de falla tiene el valor target y el Código de falla tiene el valor protocol.http.ResponseWithBody, eso indica que el error se produjo porque el servidor de backend envió un código de estado 204 No Content o 205 Reset Content con el cuerpo de la respuesta o uno de los encabezados mencionados en la sección Causas posibles.

Herramienta de Trace

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

  1. Habilita la sesión de seguimiento trace session y haz lo siguiente:
    1. Espera a que se produzca el error 502 Bad Gateway.
    2. Si puedes reproducir el problema, haz la llamada a la API y reproduce el error 502 Bad Gateway.
  2. Asegúrate de que Mostrar todos los FlowInfos esté habilitado:

  3. Selecciona una de las solicitudes con errores y examina el seguimiento.
  4. Navega por las diferentes fases del seguimiento y ubica dónde se produjo la falla.
  5. Por lo general, encontrarás el error en el flowinfo Error justo después de la fase Solicitud enviada al servidor de destino, como se muestra a continuación:

    Situación 1

    Situación 1: El servidor de backend responde con el código de estado 204 No Content que contiene el cuerpo de la respuesta o uno de los encabezados que se enumeran en Causas posibles.

    Observa los valores de lo siguiente en el seguimiento:

    • error: Received 204 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway

    Situación 2

    Situación 2: El servidor de backend responde con el código de estado 204 No Content que contiene el cuerpo de la respuesta o uno de los encabezados que se enumeran en Causas posibles.

    Observa los valores de lo siguiente en el seguimiento:

    • error: Received 205 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway
  6. Navega a la fase AX (datos de Analytics registrados) en el seguimiento y haz clic en ella.
  7. 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:

    ( aumentar el tamaño de la imagen)

  8. Ten en cuenta que los valores de X-Apigee-fault-code y X-Apigee-fault-source are protocol.http.ResponseWithBody y target, respectivamente. Esto indica que el error se produjo porque el servidor de backend envió un código de estado 204 No Content o 205 Reset Content con el cuerpo de la respuesta o uno de los encabezados mencionados en Causas posibles.
    Error Valor
    X-Apigee-fault-code protocol.http.ResponseWithBody
    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 la nube privada, puedes usar los registros de acceso de NGINX para determinar la información clave sobre HTTP 502 Bad Gateway.
  2. Verifica los registros de acceso de NGINX:

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

    Donde: ORG, ENV y PORT# se reemplazan por valores reales.

  3. Busca para ver si hay errores 502 con el código de error protocol.http.ResponseWithBody durante un período específico (si el problema ocurrió en el pasado) o si aún hay solicitudes que fallan con 502.
  4. Si encuentras errores 502 con el X-Apigee-fault-code que coincida con el valor de protocol.http.ResponseWithBody, determina el valor de X-Apigee-fault-source.

    Ejemplo de error 502 del registro de acceso de NGINX:

    La entrada de muestra 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 protocol.http.ResponseWithBody
    X-Apigee-fault-source target
  5. Ten en cuenta que los valores de X-Apigee-fault-code y X-Apigee-fault-source son protocol.http.ResponseWithBody y target, respectivamente. Esto indica que el error se produjo porque el servidor de backend envió un código de estado 204 No Content o 205 Reset Content con el cuerpo de la respuesta o uno de los encabezados mencionados en Causas posibles.

Causa: Cuerpo de la respuesta o encabezados con respuesta 204 del servidor de backend

Diagnóstico

  1. Determina el Código de falla y la Fuente de falla del error observado con la Supervisión de API la herramienta 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 protocol.http.ResponseWithBody y Fuente de falla tiene el valor target, esto indica que el servidor de backend respondió con un código de estado 204 No Content o 205 Reset Content con el cuerpo de la respuesta o uno de los encabezados mencionados en Causas posibles.
  3. Para validar si el servidor de backend envió un cuerpo de carga útil de respuesta o uno o más de los encabezados mencionados en Causas posibles, puedes seguir estos pasos:

    1. Si eres usuario de la nube pública y puedes realizar la misma solicitud a la API al servidor de backend directamente desde cualquiera de tus sistemas.

    2. Si eres usuario de la nube privada, puedes realizar la misma solicitud a la API al servidor de backend directamente desde uno de los Message Processors asociados con la organización y el entorno específicos en los que se observa la falla.
    3. Revisa la respuesta recibida del servidor de backend y verifica que contenga un cuerpo de carga útil de respuesta o uno o más de los encabezados mencionados anteriormente. Si es así, esa es la causa de este error.

      Ejemplo 1

      Ejemplo 1: Respuesta 204 del servidor de backend con encabezado Content-Encoding

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Encoding: gzip
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      En este ejemplo, el servidor de backend respondió con 204 No Content código de estado y Content-Encoding: gzip

      Ejemplo 2

      Ejemplo 2: Respuesta 204 del servidor de backend con encabezado Content-Length

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Length: 48
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      En este ejemplo, el servidor de backend respondió con 204 No Content código de estado y Content-Length: 48

      Ejemplo 3

      Ejemplo 3: Respuesta 205 del servidor de backend con cuerpo de respuesta

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 205 Reset Content
      < Date: Sat, 31 Jul 2021 17:14:09 GMT
      < Content-Length: 12
      < Content-Type: text/plain; charset=utf-8
      <
      * Connection #0 to host X.X.X.X left intact
      This is a sample Response
      

      En este ejemplo, el servidor de backend respondió con 205 Reset Content código de estado con el cuerpo de respuesta This is a sample Response.

    4. En todos los ejemplos anteriores, el servidor de backend envió 204 No Content o 205 Reset Content código de estado con el cuerpo de la respuesta o uno de los encabezados mencionados en Causas posibles.
    5. Por lo tanto, Apigee Edge envió 502 Bad Gateway código de estado con código de error protocol.http.ResponseWithBody.

Solución

Asegúrate de que el servidor de backend siempre cumpla con la especificación RFC 7231, sección 6.3.6: 205 Reset Content, cuando envíe la 204 No Content o 205 Reset Content respuesta a Apigee Edge. Es decir, el servidor de backend NO DEBE enviar lo siguiente como parte de una respuesta 204 No Content o 205 Reset Content:

  1. Cuerpo de la carga útil de la respuesta
  2. Y cualquiera de los siguientes encabezados:
    1. Content-Length
    2. Content-Encoding
    3. Transfer-Encoding

Especificación

Apigee Edge responde con el código de estado 502 Bad Gateway y el código de error protocol.http.ResponseWithBody si el servidor de backend envía una 204 No Content o 205 Reset Content respuesta, pero no cumple con las siguientes especificaciones de RFC:

Especificación
RFC 7231, sección 6.3.5: 204 No Content
RFC 7231, sección 6.3.6: 205 Reset Content

Aspectos clave que debes tener en cuenta

La solución recomendada es corregir el servidor de backend para que envíe el 204 No Content y 205 Reset Content código de estado sin el cuerpo de la respuesta ni ninguno de los encabezados (`Content-Length`, `Content-Encoding` y `Transfer-Encoding`) y cumpla con las especificaciones RFC 7231, sección 6.3.5: 204 No Content y RFC 7231, sección 6.3.6: 205 Reset Content.

Si aún necesitas ayuda de Asistencia de Apigee, consulta 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 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 seguimiento 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 seguimiento de las solicitudes a la API
  • Registros de acceso de NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Donde: 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