Configura Message Processor para permitir encabezados duplicados

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

Según la especificación HTTP RFC 7230, sección 3.2.2: Orden de campos, Apigee Edge espera que la solicitud HTTP del cliente o la respuesta HTTP del servidor de backend no contengan el mismo encabezado que se pasa más de una vez con los mismos valores o con valores diferentes, a menos que el encabezado específico tenga una excepción y pueda tener duplicados.

De forma predeterminada, Apigee Edge permite que se pasen duplicados y varios valores a la mayoría de los encabezados HTTP. Sin embargo, no permite ciertos encabezados que se enumeran en Encabezados que no pueden tener duplicados ni varios valores. Por lo tanto:

  • Obtendrás 400 Bad Request con el código de error protocol.http.DuplicateHeader si el cliente envía una solicitud HTTP con un encabezado particular más de una vez o con varios valores para los encabezados HTTP que no pueden tener duplicados o varios valores en Apigee Edge.
  • Del mismo modo, obtendrás 502 Bad Gateway con el código de error protocol.http.DuplicateHeader si el servidor de backend envía una respuesta HTTP con un encabezado en particular más de una vez o con varios valores para los encabezados HTTP que no pueden tener duplicados o varios valores en Apigee Edge.

La solución recomendada para abordar estos errores es corregir la aplicación cliente y el servidor de backend para que no envíen encabezados duplicados y cumplan con la especificación RFC 7230, sección 3.2.2: Orden de los campos, como se explica en los siguientes manuales de solución de problemas:

Sin embargo, en algunos casos, es posible que desees agregar una excepción para incluir duplicados y varios valores para algunos encabezados HTTP. En esas situaciones, puedes permitir encabezados duplicados y varios valores para un encabezado HTTP específico configurando una propiedad HTTPHeader.HEADER_NAME a nivel del procesador de mensajes.

En este documento, se proporciona información sobre esta propiedad, se explica cómo habilitarla para evitar los errores mencionados anteriormente y se comparten prácticas recomendadas sobre estos elementos.

Propiedades de encabezado HTTP para permitir duplicados y varios valores

Apigee Edge proporciona las dos propiedades siguientes para controlar el comportamiento de permitir duplicados y valores múltiples para los encabezados HTTP. Ten en cuenta que solo se pueden configurar en los procesadores de mensajes con la sintaxis de tokens que se explica en Cómo configurar Edge.

Nombre de la propiedad Descripción Valores permitidos
HTTPHeader.ANY

Esta propiedad indica si se permiten duplicados o varios valores para todos los encabezados HTTP, incluidos los encabezados personalizados que se envían como parte de la solicitud HTTP que realiza el cliente o la respuesta HTTP que envía el servidor de backend a Apigee Edge.

Valor predeterminado:

multiValued, allowDuplicates,

  1. blank: No se permiten duplicados ni valores múltiples para los encabezados HTTP.
  2. multiValued: Divide el encabezado multivalor en varios encabezados. Se permiten varios valores para los encabezados HTTP, pero no se permiten duplicados. El valor multiValued está habilitado, lo que implica que test-header=a,b se convertiría en test-header=a y test-header=b..
  3. allowDuplicates: Permite varios encabezados HTTP (duplicados) con el mismo nombre.
  4. multiValued, allowDuplicates: Se permiten varios valores y duplicados para los encabezados HTTP.

HTTPHeader.HEADER_NAME

Esta propiedad se usa para anular el comportamiento de un encabezado específico de lo que especifica HTTPHeader.ANY.

Se aplican las mismas especificaciones del punto anterior.

Encabezados que no pueden tener duplicados ni varios valores

Como se explicó anteriormente, Apigee Edge permite duplicados y varios valores para la mayoría de los encabezados HTTP de forma predeterminada. Esto se debe a que la propiedad HTTPHeader.ANY está configurada con el valor multiValued, allowDuplicates.

Se reemplazó la configuración

En algunos encabezados específicos, la configuración predeterminada se reemplaza mediante uno de los siguientes métodos:

  • HTTPHeader.HEADER_NAME=multiValued, allowDuplicates

    Esta configuración no cambia el comportamiento predeterminado. Es decir, el encabezado específico puede tener duplicados y varios valores.

    .
  • HTTPHeader.HEADER_NAME=

    Esta configuración cambia el comportamiento predeterminado. Es decir, el encabezado específico no puede tener duplicados ni varios valores.

Determinación de los encabezados que no pueden tener duplicados ni varios valores

