Configuration de processeurs de message pour autoriser les en-têtes en double

Vous consultez la documentation d'Apigee Edge.
Accédez à la documentation sur Apigee X.
info

Conformément à la spécification HTTP RFC 7230, section 3.2.2: Field Order, Apigee Edge s'attend à ce que la requête HTTP du client ou la réponse HTTP du serveur backend ne contiennent pas le même en-tête transmis plusieurs fois avec des valeurs identiques ou différentes, sauf si l'en-tête spécifique fait l'objet d'une exception et est autorisé à contenir des doublons.

Par défaut, Apigee Edge permet de transmettre des doublons et plusieurs valeurs à la plupart des en-têtes HTTP. Toutefois, certains en-têtes listés dans la section En-têtes non autorisés à avoir des doublons et des valeurs multiples ne sont pas autorisés. Par conséquent :

  • Vous obtiendrez 400 Bad Request avec le code d'erreur protocol.http.DuplicateHeader si le client envoie une requête HTTP avec un en-tête particulier plusieurs fois ou avec plusieurs valeurs pour les en-têtes HTTP qui ne sont pas autorisés à avoir des doublons/plusieurs valeurs dans Apigee Edge.
  • De même, vous obtiendrez 502 Bad Gateway avec le code d'erreur protocol.http.DuplicateHeader si le serveur backend envoie une réponse HTTP avec un en-tête particulier plusieurs fois ou avec plusieurs valeurs pour les en-têtes HTTP qui ne sont pas autorisés à contenir des doublons ou plusieurs valeurs dans Apigee Edge.

La solution recommandée pour résoudre ces erreurs consiste à corriger l'application cliente et le serveur backend afin qu'ils n'envoient pas d'en-têtes en double et qu'ils respectent la spécification RFC 7230, section 3.2.2: Field Order, comme expliqué dans les playbooks de dépannage suivants:

Toutefois, dans certains cas, vous pouvez ajouter une exception afin d'inclure les doublons et plusieurs valeurs pour certains en-têtes HTTP. Dans de telles situations, vous pouvez autoriser les en-têtes en double et plusieurs valeurs pour un en-tête HTTP spécifique en définissant une propriété HTTPHeader.HEADER_NAME au niveau du processeur de messages.

Ce document fournit des informations sur cette propriété, explique comment l'activer pour éviter les erreurs mentionnées ci-dessus et partage les bonnes pratiques à cet égard.

Propriétés d'en-tête HTTP pour autoriser les doublons et les valeurs multiples

Apigee Edge fournit les deux propriétés suivantes pour contrôler le comportement d'autorisation des doublons et des valeurs multiples pour les en-têtes HTTP. Notez que ces éléments ne peuvent être configurés que sur les processeurs de messages à l'aide de la syntaxe de jeton expliquée dans la section Configurer Edge.

Nom de propriété Description Valeurs autorisées
HTTPHeader.ANY

Cette propriété indique si des valeurs en double ou multiples sont autorisées pour tous les en-têtes HTTP, y compris les en-têtes personnalisés envoyés dans le cadre de la requête HTTP effectuée par le client ou de la réponse HTTP envoyée par le serveur backend à Apigee Edge.

Valeur par défaut :

multiValued, allowDuplicates,

  1. blank: les doublons et les valeurs multiples pour les en-têtes HTTP ne sont pas autorisés.
  2. multiValued: divise l'en-tête à valeurs multiples en plusieurs en-têtes. Vous pouvez spécifier plusieurs valeurs pour les en-têtes HTTP, mais pas de valeurs en double. La valeur multiValued est activée, ce qui implique que test-header=a,b sera converti en test-header=a et test-header=b..
  3. allowDuplicates: permet d'utiliser plusieurs en-têtes HTTP (en double) portant le même nom.
  4. multiValued, allowDuplicates: les valeurs multiples et les doublons sont autorisés pour les en-têtes HTTP.

HTTPHeader.HEADER_NAME

Cette propriété permet de remplacer le comportement d'un en-tête spécifique par celui spécifié par HTTPHeader.ANY.

Mêmes informations que ci-dessus.

En-têtes ne pouvant pas contenir de valeurs en double ni plusieurs valeurs

