Error 400 de solicitud incorrecta: DuplicateHeader

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 400 Bad Request con el código de error. protocol.http.DuplicateHeader 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 veas un mensaje de error similar al que se muestra a continuación:

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

Causas posibles

Este error ocurre si un encabezado HTTP específico que no puede tener duplicados en Apigee Edge, aparece más de una vez con valores iguales o diferentes como parte de la solicitud HTTP enviada por al cliente a Apigee Edge.

Según RFC 7230, sección 3.2.2: Orden de campo, un remitente NO DEBE generar varios encabezados campos con el mismo nombre de campo en un mensaje, a menos que el valor completo del campo campo de encabezado se define como una lista separada por comas, [es decir, #(values)] o el campo de encabezado es un excepción conocida. Si Apigee Edge encuentra un encabezado específico, ese encabezado no está permitido duplicados, más de una vez en la solicitud HTTP enviada por el cliente, este responde con 400 Bad Request y un código de error protocol.http.DuplicateHeader

Estas son las posibles causas de este error:

Causa Descripción Instrucciones de solución de problemas aplicables para
Encabezado duplicado en la solicitud La solicitud HTTP de la aplicación cliente a Apigee contiene encabezados duplicados. 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 rol 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 protocol.http.DuplicateHeader como se muestra a continuación:

  8. La información sobre el código de falla protocol.http.DuplicateHeader es se muestra a continuación:

  9. Haz clic en Ver registros y expande la fila de la solicitud con errores.
  10. En la ventana Registros, observa los siguientes detalles:
    1. Código de estado: 400
    2. Fuente del error: apigee
    3. Código de error: protocol.http.DuplicateHeader.
  11. Si Fault Source tiene el valor apigee o MP , y Fault Code tiene el valor protocol.http.DuplicateHeader, eso indica que la solicitud HTTP de el cliente contenía encabezados duplicados.

Herramienta de seguimiento

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 400 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 400 durante un período específico (si el problema en el pasado) o si todavía hay solicitudes que fallan 400
  4. Si encuentras algún error 400 con el código X-Apigee-fault-code que coincidan con el valor de protocol.http.DuplicateHeader, luego y determinar el valor de X-Apigee-fault-source.

    Error 400 de muestra del registro de acceso de NGINX:

    La entrada de muestra anterior del registro de acceso de NGINX tiene los siguientes valores para X-Apigee- error-code y X-Apigee-fault-source:

    Encabezados de respuesta Valor
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

Causa: encabezado duplicado en la solicitud

Diagnóstico

  1. Determina el código de error y la fuente de errores del error observado con la API. Registros de acceso de Monitoring o NGINX, como se explica en Pasos del diagnóstico comunes.
  2. Si la Fuente del error tiene el valor apigee o MP, este indica que la solicitud enviada por la aplicación cliente a Apigee contiene encabezados.
  3. Puedes determinar el encabezado real que se envía más de una vez como parte de la solicitud usando el siguiente comando: uno de los siguientes métodos:

    Mensaje de error

    Cómo usar el mensaje de error

    1. Si tienes acceso al mensaje de error completo que recibiste de Apigee Edge, consulta faultstring. faultstring contiene las nombre del encabezado que se envió más de una vez.

      Ejemplo de mensaje de error:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. En el mensaje de error anterior, puedes ver que el encabezado Expires es enviado más de una vez, como se ve en faultstring.

    Solicitud real

    Cómo usar la solicitud real

    1. Si tienes acceso a la solicitud real que realizó la aplicación cliente, entonces realiza los siguientes pasos:

      1. Verifica la lista de encabezados pasados en la solicitud.
      2. Si notas que un encabezado en particular aparece más de una vez en el con el mismo valor o con valores diferentes , esa es la causa para este error.

      Solicitud de muestra:

      curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
      

      En la solicitud de ejemplo anterior, el encabezado Expires recibe más de una vez. Por lo tanto, esta solicitud falla con el error 400 Bad Request y el código de error: protocol.http.DuplicateHeader.

    2. De manera alternativa, si tienes acceso a los registros del cliente, puedes ver si información sobre la solicitud real realizada a Apigee Edge y determinar el encabezado que se envía más de una vez.

Solución

Cómo corregir la duplicación

Opción 1 [Opción recomendada] Corrige la aplicación cliente para que no incluya encabezados duplicados

  1. Analiza el motivo por el que el cliente específico envía un encabezado duplicado. Por ejemplo: Expires en el caso anterior. Verifica que los proxies de API la acepten el encabezado duplicado. Por lo general, no es recomendable según la especificación HTTP. RFC7230:
  2. Si no lo deseas, modifica la aplicación cliente para que no envíe encabezados duplicados.

    En el ejemplo anterior, se observa que el encabezado Expires se envía dos veces con el mismo valor, lo cual no es conveniente. Para solucionar el problema, pasa el Expires solo una vez, como se muestra a continuación:

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. Si deseas permitir los encabezados duplicados, dirígete a Opción 2: Usa la propiedad CwC.

CwC

Opción 2: Usa la propiedad CwC

Apigee proporciona un La propiedad HTTPHeader.<HeaderName> de CwC ,que permite que el cliente aplicaciones y servidores de destino para enviar encabezados duplicados a los proxies de API en Apigee Edge.

Propiedad de CwC Valores
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Por ejemplo, la siguiente propiedad se puede configurar en Message Processor para permitir duplicados y varios valores para el encabezado Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Si eres un usuario de la nube privada, puedes configurar la propiedad para evitar que Apigee Edge genere un error 400 Bad Request, incluso si la solicitud contiene encabezados duplicados mediante el encabezado Guía práctica sobre cómo configurar los procesadores de mensajes para usar encabezados duplicados
  2. Si eres usuario de la nube pública, comunícate con el equipo de asistencia de Apigee Edge para configurar esta propiedad para tu organización.

Especificación

Apigee espera que la aplicación cliente no envíe encabezados duplicados como parte de la solicitud según las siguientes especificaciones RFC:

Especificación
RFC 7230, sección 3.2.2: Orden de campo
RFC 7230, sección 3.2 Campos de encabezado

Si aún necesitas ayuda 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 400
  • Archivo de seguimiento de las solicitudes a la API

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

  • Mensaje de error completo observado para las solicitudes fallidas
  • Nombre del entorno
  • Paquete de proxy de API
  • Completa el comando curl que usaste para reproducir el error 400
  • 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

    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