Vous consultez la documentation Apigee Edge.
Accédez à la documentation Apigee X.
Problème constaté
L'application cliente reçoit un code d'état HTTP 502 Bad Gateway avec le code d'erreur messaging.adaptors.http.flow.DecompressionFailureAtResponse en réponse aux appels d'API.
Message d'erreur
L'application cliente reçoit le code de réponse suivant :
HTTP/1.1 502 Bad Gateway
De plus, un message d'erreur semblable à celui ci-dessous peut s'afficher :
{
"fault":{
"faultstring":"Decompression failure at response",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"
}
}
}Causes possibles
Cette erreur ne se produit que dans les cas suivants :
- L'encodage spécifié dans l'en-tête de réponse HTTP (du serveur backend/cible)
Content-Encodingest valide et compatible avec Apigee Edge. - Le format de la charge utile envoyée par le serveur backend/cible dans la réponse HTTP ne correspond pas au format d'encodage spécifié dans l'en-tête
Content-Encoding.
MAIS
En effet, Apigee Edge ne parvient pas à décoder la charge utile à l'aide de l'encodage spécifié, car le format de la charge utile n'est pas le même que celui de l'encodage spécifié dans l'en-tête Content-Encoding.
Voici quelques exemples de valeurs Content-Encoding acceptées et de la façon dont Apigee Edge s'attend à ce que la représentation de la charge utile soit dans ces cas :
| Scénario | Content-Encoding | Représentation de la charge utile |
|---|---|---|
| Encodage unique | gzip | Format Unix Consultez RFC1952 GZIP Format. |
| Encodage unique | deflate | Ce format utilise la structure |
| Encodage multiple | Encodage multiple Par exemple, dans les cas où l'encodage est effectué deux fois, il peut s'agir de :
|
Encodage multiple appliqué à la charge utile dans l'ordre indiqué dans l'en-tête. |
Voici les causes possibles de cette erreur :
| Cause | Description | Instructions de dépannage applicables |
|---|---|---|
| Le format de la charge utile de la réponse ne correspond pas à l'en-tête Content-Encoding. | Le format de la charge utile de la réponse envoyée par le serveur backend/cible n'est pas encodé ou ne correspond pas à l'encodage spécifié dans l'en-tête Content-Encoding. |
Utilisateurs du cloud public et privé Edge |
Étapes de diagnostic courantes
Utilisez l'un des outils/techniques suivants pour diagnostiquer cette erreur :
Surveillance des API
Pour diagnostiquer l'erreur à l'aide d'API Monitoring :
- Connectez-vous à l'UI Apigee Edge en tant qu'utilisateur disposant d'un rôle approprié.
Basculez vers l'organisation dans laquelle vous souhaitez examiner le problème.
- Accédez à la page Analyser > API Monitoring > Examiner.
- Sélectionnez la période spécifique au cours de laquelle vous avez observé les erreurs.
- Assurez-vous que le filtre Proxy est défini sur Tous.
- Représentez graphiquement Code d'erreur par rapport à Heure.
Sélectionnez une cellule contenant le code d'erreur
messaging.adaptors.http.flow.DecompressionFailureAtResponse, comme indiqué ci-dessous :
Les informations sur le code d'erreur
messaging.adaptors.http.flow.DecompressionFailureAtResponses'affichent comme indiqué ci-dessous :
Cliquez sur Afficher les journaux, puis développez la ligne qui échoue avec l'erreur
502.
- Dans la fenêtre Journaux, notez les informations suivantes :
- Code d'état :
502 - Source de la défaillance :
target - Code d'erreur :
messaging.adaptors.http.flow.DecompressionFailureAtResponse.
- Code d'état :
- Si la source de l'erreur a la valeur
target, cela indique que le format de la charge utile de la réponse ne correspond pas à l' encodage compatible spécifié dans l'en-tête de réponse du serveur backendContent-Encoding.
Outil Trace
Pour diagnostiquer l'erreur à l'aide de l'outil Trace :
- Activez la session de trace, puis :
- Attendez que l'erreur
502 Bad Gatewayse produise. - Si vous pouvez reproduire le problème, effectuez l'appel d'API et reproduisez
502 Bad Gateway.
- Attendez que l'erreur
Assurez-vous que l'option Afficher toutes les FlowInfos est activée :
- Sélectionnez l'une des réponses ayant échoué et examinez la trace.
- Parcourez les différentes phases de la trace et identifiez l'emplacement de l'échec.
Vous trouverez généralement l'erreur dans un flux juste après la phase Réponse reçue du serveur cible, comme indiqué ci-dessous :
-
Notez les valeurs des propriétés de la trace :
- Content-Encoding :
gzip - Corps du contenu de la réponse :
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Content-Encoding :
Accédez à la phase d'erreur juste après la phase Réponse reçue du serveur cible :
Notez les propriétés :
- Erreur :
Decompression failure at response - error.class: :
com.apigee.errors.http.server.BadGateway error.cause: :
Not in GZIP formatLe champ error.cause indique que la charge utile de la réponse n'est pas au format GZIP. Cela signifie qu'Apigee Edge s'attendait à ce que la charge utile de la réponse soit au format GZIP, comme indiqué dans l'en-tête
Content-Encoding(déterminé à l'étape précédente).Par conséquent, Apigee Edge ne peut pas décompresser la charge utile à l'aide de gzip et renvoie l'erreurDecompression failure at response.
Notez que la réponse du serveur cible/de backend est
200dans ce cas. Toutefois, l'application cliente recevra une réponse502, car l'erreur est renvoyée par Apigee Edge.- Erreur :
Accédez à la phase Réponse envoyée au client dans la trace, puis cliquez dessus.
Notez les détails suivants dans la trace :
- Code d'état :
502 Bad Gateway. - Contenu de l'erreur :
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Code d'état :
Accédez à la phase AX (données Analytics enregistrées) dans la trace et cliquez dessus.
- Faites défiler la page vers le bas jusqu'aux sections Détails de la phase et En-têtes d'erreur, puis déterminez les valeurs de X-Apigee-fault-code et X-Apigee-fault-source, comme indiqué ci-dessous :
- Les valeurs de X-Apigee-fault-code et X-Apigee-fault-source sont
messaging.adaptors.http.flow.DecompressionFailureAtResponseettarget, ce qui indique que le format de charge utile de la réponse ne correspond pas à l'encodage spécifié dans l'en-têteContent-Encoding.En-têtes de réponse Valeur X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
NGINX
Pour diagnostiquer l'erreur à l'aide des journaux d'accès NGINX :
- Si vous êtes un utilisateur Private Cloud, vous pouvez utiliser les journaux d'accès NGINX pour déterminer les informations clés sur les erreurs HTTP
502. Vérifiez les journaux d'accès NGINX :
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logOù : ORG, ENV et PORT# sont remplacés par des valeurs réelles.
- Recherchez s'il existe des erreurs
502pendant une durée spécifique (si le problème s'est produit dans le passé) ou si des réponses échouent toujours avec502. Si vous trouvez des erreurs
502avec le X-Apigee-fault-code correspondant à la valeur demessaging.adaptors.http.flow.DecompressionFailureAtResponse, déterminez la valeur de X-Apigee-fault-source.Exemple d'erreur 502 dans le journal d'accès NGINX :
L'exemple d'entrée ci-dessus du journal d'accès NGINX présente les valeurs suivantes pour X-Apigee-fault-code et X-Apigee-fault-source :
En-têtes de réponse Valeur X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
Cause : Le format de la charge utile de la réponse ne correspond pas à l'encodage du contenu
Par défaut, Apigee Edge décompresse toujours la charge utile si l'en-tête de réponse Content-Encoding contient un
encodage valide et compatible. Par conséquent, le format de la charge utile de la réponse doit correspondre à l'encodage spécifié dans l'en-tête de réponse Content-Encoding.
Si les informations ne correspondent pas, ce message d'erreur s'affiche.
Diagnostic
- Déterminez le code d'erreur et la source de l'erreur observée à l'aide de la surveillance des API, de l'outil Trace ou des journaux d'accès NGINX, comme expliqué dans Étapes de diagnostic courantes.
- Si le code d'erreur est
messaging.adaptors.http.flow.DecompressionFailureAtResponseet que la source de l'erreur a la valeurtarget, cela indique que le format de la charge utile de la réponse envoyée par le serveur backend/cible ne correspond pas à l' encodage compatible spécifié dans l'en-tête de réponseContent-Encoding. Vous pouvez déterminer l'incohérence dans la réponse HTTP à l'aide de l'une des méthodes suivantes :
Message d'erreur
Pour valider à l'aide du message d'erreur :
-
Si vous avez accès au message d'erreur complet reçu d'Apigee Edge, consultez
faultstring.Exemple de message d'erreur :
"faultstring":"Decompression failure at response"
- Dans le message d'erreur ci-dessus,
"Decompression failure at response"s'affiche, ce qui implique que la réponse n'a pas pu être décompressée à l'aide de l'encodage spécifié dans l'en-têteContent-Encoding.
Trace
Pour valider à l'aide de Trace :
- Déterminez le Content-Type et error.cause à l'aide de Trace, comme expliqué dans Étapes de diagnostic courantes.
Les valeurs de l'exemple de trace sont les suivantes :
- Content-Encoding :
gzip - error.cause: :
Not in GZIP format
La valeur de l'en-tête de réponse Content-Encoding est gzip. Toutefois, la charge utile de la réponse n'est pas au format GZIP (comme indiqué par error.cause). Par conséquent, Apigee Edge répond avec
502 Bad Gatewayet le code d'erreurmessaging.adaptors.http.flow.DecompressionFailureAtResponse.- Content-Encoding :
Demande réelle
Pour valider les résultats à l'aide de la requête réelle :
Si vous avez accès à la requête réelle envoyée à l'application serveur cible/backend, procédez comme suit :
- Si vous êtes un utilisateur de cloud public/privé, envoyez une requête directement au serveur backend depuis le serveur backend lui-même ou depuis toute autre machine à partir de laquelle vous êtes autorisé à envoyer la requête au serveur backend.
- Si vous êtes un utilisateur du cloud privé, vous pouvez également envoyer la requête au serveur backend depuis l'un des processeurs de messages.
- Examinez la réponse envoyée par le serveur backend et déterminez la valeur transmise dans l'en-tête de réponse
Content-Encoding.. - Déterminez le format de la charge utile envoyée dans la requête.
- Si la valeur de l'en-tête
Content-Encodingfigure dans la liste des encodages acceptés, mais que le format de la charge utile de la réponse ne correspond pas à l'encodage spécifié dans l'en-têteContent-Encoding, il s'agit de la cause du problème.Exemple :
curl -v https://HOSTALIAS/test
***trimmed*** > < HTTP/1.1 200 OK < Accept-Ranges: bytes <
Content-Encoding: gzip< Date: Mon, 02 Aug 2021 08:17:35 GMT < Transfer-Encoding: chunked < < response_payload.zip Response Body(not in GZIP format)>L'exemple de réponse ci-dessus envoie la valeur
gzipà l'en-têteContent-Encoding, qui est un encodage compatible dans Apigee Edge. Toutefois, leresponse_payload.zipest envoyé sous forme de fichier ZIP. Par conséquent, cette réponse échoue avec une erreur502 Bad Gatewayet le code d'erreurmessaging.adaptors.http.flow.DecompressionFailureAtResponse.
Journaux du processeur de messages
Pour valider à l'aide des journaux du processeur de messages :
Si vous êtes un utilisateur Private Cloud, vous pouvez utiliser les journaux du processeur de messages pour déterminer les informations clés sur les erreurs HTTP
502.Consultez le journal du processeur de messages :
/opt/apigee/var/log/edge-message-processor/logs/system.logRecherchez s'il existe des erreurs
502pendant une durée spécifique (si le problème s'est produit dans le passé) ou si des réponses échouent toujours avec502. Vous pouvez utiliser la chaîne de recherche suivante :grep -ri "ZipException"
Vous trouverez des lignes de system.log semblables à celles-ci :
Scénario 1
Scénario 1 : Lorsque la réponse de l'API comporte l'en-tête Content-Encoding: gzip
2021-08-02 06:50:25,433 NIOThread@2 ERROR HTTP.CLIENT - HTTPClient$Context.onInputException() : ClientInputChannel(ClientChannel[Connected: Remote:3.8.1.1:9000 Local:10.0.115.32:41298]@38140 useCount=1 bytesRead=0 bytesWritten=203 age=469ms lastIO=0ms isOpen=true).onExceptionRead exception: {}java.util.zip.ZipException: Not in GZIP format---trimmed-- 2021-08-02 06:50:25,433 NIOThread@2 INFO HTTP.CLIENT - HTTPClient$Context.logContextDetails() : Request details : host=null path=/folder/testFile method=GET. Channel details : Bytes read=0 2021-08-02 06:50:25,434 NIOThread@2 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@4806fdab, Not in GZIP format) 2021-08-02 06:50:25,434 NIOThread@2 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exceptionjava.util.zip.ZipException: Not in GZIP formatoccurred while writing to channel null 2021-08-02 06:50:25,434 NIOThread@2 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: Not in GZIP formatLa ligne
java.util.zip.ZipException: Not in GZIP formatdu message d'erreur ci-dessus indique que la charge utile de la réponse n'est pas envoyée au format GZIP, alors queContent-Encodingest spécifié comme gzip. Par conséquent, Apigee Edge génère l'exception et renvoie un code d'état502avec le code d'erreurmessaging.adaptors.http.flow.DecompressionFailureAtResponseaux applications clientes.Scénario 2
Scénario 2 : Lorsque la réponse de l'API contient l'en-tête "Content-Encoding: deflate"
2021-08-02 06:35:21,215 NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context.onInputException() : ClientInputChannel(ClientChannel[Connected: Remote:3.8.1.1:9000 Local:192.168.194.140:35224]@36014 useCount=1 bytesRead=0 bytesWritten=202 age=439ms lastIO=2ms isOpen=true).onExceptionRead exception: {}java.util.zip.ZipException: incorrect header check---trimmed---- Caused by:java.util.zip.DataFormatException: incorrect header check---trimmed--- 2021-08-02 06:35:21,215 NIOThread@0 INFO HTTP.CLIENT - HTTPClient$Context.logContextDetails() : Request details : host=null path=/folder/testFile method=GET. Channel details : Bytes read=0 2021-08-02 06:35:21,216 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@3966e277, incorrect header check) 2021-08-02 06:35:21,216 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception java.util.zip.ZipException: incorrect header check occurred while writing to channel null 2021-08-02 06:35:21,217 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: incorrect header checkLes lignes
java.util.zip.ZipException: incorrect header checketCaused by: java.util.zip.DataFormatException: incorrect header checkdu message d'erreur ci-dessus indiquent que la charge utile de la réponse n'est pas envoyée au format deflate et ne correspond pas à l'encodage spécifié dans l'en-têteContent-Encodingde deflate. Par conséquent, Apigee Edge génère l'exception et renvoie un code d'état502avec le code d'erreurmessaging.adaptors.http.flow.DecompressionFailureAtResponseaux applications clientes.
-
Solution
- Si la charge utile de réponse compressée n'est pas nécessaire dans le flux de proxy d'API dans Apigee Edge et dans le serveur backend, ne transmettez pas l'en-tête
Content-Encoding. Si vous devez compresser la charge utile de la réponse, passez à l'étape 2. - Si vous devez compresser la charge utile de la réponse, assurez-vous que le serveur de backend envoie toujours les éléments suivants :
- L'un des
encodages acceptés comme valeur de l'en-tête
Content-Encodingdans la réponse - La charge utile de la réponse au format compatible avec Apigee Edge correspond au format d'encodage spécifié dans l'en-tête
Content-Encoding.
- L'un des
encodages acceptés comme valeur de l'en-tête
- Dans l'exemple ci-dessus, la charge utile de la réponse est au format ZIP, mais l'en-tête de réponse spécifie
Content-Encoding: gzip. Pour résoudre le problème, vous pouvez envoyer l'en-tête de réponse au formatContent-Encoding: gzipet la charge utile de la réponse au formatgzip:curl -v https://HOSTALIAS/v1/test
> < HTTP/1.1 200 OK < Accept-Ranges: bytes <
Content-Encoding: gzip< Date: Mon, 02 Aug 2021 08:17:35 GMT < Transfer-Encoding: chunked < < response_payload.gz Response Body(in GZIP format)>
Spécification
Apigee Edge répond avec le code d'état 502 Bad Gateway et le code d'erreur messaging.adaptors.http.flow.DecompressionFailureAtResponse, conformément aux spécifications RFC suivantes :
| Spécification |
|---|
| RFC 7231, section 6.5.1 |
| RFC 7231, section 3.1.2.2 |
Si vous avez encore besoin d'aide de l'assistance Apigee, consultez la page Vous devez collecter des informations de diagnostic.
Vous devez collecter des informations de diagnostic
Rassemblez les informations de diagnostic suivantes, puis contactez l'assistance Apigee Edge :
Si vous êtes un utilisateur du cloud public, fournissez les informations suivantes :
- Nom de l'organisation
- Nom de l'environnement
- Nom du proxy d'API
- Commande
curlcomplète utilisée pour reproduire l'erreur502 - Fichier de trace pour les réponses de l'API
Si vous êtes un utilisateur du cloud privé, fournissez les informations suivantes :
- Message d'erreur complet observé pour les réponses ayant échoué
- Nom de l'environnement
- Bundle de proxy d'API
- Fichier de trace pour les réponses de l'API
Journaux d'accès NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logOù : ORG, ENV et PORT# sont remplacés par des valeurs réelles.
- Journaux système du processeur de messages
/opt/apigee/var/log/edge-message-processor/logs/system.log