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

Vous consultez la documentation d'Apigee Edge.
Consultez la documentation Apigee X.
en savoir plus

Conformément à la section 3.2.2 du document RFC 7230 de la spécification HTTP, Apigee Edge s'attend à ce que la requête HTTP du client ou la réponse HTTP du serveur backend ne contienne 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 comporte une exception et qu'il est autorisé à avoir des doublons.

Par défaut, Apigee Edge autorise la transmission de valeurs en double et de valeurs multiples à la plupart des en-têtes HTTP. Toutefois, il n'autorise pas certains en-têtes listés dans En-têtes qui ne sont pas autorisés à avoir des doublons et des valeurs multiples. Par conséquent :

  • Vous obtiendrez 400 Bad Request avec le code d'erreur protocol.http.DuplicateHeader si le client envoie plusieurs fois une requête HTTP avec un en-tête particulier ou avec plusieurs valeurs pour les en-têtes HTTP qui ne sont pas autorisés à avoir des valeurs en double/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 plusieurs fois une réponse HTTP avec un en-tête particulier ou avec plusieurs valeurs pour les en-têtes HTTP qui ne sont pas autorisés à avoir des doublons ou des valeurs multiples dans Apigee Edge.

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

Toutefois, dans certains cas, vous pouvez ajouter une exception pour inclure des doublons et des valeurs multiples pour certains en-têtes HTTP. Dans ce cas, vous pouvez autoriser des 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 à ce sujet.

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 qu'ils ne peuvent être configurés que sur les processeurs de messages à l'aide de la syntaxe de jeton expliquée dans Comment 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 d'une 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, allowDuplicate,

  1. blank: les valeurs en double et les valeurs multiples ne sont pas autorisées pour les en-têtes HTTP.
  2. multiValued: divise l'en-tête à valeurs multiples en plusieurs en-têtes. Les en-têtes HTTP peuvent comporter plusieurs valeurs, mais les doublons ne sont pas autorisés. La valeur multiValued est activée, ce qui implique que test-header=a,b serait converti en test-header=a et test-header=b..
  3. allowDuplicate: autorise plusieurs en-têtes HTTP (en double) portant le même nom.
  4. multivalued, allowDuplicate: 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 rapport à ce qui est spécifié par HTTPHeader.ANY

Mêmes informations que ci-dessus.

Les en-têtes ne peuvent pas contenir de doublons et de valeurs multiples

Comme expliqué 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, allowDuplicate..

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, allowDuplicate

    Cette configuration ne modifie pas le comportement par défaut. Autrement dit, l'en-tête spécifique est autorisé à 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 contenir de doublons ni de valeurs multiples.

Déterminer les en-têtes qui ne sont pas autorisés à avoir des doublons et des valeurs multiples

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
  • En-têtes spécifiques avec une configuration préexistante
  1. Sur la machine de traitement des messages, recherchez la propriété HTTPHeader. dans le répertoire /opt/apigee/edge-message-processor/conf, comme indiqué 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 résultat ci-dessus :
    1. L'en-tête HTTP Connection est écrasé, mais peut avoir des doublons et plusieurs valeurs
    2. Les en-têtes HTTP Host et Expires sont écrasés et ne peuvent pas contenir de doublons ni de valeurs multiples
    3. L'en-tête HTTP Date est écrasé et autorisé à avoir 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 une 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 tant que doublons et avec plusieurs valeurs en fonction de la configuration des propriétés HTTPHeader sur les processeurs de messages avec un exemple HTTPHeader de test-header.

Requête TITRES sortants basés sur la valeur de conf/http.properties+HTTPHeader.test-header=
<Vide> allowDuplicate multiValued allowDuplicate, multiValued (PAR DÉFAUT)
test‑header=a,b test‑header=a,b test‑header=a,b

protocol.http.
DuplicateHeader

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

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

Ensuite, l'erreur DuplicateHeader est 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 bien comprendre la configuration des propriétés de Edge sur Private Cloud, décrite dans Comment configurer Edge.

Configuration de allowDuplicates et de plusieurs valeurs pour les en-têtes