En esta sección, se describe cómo identificar lo siguiente:

  • Los encabezados específicos que no pueden tener duplicados ni varios valores en la configuración de Apigee Edge for Private Cloud
  • Los encabezados específicos con configuración preexistente
  1. En la máquina de Message Processor, busca la propiedad HTTPHeader. en el directorio /opt/apigee/edge-message-processor/conf, como se muestra a continuación:

    grep -ri "HTTPHeader." /opt/apigee/edge-message-processor/conf
    

    Resultado de muestra:

    # grep -ri "HTTPHeader" /opt/apigee/edge-message-processor/conf
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.ANY=allowDuplicates, multiValued
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Connection=allowDuplicates, multiValued
    … <snipped>
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Host=
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Date=allowDuplicates
    …
    <snipped>
  2. Como se explica en la sección Configuración reemplazada, ten en cuenta la siguiente información en el resultado de muestra anterior:
    1. El encabezado HTTP Connection se reemplaza, pero se permite que tenga duplicados y varios valores.
    2. Los encabezados HTTP Host y Expires se reemplazan y no se permite que tengan duplicados ni varios valores.
    3. El encabezado HTTP Date se reemplaza y puede tener duplicados, pero no puede tener varios valores.
    4. Todos los encabezados que aparecen aquí (Connection, Host, Expires y Date en el ejemplo anterior) se denominan encabezados con configuración preexistente en este documento.

Comportamiento de Apigee Edge

En la siguiente tabla, se describe el comportamiento de Apigee Edge cuando los encabezados se envían como duplicados y con varios valores, según la configuración de las propiedades HTTPHeader en los procesadores de mensajes con un ejemplo HTTPHeader de test-header.

Solicitud Encabezados de salida basados en el valor de conf/http.properties+HTTPHeader.test-header=
<En blanco> allowDuplicates multiValued allowDuplicates, multiValued (PREDETERMINADO)
test‑header=a,b test‑header=a,b test‑header=a,b

protocol.http.
DuplicateHeader

De forma interna, dividimos test-header=a,b en lo siguiente:

  • test-header=a y
  • test-header=b,

y, luego, se genera el error DuplicateHeader.

test‑header=a,b

De forma interna, dividimos test-header=a,b en lo siguiente:

  • test-header=a y
  • test-header=b,

pero, luego, el formulario original se envía al destino.

test‑header=a
test‑header=b
protocol.http.
DuplicateHeader
test‑header=a
test‑header=b
protocol.http.
DuplicateHeader
test‑header=a
test‑header=b

Antes de comenzar

Antes de usar los pasos de este documento, asegúrate de comprender la configuración de propiedades para Edge en la nube privada, que se describe en Cómo configurar Edge.

Configura allowDuplicates y varios valores para los encabezados

Como se explica en Propiedades del encabezado HTTP para permitir duplicados y varios valores, el valor de la propiedad HTTPHeader.ANY = allowDuplicates, multiValued implica que todos los encabezados pueden tener duplicados y valores múltiples en Apigee Edge. Sin embargo, hay ciertos encabezados cuyos valores se reemplazan de manera explícita para no permitir encabezados duplicados o varios valores para esto usando la propiedad HTTPHeader.HEADER_NAME.

En esta sección, se explica cómo configurar la propiedad HTTPHeader.HEADER_NAME para permitir duplicados y varios valores para cualquier encabezado HTTP de este tipo en los procesadores de mensajes, con el token correspondiente según la sintaxis que se describe en Cómo configurar Edge.

En esta sección, usaremos Expires (y myheader) como un encabezado de ejemplo para el que queremos permitir duplicados y varios valores, como se explica a continuación:

  1. Determina el valor actual de la propiedad HTTPHeaderHEADER_NAME para asegurarte de que ya no esté habilitada para permitir duplicados y varios valores con el siguiente comando:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Por ejemplo, si intentas configurar la propiedad para el encabezado Expires, verifica el valor actual del token HTTPHeader.Expires de la propiedad en el procesador de mensajes:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    El resultado del comando anterior da como resultado una de las siguientes opciones:

    1. Si la propiedad se establece en blanco, significa que el valor se reemplaza (y este es un encabezado con configuración preexistente) para NO permitir encabezados duplicados ni varios valores. Es decir, no puedes enviar el encabezado Expires más de una vez como parte de la solicitud o respuesta HTTP a Apigee.
    2. Si no hay hits para la propiedad específica, significa que el valor no se reemplazó (y este NO es un encabezado con configuración preexistente). Esto significa que el encabezado específico se puede enviar más de una vez (se permiten los duplicados) como parte de la solicitud HTTP o la respuesta HTTP a Apigee Edge.
    3. La propiedad se establece con el valor allowDuplicates, multiValued, lo que significa que ese valor se reemplaza de forma explícita (y este es un encabezado con configuración preexistente). Esto significa que el encabezado específico se puede enviar más de una vez (se permiten los duplicados) como parte de la solicitud HTTP o la respuesta HTTP a Apigee.

    Resultado de muestra del comando search:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=

    En el resultado de muestra anterior, se muestra que la propiedad HTTPHeader.Expires está configurada en blanco. Esto significa que la propiedad se reemplaza para no permitir valores duplicados o múltiples para el encabezado Expires.

  2. Si observas que la propiedad correspondiente al encabezado específico se reemplaza de forma explícita para no permitir valores duplicados o múltiples, como en el ejemplo de salida anterior, solo entonces sigue los pasos que se indican a continuación. Si no se reemplaza de forma explícita, omite el resto de los pasos de esta sección.
  3. Editar. Si no existe, puedes crearla:
    /opt/apigee/customer/application/message-processor.properties

    Por ejemplo, para abrir el archivo con vi, ingresa lo siguiente:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Agrega una línea con el siguiente formato:
    conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
  5. Guarda los cambios.
  6. Asegúrate de que el usuario apigee sea el propietario del archivo de propiedades. De lo contrario, ejecuta el siguiente comando:

    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Reinicia el procesador de mensajes:

    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    Para reiniciar sin afectar el tráfico, consulta Reinicio continuo de Message Processors sin impacto en el tráfico.

  8. Si tienes más de un Message Processor, repite los pasos anteriores en todos ellos.

