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'erreurprotocol.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'erreurprotocol.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 :
|
|
|
Cette propriété permet de remplacer le comportement d'un en-tête spécifique par celui spécifié par |
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
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>
- Comme expliqué dans la section Configuration écrasée, notez les informations suivantes dans l'exemple de sortie ci-dessus :
- L'en-tête HTTP
Connection
est écrasé, mais peut contenir des doublons et plusieurs valeurs - Les en-têtes HTTP
Host
etExpires
sont écrasés et ne peuvent pas avoir de doublons et de valeurs multiples - L'en-tête HTTP
Date
est écrasé et peut contenir 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 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 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 |
En interne, nous divisons
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 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:
-
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:
- 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. - 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.
- 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êteExpires
. - 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
- 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.
- 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
- 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 la section Redémarrage progressif des processeurs de messages sans impact sur le trafic.
- 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.
- 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
- 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 après avoir configuré
allowDuplicates
etmultiValued
est le suivant:/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
- Dans l'exemple de résultat 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 permettant d'autoriser les doublons et les valeurs multiples dansHTTPHeader
est correctement configuré sur le processeur de messages. - 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.
- 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:
-
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:
- 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. - 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.
- 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 surallowDuplicates, multiValued
. Cela signifie que la propriété est remplacée pour autoriser les valeurs en double ou multiples pour l'en-têteExpires
.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 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 é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
- Si vous remarquez l'un des éléments suivants, effectuez les étapes restantes 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 1 ci-dessus (en-tête avec une configuration préexistante).
- 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.
- 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
- 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 ce qui suit: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 la section Redémarrage progressif des processeurs de messages sans impact sur le trafic.
- 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.
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
- 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 fichierhttp.properties
. - 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=
- Dans l'exemple de résultat 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 permettant d'autoriser les doublons et les valeurs multiples pour l'en-tête HTTPExpires
(etmyheader
) spécifique est bien 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.