Como configurar processadores de mensagens para permitir cabeçalhos duplicados

Esta é a documentação do Apigee Edge.
Acesse Documentação da Apigee X.
informações

De acordo com a especificação HTTP RFC 7230, seção 3.2.2: ordem dos campos, o Apigee Edge espera que a solicitação HTTP do a resposta HTTP ou do cliente do servidor de back-end não contêm o mesmo cabeçalho transmitido mais de uma vez com valores iguais ou diferentes, a menos que o cabeçalho específico tenha uma exceção e pode ter duplicatas.

Por padrão, o Apigee Edge permite que cópias e vários valores sejam transmitidos para a maioria dos dados e cabeçalhos de cache válidos. No entanto, ele não permite certos cabeçalhos que estão listados em Cabeçalhos que não podem ter cópias e valores múltiplos. Assim:

  • Você vai receber 400 Bad Request com o código do erro protocol.http.DuplicateHeader se o cliente enviar uma solicitação HTTP com informações cabeçalho mais de uma vez ou com diversos valores para os cabeçalhos HTTP que não têm permissão para têm cópias/vários valores no Apigee Edge.
  • Da mesma forma, você vai receber 502 Bad Gateway com o código do erro. protocol.http.DuplicateHeader se o servidor de back-end enviar uma resposta HTTP com cabeçalho específico mais de uma vez ou com vários valores para os cabeçalhos HTTP que não são têm permissão para ter cópias ou vários valores no Apigee Edge

A solução recomendada para resolver esses erros é corrigir o aplicativo cliente e o servidor de back-end para não enviar cabeçalhos duplicados e aderir à especificação RFC 7230, seção 3.2.2: ordem dos campos, conforme explicado nos seguintes manuais de solução de problemas:

No entanto, em alguns casos você pode querer adicionar uma exceção para incluir duplicatas e vários valores para alguns cabeçalhos HTTP. Nessas situações, você pode permitir cabeçalhos duplicados e vários valores para um cabeçalho HTTP específico definindo uma propriedade HTTPHeader.HEADER_NAME em no nível do processador de mensagens.

Este documento contém informações sobre a propriedade e explica como ativar a propriedade para evitar os erros mencionados acima e compartilhar práticas recomendadas sobre eles.

Propriedades do cabeçalho HTTP para permitir cópias e vários valores

O Apigee Edge oferece as duas propriedades a seguir para controlar o comportamento de permitir duplicatas e diversos valores para cabeçalhos HTTP. Eles só podem ser configurados no Processadores de mensagens que usam a sintaxe de token explicada em Como configurar o Edge.

Nome da propriedade Descrição Valores permitidos
HTTPHeader.ANY

Esta propriedade indica se valores duplicados ou múltiplos são permitidos para todos os valores cabeçalhos, incluindo os cabeçalhos personalizados enviados como parte da solicitação HTTP feita pelo cliente ou resposta enviada pelo servidor de back-end à Apigee Edge.

Valor padrão:

multivalued, allowDuplicate,

  1. blank: cópias e valores múltiplos para cabeçalhos HTTP não são permitidos.
  2. multiValued: divide o cabeçalho com vários valores em vários. É permitido usar vários valores para cabeçalhos HTTP, mas cópias não são permitidas. O valor multiValued está ativado, o que implica que test-header=a,b seria convertido em test-header=a e test-header=b.
  3. allowDuplicate: permite vários cabeçalhos HTTP (duplicados) com o mesmo nome.
  4. multivalued, allowDuplicate: valores múltiplos e cópias são permitida para cabeçalhos HTTP.

HTTPHeader.HEADER_NAME

Esta propriedade é usada para substituir o comportamento de um cabeçalho específico do que é especificado por HTTPHeader.ANY

As mesmas informações mencionadas acima.

Cabeçalhos que não podem ter cópias e valores múltiplos

Conforme explicado anteriormente, o Apigee Edge permite cópias e vários valores para a maioria dos dados e cabeçalhos por padrão. Isso ocorre porque a propriedade HTTPHeader.ANY é configurado com o valor multivalued, allowDuplicate.

Configuração substituída

Em alguns cabeçalhos específicos, a configuração padrão é substituída usando um dos seguintes métodos:

  • HTTPHeader.HEADER_NAME=multivalued, allowDuplicate

    Essa configuração não muda o comportamento padrão. Ou seja, o cabeçalho específico pode ter cópias e valores múltiplos.

    .
  • HTTPHeader.HEADER_NAME=

    Essa configuração muda o comportamento padrão. Ou seja, a parte específica cabeçalho não pode ter cópias e valores múltiplos.

.

Determinar cabeçalhos que não podem ter cópias e valores múltiplos

