Configura Message Processor para permitir encabezados duplicados

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

Según la especificación HTTP RFC 7230, sección 3.2.2: Orden de los 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 se le permita 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:

  • Recibirás 400 Bad Request con el código de error protocol.http.DuplicateHeader si el cliente envía una solicitud 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.
  • Del mismo modo, recibirá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 ni 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 soluciones:

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 Message Processor.

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 relacionadas con ella.

Propiedades de encabezado HTTP para permitir duplicados y varios valores

Apigee Edge proporciona las siguientes dos propiedades para controlar el comportamiento de permitir duplicados y varios valores para los encabezados HTTP. Ten en cuenta que estos parámetros solo se pueden configurar en los procesadores de mensajes con la sintaxis de token 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 varios valores para los encabezados HTTP.
  2. multiValued: Divide el encabezado de varios valores 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 se especifica en 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 sobrescribió la configuración

Para algunos encabezados específicos, la configuración predeterminada se reemplaza con 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.

Cómo determinar 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 tu configuración de Apigee Edge 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 Configuration overwritten, ten en cuenta la siguiente información en el ejemplo de resultado 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 se permite que tenga duplicados, pero no se permite que tenga varios valores
    4. Todos los encabezados que aparecen aquí (Connection, Host, Expires y Date en el ejemplo anterior) se conocen como 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 cómo se configuran las propiedades HTTPHeader en los procesadores de mensajes con un ejemplo de HTTPHeader de test-header.

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

protocol.http.
DuplicateHeader

Internamente, dividimos test-header=a,b de la siguiente manera:

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

y, luego, se arroja el error DuplicateHeader.

test‑header=a,b

Internamente, dividimos test-header=a,b de la siguiente manera:

  • 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 seguir los pasos que se indican en este documento, asegúrate de comprender cómo configurar las propiedades de Edge para una nube privada, como se describe en Cómo configurar Edge.

Configura allowDuplicates y varios valores para los encabezados

Como se explica en Propiedades de 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 varios valores en Apigee Edge. Sin embargo, hay ciertos encabezados cuyos valores se reemplazan de forma explícita para no permitir encabezados duplicados o varios valores para este encabezado 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 los encabezados HTTP 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 ejemplo de encabezado 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 aún 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 establecer la propiedad para el encabezado Expires, verifica el valor actual del token de propiedad HTTPHeader.Expires en el procesador de mensajes:

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

    El resultado del comando anterior es uno de los siguientes:

    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. No hay hits para la propiedad específica, lo que significa que ese valor no se reemplaza (y 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 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 el valor se reemplazó de forma explícita (y este es un encabezado 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.

    Ejemplo de resultado del comando de búsqueda:

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

    El resultado de muestra anterior muestra que la propiedad HTTPHeader.Expires está configurada como en blanco. Esto significa que la propiedad se anula para no permitir valores duplicados ni múltiples para el encabezado Expires.

  2. Si observas que la propiedad correspondiente al encabezado específico se reemplaza de forma explícita por no permitir valores duplicados o múltiples, como en el ejemplo de salida anterior, solo entonces realiza los siguientes pasos. Si no se reemplaza de forma explícita, omite el resto de los pasos de esta sección.
  3. Editar. Si no existe, puedes crearlo:
    /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 archivo de propiedades sea propiedad del usuario apigee. Si no es así, ejecuta el siguiente comando:

    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Reinicia el Message Processor:

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

    Para reiniciar sin afectar el tráfico, consulta Reinicio progresivo de Message Processors sin afectar 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 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 correspondiente HTTPHeader.Expires.

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

  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 nuevo valor, 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 nuevo valor se establece correctamente para HTTPHeader.HEADER_NAME en el Message Processor, el comando anterior muestra el nuevo valor 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 omitiste algún paso, repite todos los pasos correctamente.

    Asegúrate de que tus proxies funcionen según lo previsto, en especial si hay una lógica funcional para obtener y establecer los encabezados en el proxy.

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

Cómo 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 ejemplo de un encabezado 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 y 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 de propiedad HTTPHeader.Expires en el procesador de mensajes:

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

    El resultado del comando anterior es uno de los siguientes:

    1. La propiedad se establece en blanco, lo que implica que el valor ise reemplaza por NO para permitir encabezados duplicados y valores múltiples. 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 ese valor no se reemplaza y que se trata de un encabezado NOT con 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. La propiedad se establece con el valor allowDuplicates, multiValued, lo que significa que ese valor se reemplazó de forma explícita y 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 HTTP o la respuesta HTTP a Apigee.

    Ejemplo de resultado 1

    Ejemplo de resultado 1 del comando de búsqueda:

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

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

    Ejemplo de resultado 2

    Comando y resultado de muestra núm. 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 está establecida en allowDuplicates, multiValued de forma predeterminada. Esto también implica que la propiedad no se sobrescribe para el encabezado myheader.

  2. Si observas uno de los siguientes problemas, realiza el resto de los pasos de esta sección:
    1. La propiedad correspondiente al encabezado específico se reemplaza para permitir duplicados y varios valores, como en el Ejemplo de salida 1 anterior (encabezado con configuración preexistente).
    2. No hay visitas para la propiedad correspondiente al encabezado específico, como en el ejemplo de salida 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 crearlo.
    /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=

    No hay parámetros de configuración preexistentes

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

    conf/http.properties+HTTPHeader.myheader=
  5. Guarda los cambios.
  6. Asegúrate de que el archivo de propiedades sea propiedad del usuario apigee. Si no es así, ejecuta lo siguiente:
    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Reinicia el Message Processor:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    Para reiniciar sin afectar el tráfico, consulta Cómo reiniciar los Message Processors de forma progresiva sin afectar el tráfico.

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

Verificar que el encabezado esté configurado para no permitir duplicados ni 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 no permitir duplicados en los procesadores de mensajes.

Usaremos Expires (y myheader) como encabezado de ejemplo y verificaremos 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 nuevo valor, como se muestra a continuación:

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

    Por ejemplo, si deseas 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
    

    No hay parámetros de configuración preexistentes

    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 Message Processor, el comando anterior muestra el nuevo valor 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 Expires (encabezado con una configuración preexistente)

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

    No hay parámetros de configuración preexistentes

    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 resultado de ejemplo anterior, ten en cuenta que la propiedad HTTPHeader.Expires ( y HTTPHeader.myheader) se estableció con el nuevo valor {blank} en http.properties}. Esto indica que el comportamiento para permitir duplicados y varios valores para el encabezado HTTP específico Expires (y myheader) se inhabilitó correctamente en el Message Processor.
  5. Si sigues viendo el valor anterior de la propiedad HTTPHeader.Expires (or HTTPHeader.myheader), verifica que hayas seguido correctamente todos los pasos que se describen en Cómo configurar allowDuplicates y varios valores para los encabezados. Si omitiste algún paso, repite todos los pasos correctamente.

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

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