URI de solicitud 414 demasiado largo - TooBigLine

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 414 Request-URI Too Long con código de error protocol.http.TooBigLine 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 414 Request-URI Too Long

Además, es posible que observes el siguiente mensaje de error:

{
   "fault":{
      "faultstring":"request line size exceeding 7,168",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

Ten en cuenta que el faultstring en el mensaje de error anterior contiene el límite permitido para la línea de solicitud en Apigee Edge, que es 7168 bytes (7 KB).

Causas posibles

Este error se produce si el tamaño de la línea de solicitud que envía la aplicación cliente a Apigee Edge como parte de la solicitud HTTP es mayor que el límite permitido en Apigee Edge.

Antes de analizar las posibles causas de este error, comprendamos qué significa la línea de solicitud y cómo verificar su tamaño.

Información sobre Request-Line

Una solicitud HTTP típica consta de tres partes:

  1. Request-Line
  2. ( Conjunto de encabezados HTTP )
  3. [ Body ]

La línea de solicitud consta de tres partes, como se muestra a continuación.

Request-Line = <Method> <Request-URI> <HTTP-Version>

Cuando la aplicación cliente realiza una solicitud HTTP a un servidor, la primera línea que va a el servidor contiene la Request-Line descrita anteriormente. Luego, siguen los encabezados y el cuerpo o la carga útil de la solicitud.

En la siguiente captura de pantalla de ejemplo, se muestra una solicitud curl típica, la parte de Request (junto con Request-Line) y la parte de Response.

Información sobre el tamaño de Request-Line

  1. En el ejemplo que se analizó anteriormente, la línea start (primera línea) de la solicitud, también denominada Request-Line, es la siguiente:
    GET /test/ HTTP/1.1

    El tamaño de Request-Line es ~19 bytes ya que contiene 19 ASCII characters. Como está dentro del límite permitido en Apigee Edge, la solicitud se procesa sin errores y obtienes una respuesta correcta.

  2. Del mismo modo, si observas el faultstring en el mensaje de error que se muestra anteriormente, contiene "request line size exceeding 7,168". Esto indica que la Request-Line en la solicitud HTTP que realizó el cliente superó los 7,168 bytes.

Estas son las posibles causas de este error:

Causa Descripción Instrucciones de solución de problemas aplicables para
El tamaño de la carga útil de la solicitud es mayor que el límite permitido El tamaño del Request-URI que envía la aplicación cliente como parte de la solicitud HTTP a Apigee Edge es mayor que el límite permitido en Apigee Edge. 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 Código de falla en función del Tiempo.
  6. Selecciona una celda que tenga el código de falla protocol.http.TooBigLine y código de estado 414, 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.TooBigline 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, ten en cuenta los siguientes detalles:

    • Código de estado: 414
    • Fuente de falla: apigee
    • Código de falla: protocol.http.TooBigLine
    • Longitud de la solicitud(bytes): 7244 (> 7KB)
  10. Si la Fuente de falla tiene el valor apigee o MP, el Código de falla tiene el valor protocol.http.TooBigLine y la Longitud de la solicitud es superior a 7 KB, esto indica que la solicitud HTTP del cliente tiene un URI de solicitud mayor que el límite permitido en Apigee.

Herramienta Trace

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 los errores 414 de HTTP.
  2. Consulta 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 si hay errores 414 durante un período específico (si el problema ocurrió en el pasado) o si aún hay solicitudes que fallan con 414.
  4. Si encuentras errores 414 con el X-Apigee-fault-code que coincida con el valor de protocol.http.TooBigLine, determina el valor de la X-Apigee-fault-source.

    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.TooBigLine
    X-Apigee-fault-source policy

    Ten en cuenta la longitud de la solicitud: 7244 (7.244 KB > límite permitido)

Causa: El tamaño de la carga útil de la solicitud es mayor que el límite permitido

Diagnóstico

  1. Determina el Código de falla, la Fuente de falla y el tamaño de la longitud de la solicitud para el 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 la Fuente de falla tiene el valor apigee o MP, esto indica que el tamaño de la solicitud que envía la aplicación cliente a Apigee es mayor que el límite permitido en Apigee Edge.
  3. Puedes validar que el tamaño de la línea de solicitud superó el límite permitido de 7 KB con uno de los siguientes métodos:

    Mensaje de error

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

    Si tienes acceso al mensaje de error completo que recibiste de Apigee Edge, entonces consulta el faultstring. El faultstring indica que el tamaño de Request-Line superó el límite permitido de 7 KB.

    Mensaje de error de muestra:

    "faultstring":"request line size exceeding 7,168"

    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:

    1. Verifica el tamaño del URI que se pasó en la solicitud.
    2. Si descubres que el tamaño del URI es mayor que el límite permitido en Apigee Edge, esa es la causa del problema.

      Solicitud de muestra:

      curl http://<hostalias>/testtoobigline?_qparam=000000000000000000……..000000<trimmed> -k -X POST
      

      En el caso anterior, el valor del parámetro de consulta qparam es mayor que 7 KB, es decir, contiene más de 7 K caracteres ASCII.

      Si usas otro cliente, puedes revisar los registros del cliente y tratar de averiguar el tamaño de la línea de solicitud que se envía a Apigee Edge.

    Registros del Message Processor

    Para validar con los registros del Message Processor, haz lo siguiente:

    Si eres usuario de la nube privada, puedes usar los registros del Message Processor para validar si el tamaño de Request-Line superó el límite permitido en Apigee Edge.

    1. Consulta los registros del Message Processor:

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

    2. Busca si hay errores 414 durante un período específico (si el problema ocurrió en el pasado) o si aún hay solicitudes que fallan con 414. Puedes usar las siguientes cadenas de búsqueda.
      grep -ri "exceeding"
      
      grep -ri "RequestURITooLong"
      
    3. Encontrarás líneas de system.log similares a las siguientes:
      2021-07-12 08:53:31,461  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() : Request:null, uri:null,
      message Id:null, exception:com.apigee.errors.http.user.RequestURITooLong{
      code = protocol.http.TooBigLine, message = request line size exceeding 7,168,
      associated contexts = []}, context:Context@366f4217
      input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.195.90:8443
      Local:192.168.67.23:34256]@301912 useCount=1 bytesRead=0 bytesWritten=45849
      age=2254670ms lastIO=0ms isOpen=true)

      El texto message = request line size exceeding 7,168 en el mensaje de error anterior indica que el tamaño del URI de solicitud es superior a 7 KB. Por lo tanto, Apigee Edge genera la excepción com.apigee.errors.http.user.RequestURITooLong y muestra el código de estado 414 con el código de falla protocol.http.TooBigline a las aplicaciones cliente.