Esta seção descreve como identificar o seguinte:

  • Os cabeçalhos específicos que não podem ter cópias e valores múltiplos a configuração da nuvem privada do Apigee Edge e
  • os cabeçalhos específicos com configuração pré-existente;
  1. Na máquina do Processador de mensagens, pesquise a propriedade HTTPHeader. no /opt/apigee/edge-message-processor/conf, conforme mostrado abaixo:

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

    Exemplo de resposta:

    # 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 explicado na seção Configuração substituída, observe as seguintes informações no exemplo de saída acima:
    1. O cabeçalho HTTP Connection é substituído, mas pode ter cópias e vários valores
    2. Os cabeçalhos HTTP Host e Expires são substituídos e não podem ter valores duplicados e vários valores
    3. O cabeçalho HTTP Date é substituído e pode ter cópias mas não podem ter diversos valores
    4. Todos os cabeçalhos que aparecem aqui (Connection, Host, Expires e Date na amostra acima) são chamadas de cabeçalhos com configuração pré-existente neste documento.
    .

Comportamento do Apigee Edge

A tabela a seguir descreve o comportamento do Apigee Edge quando os cabeçalhos são enviados como cópias e com vários valores, dependendo de como as propriedades HTTPHeader estão configurados nos processadores de mensagens com um exemplo de HTTPHeader de test-header.

Solicitação Cabeçalhos enviados com base no valor de conf/http.properties+HTTPHeader.test-header=
<Em branco> allowDuplicate multiValued allowDuplicate, multiValued (PADRÃO)
test‑header=a,b test‑header=a,b test‑header=a,b

protocol.http.
DuplicateHeader

Internamente, dividimos test-header=a,b em:

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

e, em seguida, o erro DuplicateHeader é gerado.

test‑header=a,b

Internamente, dividimos test-header=a,b em:

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

mas o formulário original é enviado ao alvo.

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 começar

Antes de usar as etapas deste documento, certifique-se de entender a configuração de propriedades para Borda em nuvem privada, descrita em Como configurar o Edge

Como configurar allowDuplicates e diversos valores para cabeçalhos

Conforme explicado em Propriedades do cabeçalho HTTP para permitir duplicações e vários valores, o valor da propriedade HTTPHeader.ANY = allowDuplicates, multivalued implica que todos os cabeçalhos podem ter cópias e valores múltiplos em Apigee Edge. No entanto, há alguns cabeçalhos cujos valores são substituídos explicitamente para não permitir cabeçalhos duplicados ou vários valores para thi usando a propriedade HTTPHeader.HEADER_NAME:

Nesta seção, explicamos como configurar a propriedade HTTPHeader.HEADER_NAME para permitir cópias e vários valores para qualquer esses cabeçalhos HTTP nos processadores de mensagens, usando o token correspondente de acordo com a sintaxe descrito em Como configurar o Edge.

Nesta seção, usaremos Expires (e myheader) como exemplo. cabeçalho para o qual desejamos permitir duplicatas e vários valores, conforme explicado abaixo:

  1. Determinar o valor atual da propriedade HTTPHeaderHEADER_NAME para certificar-se de que ele ainda não está habilitado para permitir cópias e valores múltiplos usando a propriedade seguinte comando:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Por exemplo, se você estiver tentando definir a propriedade para o cabeçalho Expires, verifica o valor atual do token de propriedade HTTPHeader.Expires no Message Processador:

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

    A saída do comando acima resulta em uma das seguintes situações:

    1. A propriedade é definida em branco, o que implica que o valor é substituído (e este é um cabeçalho com configuração preexistente) para NÃO permitir cabeçalhos duplicados e vários e a distribuição dos valores dos dados. Ou seja, você não tem permissão para enviar o cabeçalho Expires mais de uma vez como parte da solicitação ou resposta HTTP para a Apigee.
    2. não houver hits para a propriedade específica, isso significa que o valor não será substituído (e NÃO é um cabeçalho com uma configuração pré-existente). Isso significa que que o cabeçalho específico possa ser enviado mais de uma vez (é permitido duplicar) como parte da a solicitação HTTP ou a resposta HTTP para o Apigee Edge.
    3. A propriedade é definida com o valor allowDuplicates, multivalued e, em seguida, isso significa que o valor é substituído explicitamente (e é um cabeçalho com configuração pré-existente). Isso significa que o cabeçalho específico pode ser enviado mais de uma vez (é permitido duplicar) como parte da solicitação ou resposta HTTP para a Apigee.

    Exemplo de saída do comando de pesquisa:

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

    O exemplo de saída acima mostra que a propriedade HTTPHeader.Expires está definida como em branco. Isso significa que a propriedade é substituída para não permitir cópias ou vários valores para o cabeçalho Expires.

  2. Se você perceber que a propriedade correspondente ao cabeçalho específico está explicitamente substituído para não permitir valores duplicados ou múltiplos, como no exemplo saída acima, só então execute as etapas a seguir. Se não for explicitamente sejam substituídos, ignore o restante das etapas nesta seção.
  3. Editar. Se ele não existir, você poderá criá-lo:
    /opt/apigee/customer/application/message-processor.properties
    

    Por exemplo, para abrir o arquivo usando vi, digite o seguinte:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Adicione uma linha no seguinte formato:
    conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
    
  5. Salve as alterações.
  6. Verifique se o arquivo de propriedades pertence ao usuário apigee. Se não estiver, execute o seguinte comando:

    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Reinicie o processador de mensagens:

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

    Para reiniciar sem impacto no tráfego, consulte Reinicialização contínua de processadores de mensagens sem impacto no tráfego.

  8. Se você tiver mais de um processador de mensagens, repita as etapas acima em todos Processadores de mensagens