Verifica que el encabezado esté configurado para tener duplicados y varios valores.

En esta sección, se explica cómo verificar que la propiedad HTTPHeader.HEADER_NAME de un encabezado específico se haya actualizado correctamente para permitir duplicados en los procesadores de mensajes.

Usaremos Expires como encabezado de ejemplo y verificaremos si se actualizó la propiedad HTTPHeader.Expires correspondiente.

Aunque uses el token conf_http_HTTPHeader.Expires para actualizar el valor en el procesador de mensajes, debes verificar si la propiedad real HTTPHeader.Expires se configuró con el valor nuevo.

  1. En la máquina del procesador de mensajes, busca la propiedad HTTPHeader.HEADER_NAME en el directorio /opt/apigee/edge-message-processor/conf y comprueba si se configuró con el valor nuevo, como se muestra a continuación:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Por ejemplo, si quieres verificar que la propiedad HTTPHeader.Expires se haya configurado con el valor nuevo, ejecuta el siguiente comando:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    
  2. Si el valor nuevo se configura correctamente para HTTPHeader.HEADER_NAME en el procesador de mensajes, el comando anterior muestra el valor nuevo en el archivo http.properties.
  3. El resultado de muestra del comando anterior después de configurar allowDuplicates y multiValued es el siguiente:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
  4. En el resultado de ejemplo anterior, ten en cuenta que la propiedad HTTPHeader.Expires se estableció con el nuevo valor allowDuplicates, multiValued en http.properties. Esto indica que el comportamiento para permitir duplicados y varios valores en HTTPHeader se configuró correctamente en el procesador de mensajes.
  5. Si aún ves el valor anterior de la propiedad HTTPHeader.HEADER_NAME, verifica que hayas seguido correctamente todos los pasos que se describen en Cómo configurar allowDuplicates y varios valores para los encabezados. Si te salteaste algún paso, vuelve a repetirlos todos correctamente.

    Asegúrate de que tus proxies funcionen como se espera, en especial si hay una lógica funcional para obtener y configurar los encabezados en el proxy.

  6. Si aún no puedes modificar la propiedad, comunícate con el equipo de asistencia de Apigee Edge.

Inhabilitar allowDuplicates para los encabezados

En esta sección, se explica cómo configurar la propiedad HTTPHeader.{Headername} para no permitir duplicados ni varios valores para un encabezado HTTP específico en los procesadores de mensajes, con el token correspondiente según la sintaxis que se describe en Cómo configurar Edge.