Comme indiqué précédemment, Apigee Edge autorise les doublons et les valeurs multiples pour la plupart des en-têtes HTTP par défaut. En effet, la propriété HTTPHeader.ANY est configurée avec la valeur multiValued, allowDuplicates..

Configuration écrasée

Pour certains en-têtes spécifiques, la configuration par défaut est écrasée à l'aide de l'une des méthodes suivantes:

  • HTTPHeader.HEADER_NAME=multiValued, allowDuplicates

    Cette configuration ne modifie pas le comportement par défaut. Autrement dit, l'en-tête spécifique peut contenir des doublons et des valeurs multiples.

    .
  • HTTPHeader.HEADER_NAME=

    Cette configuration modifie le comportement par défaut. Autrement dit, l'en-tête spécifique ne peut pas avoir de doublons et de valeurs multiples.

Déterminer les en-têtes pour lesquels les doublons et les valeurs multiples ne sont pas autorisés

Cette section explique comment identifier les éléments suivants:

  • Les en-têtes spécifiques qui ne sont pas autorisés à avoir des doublons et des valeurs multiples sur votre configuration de cloud privé Apigee Edge et
  • Les en-têtes spécifiques avec une configuration préexistante
  1. Sur la machine du processeur de messages, recherchez la propriété HTTPHeader. dans le répertoire /opt/apigee/edge-message-processor/conf, comme illustré ci-dessous:

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

    Exemple de résultat :

    # 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. Comme expliqué dans la section Configuration écrasée, notez les informations suivantes dans l'exemple de sortie ci-dessus :
    1. L'en-tête HTTP Connection est écrasé, mais peut contenir des doublons et plusieurs valeurs
    2. Les en-têtes HTTP Host et Expires sont écrasés et ne peuvent pas avoir de doublons et de valeurs multiples
    3. L'en-tête HTTP Date est écrasé et peut contenir des doublons, mais pas plusieurs valeurs
    4. Tous les en-têtes qui apparaissent ici (Connection, Host, Expires et Date dans l'exemple ci-dessus) sont appelés en-têtes avec configuration préexistante dans ce document.

Comportement d'Apigee Edge

Le tableau suivant décrit le comportement d'Apigee Edge lorsque les en-têtes sont envoyés en double et avec plusieurs valeurs en fonction de la configuration des propriétés HTTPHeader sur les processeurs de messages, avec un exemple d'HTTPHeader de test-header.

Requête HEADERS sortants en fonction de la valeur de conf/http.properties+HTTPHeader.test-header=
<Blank> allowDuplicates multiValued allowDuplicates, multiValued (PAR DÉFAUT)
test‑header=a,b test‑header=a,b test‑header=a,b

protocol.http.
DuplicateHeader

En interne, nous divisons test-header=a,b en:

  • test-header=a et
  • test-header=b

L'erreur DuplicateHeader est alors générée.

test‑header=a,b

En interne, nous avons divisé test-header=a,b en:

  • test-header=a et
  • test-header=b

mais le formulaire d'origine est ensuite envoyé à la cible.

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

Avant de commencer

Avant de suivre les étapes de ce document, assurez-vous de comprendre la configuration des propriétés pour Edge sur le cloud privé, comme décrit dans la section Configurer Edge.

Configurer allowDuplicates et plusieurs valeurs pour les en-têtes

Comme expliqué dans la section Propriétés d'en-tête HTTP permettant d'autoriser les doublons et les valeurs multiples,la valeur de la propriété HTTPHeader.ANY = allowDuplicates, multiValued implique que tous les en-têtes sont autorisés à comporter des doublons et des valeurs multiples dans Apigee Edge. Toutefois, certaines valeurs d'en-têtes sont écrasées explicitement pour ne pas autoriser de doublons d'en-têtes ni de valeurs multiples pour ce paramètre à l'aide de la propriété HTTPHeader.HEADER_NAME.

Cette section explique comment configurer la propriété HTTPHeader.HEADER_NAME pour autoriser les doublons et les valeurs multiples pour tous ces en-têtes HTTP sur les processeurs de messages, à l'aide du jeton correspondant conformément à la syntaxe décrite dans Configurer Edge.

Dans cette section, nous utiliserons Expires (et myheader) comme exemple d'en-tête pour lequel nous souhaitons autoriser les doublons et les valeurs multiples, comme expliqué ci-dessous:

  1. Déterminez la valeur actuelle de la propriété HTTPHeaderHEADER_NAME pour vous assurer qu'elle n'est pas déjà activée pour autoriser les doublons et les valeurs multiples à l'aide de la commande suivante:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Par exemple, si vous essayez de définir la propriété pour l'en-tête Expires, vérifiez la valeur actuelle du jeton de propriété HTTPHeader.Expires sur le processeur de messages:

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

    Le résultat de la commande ci-dessus est l'un des éléments suivants:

    1. Si la propriété est définie sur "vide", cela implique que la valeur est écrasée (et il s'agit d'un en-tête avec une configuration préexistante) pour NE PAS autoriser les en-têtes en double et les valeurs multiples. Autrement dit, vous n'êtes pas autorisé à envoyer l'en-tête Expires plus d'une fois dans la requête HTTP ou la réponse HTTP à Apigee.
    2. Il n'existe aucun appel pour la propriété spécifique. Cela signifie donc que cette valeur n'est pas écrasée (et qu'il ne s'agit PAS d'un en-tête avec une configuration préexistante). Cela signifie que l'en-tête spécifique peut être envoyé plusieurs fois (les doublons sont autorisés) dans la requête HTTP ou la réponse HTTP à Apigee Edge.
    3. La propriété est définie avec la valeur allowDuplicates, multiValued, ce qui signifie que cette valeur est écrasée explicitement (il s'agit d'un en-tête avec une configuration préexistante). Cela signifie que l'en-tête spécifique peut être envoyé plusieurs fois (les doublons sont autorisés) dans la requête HTTP ou la réponse HTTP à Apigee.

    Exemple de résultat de la commande de recherche:

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

    L'exemple de résultat ci-dessus montre que la propriété HTTPHeader.Expires est définie sur vide. Cela signifie que la propriété est remplacée et n'autorise pas les valeurs en double ou multiples pour l'en-tête Expires.

  2. Si vous constatez que la propriété correspondant à l'en-tête spécifique est explicitement écrasée pour ne pas autoriser de valeurs en double ou multiples, comme dans l'exemple de sortie ci-dessus, uniquement procédez comme suit. Si ce n'est pas le cas, ignorez les étapes suivantes de cette section.
  3. Modifier. Si ce n'est pas le cas, vous pouvez le créer:
    /opt/apigee/customer/application/message-processor.properties

    Par exemple, pour ouvrir le fichier à l'aide de vi, saisissez la commande suivante:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Ajoutez une ligne au format suivant:
    conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
  5. Enregistrez les modifications.
  6. Assurez-vous que le fichier de propriétés appartient à l'utilisateur apigee. Si ce n'est pas le cas, exécutez la commande suivante:

    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Redémarrez le processeur de messages:

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

    Pour redémarrer sans impact sur le trafic, consultez la section Redémarrage progressif des processeurs de messages sans impact sur le trafic.

  8. Si vous disposez de plusieurs processeurs de messages, répétez la procédure ci-dessus pour chacun d'eux.

Vérifier que l'en-tête est configuré pour accepter les doublons et les valeurs multiples

Cette section explique comment vérifier que la propriété HTTPHeader.HEADER_NAME d'un en-tête spécifique a bien été mise à jour afin d'autoriser les doublons sur les processeurs de messages.

Nous utiliserons Expires comme exemple d'en-tête et vérifierons si la propriété HTTPHeader.Expires correspondante a été mise à jour.

Même si vous utilisez le jeton conf_http_HTTPHeader.Expires pour mettre à jour la valeur sur le processeur de messages, vous devez vérifier si la propriété HTTPHeader.Expires réelle a été définie avec la nouvelle valeur.

  1. Sur la machine du processeur de messages, recherchez la propriété HTTPHeader.HEADER_NAME dans le répertoire /opt/apigee/edge-message-processor/conf et vérifiez si elle a été définie avec la nouvelle valeur, comme indiqué ci-dessous:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Par exemple, si vous souhaitez vérifier que la propriété HTTPHeader.Expires est définie avec la nouvelle valeur, exécutez la commande suivante:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    
  2. Si la nouvelle valeur est correctement définie pour HTTPHeader.HEADER_NAME sur le processeur de messages, la commande ci-dessus affiche la nouvelle valeur dans le fichier http.properties.
  3. L'exemple de résultat de la commande ci-dessus après avoir configuré allowDuplicates et multiValued est le suivant:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
  4. Dans l'exemple de résultat ci-dessus, notez que la propriété HTTPHeader.Expires a été définie avec la nouvelle valeur allowDuplicates, multiValued dans http.properties. Cela indique que le comportement permettant d'autoriser les doublons et les valeurs multiples dans HTTPHeader est correctement configuré sur le processeur de messages.
  5. Si l'ancienne valeur de la propriété HTTPHeader.HEADER_NAME s'affiche toujours, vérifiez que vous avez correctement suivi toutes les étapes décrites dans la section Configurer allowDuplicates et plusieurs valeurs pour les en-têtes. Si vous avez manqué une étape, répétez toutes les étapes correctement.

    Assurez-vous que vos proxys fonctionnent comme prévu, en particulier s'il existe une logique fonctionnelle pour obtenir et définir les en-têtes dans le proxy.

  6. Si vous ne pouvez toujours pas modifier la propriété, contactez l'assistance Apigee Edge.

Désactivation de "allowDuplicates" pour les en-têtes

Cette section explique comment configurer la propriété HTTPHeader.{Headername} pour interdire les doublons et les valeurs multiples pour un en-tête HTTP spécifique sur les processeurs de messages, à l'aide du jeton correspondant conformément à la syntaxe décrite dans la section Configurer Edge.

Dans cette section, nous utiliserons Expires (et myheader) comme exemple d'en-tête pour lequel nous ne souhaitons pas autoriser les doublons, comme expliqué ci-dessous:

  1. Déterminez la valeur actuelle de la propriété HTTPHeaderHEADER_NAME pour vous assurer qu'elle n'est pas déjà désactivée afin d'autoriser les doublons et les valeurs multiples à l'aide de la commande suivante:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Par exemple, si vous essayez de définir la propriété pour l'en-tête Expires, vérifiez la valeur actuelle du jeton de propriété HTTPHeader.Expires sur le processeur de messages:

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

    Le résultat de la commande ci-dessus est l'un des éléments suivants:

    1. La propriété est vide, ce qui implique que la valeur est écrasée sur NOT afin d'autoriser les en-têtes en double et les valeurs multiples. Autrement dit, vous n'êtes pas autorisé à envoyer l'en-tête Expires plus d'une fois dans la requête HTTP ou la réponse HTTP à Apigee.
    2. S'il n'y a pas de résultats pour la propriété spécifique, cela signifie que la valeur n'est pas écrasée et qu'il s'agit d'un en-tête NOT avec une configuration préexistante. Cela signifie que l'en-tête spécifique peut être envoyé plusieurs fois (les doublons sont autorisés) dans la requête HTTP ou la réponse HTTP à Apigee Edge.
    3. Si la propriété est définie avec la valeur allowDuplicates, multiValued, cela signifie que la valeur est écrasée explicitement et qu'il s'agit d'une configuration existante. Toutefois, cela signifie que l'en-tête spécifique peut être envoyé plusieurs fois (les doublons sont autorisés) dans la requête HTTP ou la réponse HTTP à Apigee.

    Exemple de résultat n° 1

    Exemple de résultat 1 de la commande de recherche:

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

    L'exemple de sortie montre que la propriété HTTPHeader.Expires est définie sur allowDuplicates, multiValued. Cela signifie que la propriété est remplacée pour autoriser les valeurs en double ou multiples pour l'en-tête Expires.

    Exemple de résultat 2

    Exemple de commande et de résultat 2 de la commande de recherche

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

    L'exemple de sortie n'affiche aucune sortie, ce qui implique que la propriété HTTPHeader.myheader est définie sur allowDuplicates, multiValued par défaut. Cela implique également que la propriété n'est pas écrasée pour l'en-tête myheader.

  2. Si vous remarquez l'un des éléments suivants, effectuez les étapes restantes de cette section :
    1. La propriété correspondant à l'en-tête spécifique est écrasée pour autoriser les doublons et les valeurs multiples, comme dans l'exemple de sortie 1 ci-dessus (en-tête avec une configuration préexistante).
    2. Aucun résultat n'est renvoyé pour la propriété correspondant à l'en-tête spécifique, comme dans l'exemple de sortie 2 ci-dessus (il ne s'agit pas d'un en-tête avec une configuration préexistante).

    Sinon, ignorez les étapes restantes de cette section.

  3. Modifiez le fichier suivant. Si ce n'est pas le cas, vous pouvez le créer.
    /opt/apigee/customer/application/message-processor.properties

    Par exemple, pour ouvrir le fichier à l'aide de vi, saisissez ce qui suit:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Ajoutez une ligne au format suivant au fichier de propriétés:

    Configuration préexistante

    Scénario 1: En-tête avec une configuration préexistante :

    conf_http_HTTPHeader.Expires=

    Aucune configuration préexistante

    Scénario 2: Il ne s'agit pas d'un en-tête avec une configuration préexistante:

    conf/http.properties+HTTPHeader.myheader=
  5. Enregistrez les modifications.
  6. Assurez-vous que le fichier de propriétés appartient à l'utilisateur apigee. Si ce n'est pas le cas, exécutez ce qui suit:
    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Redémarrez le processeur de messages:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    Pour redémarrer sans impact sur le trafic, consultez la section Redémarrage progressif des processeurs de messages sans impact sur le trafic.

  8. Si vous avez plusieurs processeurs de messages, répétez la procédure ci-dessus pour chacun d'eux.

Vérifier que l'en-tête est configuré pour ne pas autoriser les doublons et les valeurs multiples

Cette section explique comment vérifier que la propriété HTTPHeader.HEADER_NAME d'un en-tête spécifique a bien été mise à jour pour ne pas autoriser les doublons sur les processeurs de messages.

Nous utiliserons Expires (et myheader) comme exemple d'en-tête et vérifierons si la propriété HTTPHeader.Expires (et HTTPHeader.myheader) correspondante a été mise à jour.

  1. Sur la machine du processeur de messages, recherchez la propriété HTTPHeader.HEADER_NAME dans le répertoire /opt/apigee/edge-message- processor/conf et vérifiez si elle a été définie avec la nouvelle valeur, comme indiqué ci-dessous:

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

    Par exemple, si vous souhaitez vérifier que la propriété HTTPHeader.Expires est définie avec la nouvelle valeur, vous pouvez exécuter la commande suivante:

    Configuration préexistante

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

    Aucune configuration préexistante

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    
  2. Si la nouvelle valeur de l'en-tête HTTP est correctement définie pour HTTPHeader.HEADER_NAME I sur le processeur de messages, la commande ci-dessus affiche la nouvelle valeur dans le fichier http.properties.
  3. Voici un exemple de résultat de la commande ci-dessus après avoir désactivé allowDuplicates:

    Configuration préexistante

    Scénario 1: En-tête d'expiration (en-tête avec configuration préexistante)

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

    Aucune configuration préexistante

    Scénario 2: En-tête myheader (pas un en-tête avec une configuration préexistante)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
  4. Dans l'exemple de résultat ci-dessus, notez que la propriété HTTPHeader.Expires ( et HTTPHeader.myheader) a été définie avec la nouvelle valeur {blank} dans http.properties. Cela indique que le comportement permettant d'autoriser les doublons et les valeurs multiples pour l'en-tête HTTP Expires (et myheader) spécifique est bien désactivé sur le processeur de messages.
  5. Si l'ancienne valeur de la propriété HTTPHeader.Expires (or HTTPHeader.myheader) s'affiche toujours, vérifiez que vous avez correctement suivi toutes les étapes décrites dans la section Configurer allowDuplicates et plusieurs valeurs pour les en-têtes. Si vous avez manqué une étape, répétez-la correctement.

    Assurez-vous que vos proxys fonctionnent comme prévu, en particulier s'il existe une logique fonctionnelle pour obtenir et définir les en-têtes dans le proxy.

  6. Si vous ne parvenez toujours pas à modifier la propriété, contactez l'assistance Apigee Edge.