Comme expliqué dans la section Propriétés d'en-tête HTTP pour 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 à avoir des doublons et des valeurs multiples dans Apigee Edge. Cependant, les valeurs de certains en-têtes sont explicitement écrasées pour ne pas autoriser les en-têtes en double ou plusieurs valeurs en utilisant 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 de tels en-têtes HTTP sur les processeurs de messages, à l'aide du jeton correspondant conformément à la syntaxe décrite dans Comment 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'autorise pas déjà 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é de 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 génère l'un des résultats suivants:

    1. La propriété est vide, ce qui implique que la valeur est écrasée (et qu'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 plusieurs fois dans le cadre de la requête HTTP ou de la réponse HTTP à Apigee.
    2. Il n'y a aucun appel pour la propriété spécifique. Cela signifie que la valeur n'est pas remplacé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 le cadre de la requête HTTP ou de la réponse HTTP à Apigee Edge.
    3. La propriété est définie avec la valeur allowDuplicates, multivalued, ce qui signifie que la valeur est écrite 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 le cadre de la requête HTTP ou de 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 vide. Cela signifie que la propriété est écrasée et n'autorise pas les valeurs en double ou multiples pour l'en-tête Expires.

  2. Si vous remarquez que la propriété correspondant à l'en-tête spécifique est explicitement écrasée pour empêcher les valeurs en double ou multiples, comme dans l'exemple de sortie ci-dessus, effectuez alors les étapes suivantes. Si ce n'est pas le cas, ignorez les étapes restantes de cette section.
  3. Modifier. S'il n'existe pas, 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 Redémarrage progressif des processeurs de messages sans impact sur le trafic.

  8. Si vous disposez de plusieurs processeurs de messages, répétez les étapes ci-dessus sur chacun d'eux.

Vérifier que l'en-tête est configuré pour contenir des doublons et des 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 autoriser les doublons sur les processeurs de messages.

Nous utiliserons Expires comme exemple d'en-tête et vérifions 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 de traitement des 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 une fois que vous avez configuré allowDuplicates et multiValued est le suivant:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
    
  4. Dans l'exemple de sortie 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 pour autoriser les doublons et les valeurs multiples dans HTTPHeader est correctement configuré sur le processeur de messages.
  5. Si vous voyez toujours l'ancienne valeur de la propriété HTTPHeader.HEADER_NAME, 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

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

Cette section explique comment configurer la propriété HTTPHeader.{Headername} pour ne pas autoriser 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 Configurer Edge.

Dans cette section, nous utiliserons Expires (et myheader) comme exemple d'en-tête pour lequel nous ne voulons 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 et qu'elle autorise 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é de 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 génère l'un des résultats suivants:

    1. La propriété est vide, ce qui implique que la valeur est remplacée par NOT pour autoriser les en-têtes en double et les valeurs multiples. Autrement dit, vous n'êtes pas autorisé à envoyer l'en-tête Expires plusieurs fois dans le cadre de la requête HTTP ou de la réponse HTTP à Apigee.
    2. Il n'y a aucun appel pour la propriété spécifique. Cela signifie que la valeur n'est pas remplacée. Il s'agit d'un en-tête SAUF 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 le cadre de la requête HTTP ou de la réponse HTTP à Apigee Edge.
    3. Cette propriété étant définie avec la valeur allowDuplicates, multivalued, cela signifie que cette 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 le cadre de la requête HTTP ou de la réponse HTTP à Apigee.

    Exemple de résultat 1

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

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

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

    Exemple de résultat 2

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

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

    L'exemple de résultat ne montre aucun résultat, 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 problèmes suivants, effectuez le reste des étapes 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 n° 1 ci-dessus (en-tête avec configuration préexistante).
    2. Il n'existe aucun appel pour la propriété correspondant à l'en-tête spécifique, comme dans l'exemple de sortie 2 ci-dessus (et non pour un en-tête avec une configuration préexistante).

    Sinon, ignorez les étapes restantes de cette section.

  3. Modifiez le fichier suivant. S'il n'existe pas, 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 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 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 Redémarrage progressif des processeurs de messages sans impact sur le trafic.

  8. Si vous disposez de plusieurs processeurs de messages, répétez les étapes ci-dessus sur 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 empêcher les doublons sur les processeurs de messages.

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

  1. Sur la machine de traitement des 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 d'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. L'exemple de résultat de la commande ci-dessus une fois que vous avez désactivé allowDuplicates est le suivant:

    Configuration préexistante

    Scénario 1: En-tête expirer (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 (et non un en-tête avec une configuration préexistante)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
    
  4. Dans l'exemple de sortie 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 autorisant les doublons et les valeurs multiples pour l'en-tête HTTP spécifique Expires (et myheader) a bien été 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.