En esta sección, usaremos Expires (y myheader) como un encabezado de ejemplo para el que no queremos permitir duplicados, como se explica a continuación:

  1. Determina el valor actual de la propiedad HTTPHeaderHEADER_NAME para asegurarte de que no esté inhabilitada para permitir duplicados y varios valores con el siguiente comando:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Por ejemplo, si intentas configurar la propiedad para el encabezado Expires, verifica el valor actual del token HTTPHeader.Expires de la propiedad en el procesador de mensajes:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    El resultado del comando anterior muestra una de las siguientes opciones:

    1. Si la propiedad se establece en blanco, significa que el valor se reemplaza para NO permitir encabezados duplicados ni varios valores. Es decir, no puedes enviar el encabezado Expires más de una vez como parte de la solicitud o respuesta HTTP a Apigee.
    2. No hay hits para la propiedad específica, por lo que eso significa que el valor no se reemplaza y que es un encabezado NOT con una configuración preexistente. Esto significa que el encabezado específico se puede enviar más de una vez (se permiten duplicados) como parte de la solicitud HTTP o la respuesta HTTP a Apigee Edge.
    3. Si la propiedad se establece con el valor allowDuplicates, multiValued, significa que el valor se reemplaza de forma explícita y que esta es una configuración existente. Sin embargo, esto significa que el encabezado específico se puede enviar más de una vez (se permiten duplicados) como parte de la solicitud o respuesta HTTP a Apigee.

    Resultado de muestra 1

    Resultado de muestra n.° 1 del comando search:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued

    El resultado de muestra indica que la propiedad HTTPHeader.Expires está configurada en allowDuplicates, multiValued. Esto significa que la propiedad se reemplaza para permitir valores duplicados o múltiples para el encabezado Expires.

    Resultado de muestra n.° 2

    Comando de ejemplo y resultado no 2 del comando de búsqueda

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    

    El resultado de muestra no muestra ningún resultado, lo que implica que la propiedad HTTPHeader.myheader se establece en allowDuplicates, multiValued de forma predeterminada. Esto también implica que la propiedad no se reemplaza para el encabezado myheader.

  2. Si ves alguna de las siguientes opciones, realiza el resto de los pasos de esta sección:
    1. La propiedad correspondiente al encabezado específico se reemplaza para permitir duplicados y múltiples valores, como en el Resultado de ejemplo n.o 1 anterior (encabezado con configuración preexistente).
    2. No hay hits para la propiedad correspondiente al encabezado específico, como en el resultado de muestra n° 2 anterior (no es un encabezado con configuración preexistente).

    De lo contrario, omite el resto de los pasos de esta sección.

  3. Edita el siguiente archivo. Si no existe, puedes crearla.
    /opt/apigee/customer/application/message-processor.properties

    Por ejemplo, para abrir el archivo con vi, ingresa lo siguiente:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Agrega una línea con el siguiente formato al archivo de propiedades:

    Configuración preexistente

    Situación 1: Encabezado con configuración preexistente:

    conf_http_HTTPHeader.Expires=

    Sin configuración preexistente

    Situación 2: No es un encabezado con configuración preexistente:

    conf/http.properties+HTTPHeader.myheader=
  5. Guarda los cambios.
  6. Asegúrate de que el usuario apigee sea el propietario del archivo de propiedades. De lo contrario, ejecuta lo siguiente:
    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Reinicia el procesador de mensajes:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    Si deseas reiniciar sin afectar el tráfico, consulta Reinicio progresivo de los procesadores de mensajes sin impacto en el tráfico.

  8. Si tienes más de un Message Processor, repite los pasos anteriores en todos los Message Processors.

Verifica que el encabezado esté configurado para no permitir duplicados ni múltiples valores.

En esta sección, se explica cómo verificar que la propiedad HTTPHeader.HEADER_NAME de un encabezado específico se haya actualizado correctamente para no permitir duplicados en los procesadores de mensajes.

Usaremos Expires (y myheader) como encabezado de ejemplo y comprobaremos si se actualizó la propiedad correspondiente HTTPHeader.Expires (y HTTPHeader.myheader).

  1. En la máquina de Message Processor, busca la propiedad HTTPHeader.HEADER_NAME en el directorio /opt/apigee/edge-message- processor/conf y verifica si se configuró con el valor nuevo, como se muestra a continuación:

    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Por ejemplo, si quieres verificar que la propiedad HTTPHeader.Expires esté configurada con el valor nuevo, puedes ejecutar el siguiente comando:

    Configuración preexistente

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    Sin configuración preexistente

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    
  2. Si el nuevo valor del encabezado HTTP se configura correctamente para HTTPHeader.HEADER_NAME I en el procesador de mensajes, el comando anterior muestra el valor nuevo en el archivo http.properties.
  3. El resultado de muestra del comando anterior después de inhabilitar allowDuplicates es el siguiente:

    Configuración preexistente

    Situación 1: Encabezado de vencimiento (encabezado con configuración preexistente)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=

    Sin configuración preexistente

    Situación 2: Encabezado myheader (no es un encabezado con configuración preexistente)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
  4. En el ejemplo de resultado anterior, ten en cuenta que la propiedad HTTPHeader.Expires ( y HTTPHeader.myheader) se configuró con el valor nuevo {blank} en http.properties. Esto indica que el comportamiento para permitir duplicados y múltiples valores para el encabezado HTTP específico Expires (y myheader) se inhabilitó correctamente en Message Processor.
  5. Si sigues viendo el valor anterior de la propiedad HTTPHeader.Expires (or HTTPHeader.myheader), verifica que hayas seguido todos los pasos descritos en Cómo configurar allowDuplicates y varios valores para los encabezados de forma correcta. Si omitiste algún paso, vuelve a repetirlo correctamente.

    Asegúrate de que tus proxies funcionen como se espera, en especial si hay una lógica funcional para obtener y configurar los encabezados en el proxy.

  6. Si aún no puedes modificar la propiedad, comunícate con el equipo de asistencia de Apigee Edge.