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'erreurprotocol.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'erreurprotocol.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 :
|
|
|
Cette propriété permet de remplacer le comportement d'un en-tête spécifique par rapport à ce qui est spécifié par |
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
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>
- Comme expliqué dans la section Configuration écrasée, notez les informations suivantes dans l'exemple de résultat ci-dessus :
- L'en-tête HTTP
Connection
est écrasé, mais peut avoir des doublons et plusieurs valeurs - Les en-têtes HTTP
Host
etExpires
sont écrasés et ne peuvent pas contenir de doublons ni de valeurs multiples - L'en-tête HTTP
Date
est écrasé et autorisé à avoir des doublons, mais pas à plusieurs valeurs - Tous les en-têtes qui apparaissent ici (
Connection
,Host
,Expires
etDate
dans l'exemple ci-dessus) sont appelés en-têtes avec une configuration préexistante dans ce document.
- L'en-tête HTTP
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 |
En interne, nous avons divisé
Ensuite, l'erreur |
En interne, nous avons divisé
mais le formulaire d'origine est ensuite envoyé à la cible. |
test‑header=a test‑header=b |
protocol.http. |
test‑header=a test‑header=b |
protocol.http. |
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:
-
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:
- 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. - 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.
- 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êteExpires
. - 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
- 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.
- 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
- Ajoutez une ligne au format suivant :
conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
- Enregistrez les modifications.
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
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.
- 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.
- 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
- 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 fichierhttp.properties
. L'exemple de résultat de la commande ci-dessus une fois que vous avez configuré
allowDuplicates
etmultiValued
est le suivant:/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
- Dans l'exemple de sortie ci-dessus, notez que la propriété
HTTPHeader.Expires
a été définie avec la nouvelle valeurallowDuplicates, multiValued
danshttp.properties
. Cela indique que le comportement pour autoriser les doublons et les valeurs multiples dansHTTPHeader
est correctement configuré sur le processeur de messages. - 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.
- 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:
-
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:
- 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. - 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.
- 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 surallowDuplicates, multiValued
. Cela signifie que la propriété est écrasée pour autoriser les valeurs en double ou multiples pour l'en-têteExpires
.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 surallowDuplicates, multiValued
par défaut. Cela implique également que la propriété n'est pas écrasée pour l'en-tête "myheader", - 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
- Si vous remarquez l'un des problèmes suivants, effectuez le reste des étapes de cette section :
- 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).
- 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.
- 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
- 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=
- Enregistrez les modifications.
- 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
- 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.
- 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.
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
- 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 fichierhttp.properties
. - 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=
- Dans l'exemple de sortie ci-dessus, notez que la propriété
HTTPHeader.Expires
( etHTTPHeader.myheader
) a été définie avec la nouvelle valeur {blank}
danshttp.properties
. Cela indique que le comportement autorisant les doublons et les valeurs multiples pour l'en-tête HTTP spécifiqueExpires
(etmyheader
) a bien été désactivé sur le processeur de messages. 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.
- Si vous ne parvenez toujours pas à modifier la propriété, contactez l'assistance Apigee Edge.