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

Vous consultez la documentation Apigee Edge.
Accédez à la documentation Apigee X.

Conformément à la spécification HTTP RFC 7230, section 3.2.2 : Ordre des champs, 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 autorise la transmission de doublons 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 ne pouvant pas comporter de doublons ni de valeurs multiples. Par conséquent :

  • Vous recevrez 400 Bad Request avec le code d'erreur protocol.http.DuplicateHeader si le client envoie une requête HTTP avec un en-tête spécifique plusieurs fois ou avec plusieurs valeurs pour les en-têtes HTTP qui ne sont pas autorisés à avoir des doublons/valeurs multiples dans Apigee Edge.
  • De même, vous recevrez 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 : Ordre des champs, comme expliqué dans les manuels de dépannage suivants :

Toutefois, dans certains cas, vous pouvez ajouter une exception pour inclure les doublons et les valeurs multiples pour certains en-têtes HTTP. Dans ce cas, vous pouvez autoriser les en-têtes en double et les valeurs multiples 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 présente les bonnes pratiques à suivre.

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 Configurer Edge.

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

Cette propriété indique si les doublons ou les valeurs multiples sont autorisés 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 : fractionne l'en-tête à valeurs multiples en plusieurs en-têtes. Plusieurs valeurs sont autorisées pour les en-têtes HTTP, mais les doublons ne le sont pas. 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 : autorise plusieurs en-têtes HTTP (en double) portant le même nom.
  4. multiValued, allowDuplicates : plusieurs valeurs et 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 pour lesquels les doublons et les valeurs multiples ne sont pas autorisés

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. Cela est dû au fait que 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 remplacé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. En d'autres termes, l'en-tête spécifique peut comporter des doublons et plusieurs valeurs.

    .
  • HTTPHeader.HEADER_NAME=

    Cette configuration modifie le comportement par défaut. En d'autres termes, l'en-tête spécifique ne peut pas comporter de doublons ni plusieurs valeurs.

Identifier les en-têtes qui ne peuvent pas comporter de doublons ni plusieurs valeurs

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

  • Les en-têtes spécifiques qui ne sont pas autorisés à contenir des doublons ni plusieurs valeurs dans votre configuration Apigee Edge Private Cloud
  • 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 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 remplacé, mais il est autorisé à avoir des doublons et plusieurs valeurs
    2. Les en-têtes HTTP Host et Expires sont remplacés et ne peuvent pas avoir de doublons ni de valeurs multiples.
    3. L'en-tête HTTP Date est remplacé et peut 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 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 de HTTPHeader de test-header.

Requête En-têtes sortants basés sur 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 divisons 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 décrites dans ce document, assurez-vous de comprendre la configuration des propriétés pour Edge pour le cloud privé, décrite dans Configurer Edge.

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

Comme expliqué dans 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. Toutefois, les valeurs de certains en-têtes sont explicitement remplacées pour ne pas autoriser les en-têtes en double ni les valeurs multiples pour l'utilisation 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 les en-têtes HTTP de ce type sur les processeurs de messages, en utilisant le jeton correspondant selon 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é 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 est l'un des suivants :

    1. Si la propriété est définie sur "vide", cela signifie 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 ni les valeurs multiples. En d'autres termes, 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. Si aucun résultat n'est trouvé 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 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 cette valeur est remplacée de manière explicite (et qu'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 une valeur vide. Cela signifie que la propriété est remplacée par ne pas autoriser les valeurs en double ni les valeurs multiples pour l'en-tête Expires.

  2. Si vous remarquez que la propriété correspondant à l'en-tête spécifique est explicitement remplacée par ne pas autoriser les valeurs en double ou multiples, comme dans l'exemple de résultat ci-dessus, effectuez alors les étapes suivantes. Si elle n'est pas explicitement remplacée, ignorez le reste des étapes de cette section.
  3. Modifiez-la. Si elle n'existe pas, vous pouvez la 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 avez plusieurs processeurs de messages, répétez les étapes ci-dessus sur tous les processeurs de messages.

Vérifier que l'en-tête est configuré pour avoir des doublons et plusieurs valeurs

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

Nous utiliserons Expires comme exemple d'en-tête et vérifierons si la propriété correspondante HTTPHeader.Expires 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 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. Voici un exemple de résultat de la commande ci-dessus après avoir configuré allowDuplicates et multiValued :

    /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 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 Configurer allowDuplicates et plusieurs valeurs pour les en-têtes. Si vous avez manqué une étape, répétez-les toutes 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ésactiver allowDuplicates pour les en-têtes

Cette section explique comment configurer la propriété HTTPHeader.{Headername} pour ne pas autoriser les doublons ni les valeurs multiples pour un en-tête HTTP spécifique sur les processeurs de messages, en utilisant le jeton correspondant selon 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 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é 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 est l'un des suivants :

    1. Si la propriété est définie sur une valeur vide, cela signifie que la valeur est remplacée par NOT pour autoriser les en-têtes en double et les valeurs multiples. En d'autres termes, vous n'êtes pas autorisé à envoyer l'en-tête Expires plusieurs fois dans la requête HTTP ou la réponse HTTP à Apigee.
    2. Si aucun résultat n'est trouvé pour la propriété spécifique, cela signifie que la valeur n'est pas remplacée. Il s'agit donc 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 cette valeur est remplacée de manière explicite 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 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 résultat montre que la propriété HTTPHeader.Expires est définie sur allowDuplicates, multiValued. Cela signifie que la propriété is overwritten to allow duplicate or multiple values 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 résultat 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 remplacée pour autoriser les doublons et les valeurs multiples, comme dans l'exemple de résultat 1 ci-dessus (en-tête avec configuration préexistante).
    2. Aucun résultat n'a été trouvé pour la propriété correspondant à l'en-tête spécifique, comme dans l'exemple de résultat 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 elle n'existe pas, vous pouvez la 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 fichier de propriétés au format suivant :

    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 : Pas d'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 avez plusieurs processeurs de messages, répétez les étapes ci-dessus sur tous les processeurs de messages.

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

Cette section explique comment vérifier que la propriété HTTPHeader.HEADER_NAME d'un en-tête spécifique a été correctement 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é correspondante HTTPHeader.Expires (et HTTPHeader.myheader) 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 d'en-tête HTTP 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. Voici un exemple de résultat de la commande ci-dessus après la désactivation de allowDuplicates :

    Configuration préexistante

    Scénario 1 : en-tête "Expires" (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" (sans 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 les doublons et les valeurs multiples pour l'en-tête HTTP spécifique Expires (et myheader) a été désactivé avec succès 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 Configurer allowDuplicates et plusieurs valeurs pour les en-têtes. Si vous avez manqué une étape, répétez-les toutes 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.