Como verificar se o cabeçalho está configurado para ter cópias e vários valores

Nesta seção, explicamos como verificar se a propriedade O HTTPHeader.HEADER_NAME para um cabeçalho específico foi atualizado para permitir duplicatas nos processadores de mensagens.

Vamos usar Expires como um cabeçalho de exemplo e verificar se a propriedade correspondente HTTPHeader.Expires foi atualizado.

Mesmo que você use o token conf_http_HTTPHeader.Expires para atualizar o valor na o processador de mensagens, você precisa verificar se a propriedade HTTPHeader.Expires foi definido com o novo valor.

  1. Na máquina do processador de mensagens, pesquise a propriedade HTTPHeader.HEADER_NAME no /opt/apigee/edge-message-processor/conf e verifique se ele tem foi definido com o novo valor, conforme mostrado abaixo:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Por exemplo, se você quiser verificar se a propriedade HTTPHeader.Expires está definida com o novo valor e execute o seguinte comando:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    
  2. Se o novo valor for definido para HTTPHeader.HEADER_NAME em o processador de mensagens, o comando acima mostrará o novo valor na arquivo http.properties.
  3. O exemplo de resultado do comando acima depois de você ter configurado allowDuplicates e multiValued ficam assim:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
    
  4. No exemplo de saída acima, observe que a propriedade HTTPHeader.Expires foi definido com o novo valor allowDuplicates, multiValued no http.properties Isso indica que o comportamento para permitir duplicatas e valores em HTTPHeader foram configurados com sucesso no processador de mensagens.
  5. Se você ainda estiver vendo o valor antigo da propriedade HTTPHeader.HEADER_NAME, Depois, verifique se você seguiu todas as etapas descritas Como configurar allowDuplicates e diversos valores para cabeçalhos corretamente. Se você tiver pulado alguma etapa, repita-a corretamente.

    Certifique-se de que seus proxies estejam funcionando como esperado, especialmente se houver uma lógica funcional para get e defina os cabeçalhos no proxy.

  6. Se ainda não for possível modificar a propriedade, entre em contato com o suporte do Apigee Edge.

Como desativar allowDuplicates para cabeçalhos

Esta seção explica como configurar a propriedade HTTPHeader.{Headername} para não permitir duplicatas e valores múltiplos para um cabeçalho HTTP específico em Message Processadores, que usam o token correspondente de acordo com a sintaxe descrita em Como configurar o Edge