Solución

Tamaño fijo

Opción 1 [recomendada]: Corrige la aplicación cliente para que no envíe un tamaño de URI de solicitud mayor que el límite permitido

  1. Analiza el motivo por el que el cliente específico envía un tamaño de URI de solicitud mayor que el límite permitido, como se define en Límites.
  2. Si no es deseable, modifica tu aplicación cliente para que envíe un tamaño de URI de solicitud inferior al límite permitido.

    En el ejemplo que se analizó anteriormente, puedes solucionar el problema si pasas el parámetro de consulta largo como parte del cuerpo o la carga útil de la solicitud en lugar de pasarlo como parte de la URL de la solicitud, como se muestra a continuación:

    curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
    
  3. Si es deseable y quieres enviar un URI superior al límite permitido, ve a las siguientes opciones.

CwC

Opción 2 : Usa la propiedad CwC para aumentar el límite de la línea de solicitud

Apigee proporciona una propiedad CwC que le permite aumentar el límite de tamaño de la línea de solicitud. Para obtener más detalles, consulta Cómo establecer el límite de la línea de solicitud en el Message Processor

Límites

Apigee espera que la aplicación cliente y el servidor de backend no envíen líneas de solicitud o respuesta cuyos tamaños sean mayores que el límite permitido, como se documenta para el límite de la línea de solicitud o respuesta en Límites de Apigee Edge.

  1. Si eres usuario de la nube pública, el límite máximo para el tamaño de la línea de solicitud y respuesta es el que se documenta para el tamaño de la línea de solicitud o respuesta en Límites de Apigee Edge.
  2. Si eres usuario de la nube privada, es posible que hayas modificado el límite máximo predeterminado para el tamaño de la línea de solicitud y respuesta (aunque no es una práctica recomendada). Puedes determinar el límite máximo de tamaño de Request-Line si sigues las instrucciones que se indican en Cómo verificar el límite actual.

¿Cómo verificar el límite actual?

En esta sección, se explica cómo verificar que la propiedad HTTPRequest.line.limit se haya actualizado con un valor nuevo en los Message Processors.

  1. En la máquina del Message Processor, busca la propiedad HTTPRequest.line.limit en el /opt/apigee/edge-message-processor/conf directorio y verifica qué valor se estableció, como se muestra a continuación:
    grep -ri "HTTPRequest.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. El resultado de muestra del comando anterior es el siguiente:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.line.limit=7k
  3. En el resultado de ejemplo anterior, ten en cuenta que la propiedad HTTPRequest.line.limit se estableció con el valor 7k en http.properties.

    Esto indica que el límite para el tamaño de Request-Line configurado en Apigee para la nube privada es de 7 KB.

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 414
  • 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 de la organización
  • Nombre del entorno
  • Paquete de proxy de API
  • Archivo de seguimiento de las solicitudes a la API con errores
  • Comando curl completo que se usó para reproducir el error 414
  • 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 del Message Processor /opt/apigee/var/log/edge-message-processor/logs/system.log