Nesta seção, usaremos Expires (e myheader) como exemplo. cabeçalho para o qual não queremos permitir duplicatas, conforme explicado abaixo:

  1. Determinar o valor atual da propriedade HTTPHeaderHEADER_NAME para garantir que ele não esteja desativado para permitir cópias e valores múltiplos usando o seguinte comando:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Por exemplo, se você estiver tentando definir a propriedade para o cabeçalho Expires, verifique o valor atual do token de propriedade HTTPHeader.Expires no processador de mensagens:

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

    A saída do comando acima resulta em uma das seguintes situações:

    1. A propriedade é definida como em branco, e isso implica que o valor is foi substituído por NOT para permitir cabeçalhos duplicados e vários valores. Ou seja, você não tem permissão para enviar o cabeçalho Expires mais de uma vez como parte da solicitação ou resposta HTTP para a Apigee.
    2. não houver hits para a propriedade específica, isso significa que o valor não será substituído e este é um cabeçalho NOT com uma configuração preexistente. Isso significa que que o cabeçalho específico possa ser enviado mais de uma vez (é permitido duplicar) como parte da Solicitação HTTP ou resposta HTTP para o Apigee Edge.
    3. A propriedade é definida com o valor allowDuplicates, multivalued, depois o significa que o valor é substituído explicitamente e esta é uma configuração existente. No entanto, isso significa que o cabeçalho específico pode ser enviado mais de uma vez (cópias são permitido) como parte da solicitação ou resposta HTTP para a Apigee.

    Exemplo de saída 1

    Exemplo de saída no 1 do comando de pesquisa:

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

    O exemplo de saída mostra que a propriedade HTTPHeader.Expires está definida como allowDuplicates, multiValued. Isso significa que a propriedade é substituído para permitir valores duplicados ou múltiplos no cabeçalho Expires.

    Amostra de saída 2

    Exemplo de comando e saída 2 do comando de pesquisa

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

    O exemplo de saída não mostra nenhum resultado, o que implica que a propriedade HTTPHeader.myheader é definido como allowDuplicates, multiValued por padrão. Isso também significa que a propriedade não é substituída pelo cabeçalho "myheader",

  2. Se você encontrar uma das seguintes opções, siga as outras etapas desta seção:
    1. A propriedade correspondente ao cabeçalho específico é substituída para permitir cópias e vários valores, como no Exemplo de saída 1 acima (cabeçalho com configuração pré-existente)
    2. Não há hits para a propriedade correspondente ao cabeçalho específico, como no Exemplo de saída 2 acima (não é um cabeçalho com configuração pré-existente)

    Caso contrário, pule o restante das etapas nesta seção.

  3. Edite o seguinte arquivo. Se ele não existir, você poderá criá-lo.
    /opt/apigee/customer/application/message-processor.properties
    

    Por exemplo, para abrir o arquivo usando vi, digite o seguinte:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Adicione uma linha no seguinte formato ao arquivo de propriedades:

    Configuração preexistente

    Cenário 1: cabeçalho com configuração pré-existente:

    conf_http_HTTPHeader.Expires=
    

    Nenhuma configuração pré-existente

    Cenário 2: não é um cabeçalho com configuração pré-existente:

    conf/http.properties+HTTPHeader.myheader=
    
  5. Salve as alterações.
  6. Verifique se o arquivo de propriedades pertence ao usuário apigee. Caso contrário, execute o seguinte comando:
    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Reinicie o processador de mensagens:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    Para reiniciar sem impacto no tráfego, consulte Reinicialização contínua de processadores de mensagens sem impacto no tráfego.

  8. Se você tiver mais de um processador de mensagens, repita as etapas acima em todas Processadores.

Como verificar se o cabeçalho está configurado para não permitir cópias e valores múltiplos

Nesta seção, explicamos como verificar se a propriedade O HTTPHeader.HEADER_NAME para um cabeçalho específico foi atualizado para não permitir duplicatas nos processadores de mensagens.

Vamos usar Expires (e myheader) como um cabeçalho de exemplo e verificar se a propriedade correspondente HTTPHeader.Expires (e HTTPHeader.myheader) foi atualizado.

  1. Na máquina do processador de mensagens, pesquise a propriedade HTTPHeader.HEADER_NAME no diretório /opt/apigee/edge-message- processor/conf e verifique se foi definido com o novo valor como mostrados abaixo:

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

    Por exemplo, se você quiser verificar se a propriedade HTTPHeader.Expires está definida com o novo valor, execute o seguinte comando:

    Configuração preexistente

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

    Nenhuma configuração pré-existente

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    
  2. Se o novo valor do cabeçalho HTTP for definido com sucesso para HTTPHeader.HEADER_NAME I no processador de mensagens e depois no botão acima mostra o novo valor no arquivo http.properties.
  3. O exemplo de resultado do comando acima depois da desativação allowDuplicates é o seguinte:

    Configuração preexistente

    Cenário 1: cabeçalho de expiração (cabeçalho com configuração pré-existente)

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

    Nenhuma configuração pré-existente

    Cenário 2: cabeçalho myheader (não é um cabeçalho com configuração pré-existente)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
    
  4. No exemplo de saída acima, observe que a propriedade HTTPHeader.Expires ( e HTTPHeader.myheader ) foi definida com o novo valor {blank} em http.properties. Isso indica que o comportamento para permitir duplicatas e diversos valores para o cabeçalho HTTP específico Expires (e myheader) foi desativado com sucesso no processador de mensagens.
  5. Se o valor antigo ainda aparecer para a propriedade HTTPHeader.Expires (or HTTPHeader.myheader), verifique se você seguiu todas as etapas descritas em Como configurar allowDuplicates e diversos valores para cabeçalhos corretamente. Se você tiver pulado alguma etapa, repita-a corretamente.

    Certifique-se de que seus proxies estejam funcionando como esperado, especialmente se houver uma lógica funcional para receber e definir os cabeçalhos no proxy.

  6. Se mesmo assim não for possível modificar a propriedade, entre em contato com o suporte do Apigee Edge.