आपको Apigee Edge का दस्तावेज़ दिख रहा है.
Apigee X के दस्तावेज़ पर जाएं. जानकारी
समस्या का ब्यौरा
क्लाइंट ऐप्लिकेशन को एपीआई कॉल के जवाब के तौर पर, गड़बड़ी कोड messaging.adaptors.http.flow.DecompressionFailureAtRequest के साथ 400 Bad Request एचटीटीपी स्टेटस कोड मिलता है.
गड़बड़ी का मैसेज
क्लाइंट ऐप्लिकेशन को यह रिस्पॉन्स कोड मिलता है:
HTTP/1.1 400 Bad Request
इसके अलावा, आपको यहां दिखाए गए मैसेज जैसा गड़बड़ी का कोई मैसेज भी दिख सकता है:
{
"fault":{
"faultstring":"Decompression failure at request",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"
}
}
}संभावित कारण
यह गड़बड़ी सिर्फ़ तब होती है, जब:
- एचटीटीपी अनुरोध हेडर
Content-Encodingमें दी गई एन्कोडिंग मान्य है और Apigee Edge के साथ काम करती है, - क्लाइंट ने एचटीटीपी अनुरोध के हिस्से के तौर पर जो पेलोड फ़ॉर्मैट भेजा है वह
Content-Encodingहेडर में दिए गए एन्कोडिंग फ़ॉर्मैट से मेल नहीं खाता
BUT
ऐसा इसलिए होता है, क्योंकि Apigee Edge, पेलोड को डिकोड नहीं कर पाता. इसकी वजह यह है कि पेलोड का फ़ॉर्मैट, Content-Encoding हेडर में दिए गए एन्कोडिंग फ़ॉर्मैट से मेल नहीं खाता.
यहां, इस्तेमाल की जा सकने वाली Content-Encoding वैल्यू के कुछ उदाहरण दिए गए हैं. साथ ही, यह बताया गया है कि Apigee Edge इन मामलों में पेलोड फ़ॉर्मैट कैसा होना चाहिए:
| स्थिति | Content-Encoding | पेलोड का अनुमानित फ़ॉर्मैट |
|---|---|---|
| सिंगल एन्कोडिंग | gzip | यूनिक्स RFC1952 GZIP फ़ॉर्मैट देखें. |
| सिंगल एन्कोडिंग | डिफ़्लेट | इस फ़ॉर्मैट में, डिफ़्लेट कंप्रेशन एल्गोरिदम के साथ |
| एक से ज़्यादा बार एन्कोड करना | एक से ज़्यादा बार एन्कोड करना उदाहरण के लिए, जब एन्कोडिंग दो बार की जाती है, तो यह इस तरह से हो सकती है:
|
हेडर में दिए गए क्रम के मुताबिक, पेलोड पर एक से ज़्यादा एन्कोडिंग लागू की गई हैं. |
इस गड़बड़ी की ये वजहें हो सकती हैं:
| वजह | ब्यौरा | इनके लिए समस्या हल करने के निर्देश |
|---|---|---|
| अनुरोध पेलोड का फ़ॉर्मैट, Content-Encoding हेडर में बताई गई एन्कोडिंग से मेल नहीं खाता | क्लाइंट से भेजे गए अनुरोध के पेलोड का फ़ॉर्मैट, Content-Encoding हेडर में बताई गई एन्कोडिंग से मैच नहीं करता या उसे एन्कोड नहीं किया गया है. |
Edge Public और Private Cloud के उपयोगकर्ताओं के लिए |
गड़बड़ी का पता लगाने के सामान्य चरण
इस गड़बड़ी का पता लगाने के लिए, इनमें से किसी टूल/तकनीक का इस्तेमाल करें:
एपीआई मॉनिटरिंग
एपीआई मॉनिटरिंग का इस्तेमाल करके गड़बड़ी का पता लगाने के लिए:
- Apigee Edge के यूज़र इंटरफ़ेस (यूआई) में साइन इन करें. इसके लिए, आपके पास सही भूमिका होनी चाहिए.
उस संगठन पर स्विच करें जिसमें आपको समस्या की जांच करनी है.
- विश्लेषण करें > एपीआई मॉनिटरिंग > जांच करें पेज पर जाएं.
- वह समयावधि चुनें जिसमें आपको गड़बड़ियां दिखीं.
- पक्का करें कि प्रॉक्सी फ़िल्टर, सभी पर सेट हो.
- समय के हिसाब से गड़बड़ी का कोड प्लॉट करें.
वह सेल चुनें जिसमें गड़बड़ी का कोड
messaging.adaptors.http.flow.DecompressionFailureAtRequestमौजूद है. यह कोड नीचे दिखाया गया है:
गड़बड़ी के कोड के बारे में जानकारी
messaging.adaptors.http.flow.DecompressionFailureAtRequestनीचे दी गई इमेज में दिखाई गई है:
लॉग देखें पर क्लिक करें और
400गड़बड़ी वाली लाइन को बड़ा करें.
- लॉग विंडो में, यह जानकारी नोट करें:
- स्टेटस कोड:
400 - गड़बड़ी का सोर्स:
proxy - गड़बड़ी का कोड:
messaging.adaptors.http.flow.DecompressionFailureAtRequest.
- स्टेटस कोड:
- अगर Fault Source की वैल्यू
proxyहै, तो इसका मतलब है कि अनुरोध के पेलोड का फ़ॉर्मैट,Content-Encodingहेडर में बताई गई सपोर्ट की गई एन्कोडिंग से मेल नहीं खाता.
ट्रेस टूल
ट्रेस टूल का इस्तेमाल करके गड़बड़ी का पता लगाने के लिए:
- ट्रेस सेशन चालू करें
और इनमें से कोई एक विकल्प चुनें:
400 Bad Requestगड़बड़ी होने का इंतज़ार करें या- अगर आपको समस्या का पता चल गया है, तो एपीआई कॉल करें और
400 Bad Requestको फिर से जनरेट करें.
पक्का करें कि Show all FlowInfos चालू हो:
- पूरे न हो पाने वाले किसी अनुरोध को चुनें और उसके ट्रेस की जांच करें.
- ट्रेस के अलग-अलग फ़ेज़ पर जाएं और पता लगाएं कि गड़बड़ी कहां हुई.
आपको आम तौर पर, गड़बड़ी क्लाइंट से अनुरोध मिला चरण के ठीक बाद वाले फ़्लो में दिखेगी. जैसा कि यहां दिखाया गया है:
-
ट्रेस से प्रॉपर्टी की वैल्यू नोट करें:
- गड़बड़ी:
Decompression failure at request - error.class:
com.apigee.rest.framework.BadRequestException - error.cause:
Not in GZIP format
error.cause से पता चलता है कि अनुरोध का पेलोड, GZIP फ़ॉर्मैट में नहीं है. इसका मतलब है कि Apigee Edge को उम्मीद थी कि अनुरोध का पेलोड GZIP फ़ॉर्मैट में होगा, क्योंकि इसे
Content-Encodingहेडर में बताया गया था. - गड़बड़ी:
अनुरोध हेडर
Content-Encodingकी वैल्यू तय करें. इसके लिए, नीचे दिए गए तरीके से क्लाइंट से अनुरोध मिला फ़ेज़ पर जाएं:
ध्यान दें कि अनुरोध के हेडर
Content-Encodingकी वैल्यूgzipहै.ऊपर दिए गए सैंपल ट्रेस से पता चलता है कि अनुरोध का हेडर
Content-Encodingमें दी गई एन्कोडिंगgzipहै. हालांकि, अनुरोध पेलोड GZIP फ़ॉर्मैट में नहीं है. इसलिए, Apigee gzip का इस्तेमाल करके पेलोड को डीकंप्रेस नहीं कर सकता और गड़बड़ीDecompression failure at requestदिखाता है.- Apigee Edge से मिले स्टेटस कोड और गड़बड़ी के मैसेज को नोट करें. इसके लिए,
नीचे दिए गए उदाहरण में दिखाए गए तरीके से, ट्रेस में Response Sent to Client फ़ेज़ पर जाएं:
ट्रेस से यह जानकारी नोट करें:
- स्टेटस कोड:
400 Bad Request. - गड़बड़ी वाला कॉन्टेंट:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- स्टेटस कोड:
ट्रेस में AX (Analytics Data Recorded) फ़ेज़ पर जाएं और उस पर क्लिक करें.
- नीचे की ओर स्क्रोल करके, फ़ेज़ की जानकारी और गड़बड़ी वाले हेडर सेक्शन पर जाएं. इसके बाद, नीचे दिए गए तरीके से X-Apigee-fault-code और X-Apigee-fault-source की वैल्यू तय करें:
- आपको X-Apigee-fault-code और X-Apigee-fault-source की वैल्यू
messaging.adaptors.http.flow.DecompressionFailureAtRequestऔरpolicyके तौर पर दिखेंगी. इससे पता चलता है कि अनुरोध के पेलोड का फ़ॉर्मैट,Content-Encodingहेडर में बताई गई एन्कोडिंग से मेल नहीं खाता.रिस्पॉन्स हेडर वैल्यू X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
NGINX
NGINX ऐक्सेस लॉग का इस्तेमाल करके गड़बड़ी का पता लगाने के लिए:
- अगर आप Private Cloud के उपयोगकर्ता हैं, तो NGINX ऐक्सेस लॉग का इस्तेमाल करके, एचटीटीपी
400गड़बड़ियों के बारे में अहम जानकारी पाई जा सकती है. NGINX के ऐक्सेस लॉग देखें:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logयहां: ORG, ENV, और PORT# को असल वैल्यू से बदलें.
- खोजें कि क्या किसी खास समयावधि के दौरान
400गड़बड़ियां हुई हैं (अगर समस्या पहले हुई थी) या क्या अब भी400गड़बड़ियों की वजह से अनुरोध पूरे नहीं हो रहे हैं. अगर आपको
400से जुड़ी कोई गड़बड़ी मिलती है और X-Apigee-fault-code की वैल्यूmessaging.adaptors.http.flow.DecompressionFailureAtRequestसे मेल खाती है, तो X-Apigee-fault-source की वैल्यू का पता लगाएं.NGINX के ऐक्सेस लॉग में मौजूद, 400 गड़बड़ी का उदाहरण:
NGINX ऐक्सेस लॉग की ऊपर दी गई सैंपल एंट्री में, X-Apigee-fault-code और X-Apigee-fault-source के लिए ये वैल्यू दी गई हैं:
रिस्पॉन्स हेडर वैल्यू X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
वजह: अनुरोध के पेलोड का फ़ॉर्मैट, Content-Encoding हेडर में दिए गए एन्कोडिंग से मेल नहीं खाता
डिफ़ॉल्ट रूप से, Apigee Edge हमेशा पेलोड को तब डिकंप्रेस करता है, जब अनुरोध का हेडर में Content-Encoding मान्य और
सपोर्ट की गई एन्कोडिंग शामिल हो. इसलिए, यह ज़रूरी है कि अनुरोध के पेलोड का फ़ॉर्मैट, अनुरोध के हेडर Content-Encoding में बताई गई एन्कोडिंग से मेल खाना चाहिए.
अगर जानकारी मेल नहीं खाती है, तो आपको यह गड़बड़ी दिखेगी.
संक्रमण की जांच
- एपीआई मॉनिटरिंग, ट्रेस टूल या NGINX ऐक्सेस लॉग का इस्तेमाल करके, देखी गई गड़बड़ी के लिए गड़बड़ी कोड और गड़बड़ी का सोर्स पता करें. इसके बारे में गड़बड़ी का पता लगाने के सामान्य तरीके में बताया गया है.
- अगर गड़बड़ी का कोड
messaging.adaptors.http.flow.DecompressionFailureAtRequestहै और गड़बड़ी का सोर्सpolicyयाproxyहै, तो इसका मतलब है कि क्लाइंट ऐप्लिकेशन से भेजे गए अनुरोध में ऐसा पेलोड है जो अनुरोध हेडरContent-Encodingमें बताई गई सपोर्ट की गई एन्कोडिंग से मेल नहीं खाता. एचटीटीपी अनुरोध के हिस्से के तौर पर, इनमें से किसी एक तरीके का इस्तेमाल करके, बेमेल होने की जानकारी दी जा सकती है:
गड़बड़ी का मैसेज
गड़बड़ी के मैसेज का इस्तेमाल करके पुष्टि करने के लिए:
-
अगर आपके पास Apigee Edge से मिला पूरा गड़बड़ी का मैसेज है, तो
faultstringदेखें.गड़बड़ी के मैसेज का उदाहरण:
"faultstring":"Decompression failure at request"
- ऊपर दिए गए गड़बड़ी के मैसेज में,
"Decompression failure at request"दिखता है. इसका मतलब है कि अनुरोध कोContent-Encodingहेडर में दी गई एन्कोडिंग का इस्तेमाल करके डीकंप्रेस नहीं किया जा सका.
ट्रेस
ट्रेस का इस्तेमाल करके पुष्टि करने के लिए:
- समस्या का पता लगाने के सामान्य तरीके में बताए गए तरीके के मुताबिक, Trace का इस्तेमाल करके, अनुरोध हेडर Content-Encoding और प्रॉपर्टी error.cause की वैल्यू का पता लगाएं.
सैंपल ट्रेस से मिली वैल्यू यहां दी गई हैं:
- Content-Encoding:
gzip - error.cause:
Not in GZIP format
अनुरोध के हेडर में Content-Encoding की वैल्यू gzip है. हालांकि, अनुरोध पेलोड GZIP फ़ॉर्मैट में नहीं है. इसकी जानकारी error.cause से मिलती है. इसलिए, Apigee Edge
400 Bad Requestऔर गड़बड़ी कोडmessaging.adaptors.http.flow.DecompressionFailureAtRequestके साथ जवाब देता है.- Content-Encoding:
असल अनुरोध
असली अनुरोध का इस्तेमाल करके पुष्टि करने के लिए:
अगर आपके पास क्लाइंट ऐप्लिकेशन से किए गए असली अनुरोध का ऐक्सेस है, तो यह तरीका अपनाएं:
- अनुरोध हेडर
Content-Encodingको पास की गई वैल्यू का पता लगाएं. - अनुरोध के हिस्से के तौर पर भेजे गए पेलोड का फ़ॉर्मैट तय करें.
अगर
Content-Encodingहेडर की वैल्यू, सपोर्ट की गई एन्कोडिंग की सूची में शामिल है, लेकिन अनुरोध पेलोड का फ़ॉर्मैट,Content-Encodingहेडर में बताई गई एन्कोडिंग से मेल नहीं खाता है, तो इसकी वजह से समस्या आ सकती है.अनुरोध का उदाहरण:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"-X POST -d @request_payload.zipऊपर दिए गए सैंपल अनुरोध में,
gzipवैल्यू कोContent-Encodingहेडर में भेजा जाता है. यह Apigee Edge में इस्तेमाल की जा सकने वाली एन्कोडिंग है. हालांकि, अनुरोध का पेलोडrequest_payload.zipZIP फ़ॉर्मैट में है. इसलिए, यह अनुरोध पूरा नहीं किया जा सका. इसका स्टेटस कोड400 Bad Requestहै और गड़बड़ी का कोडmessaging.adaptors.http.flow.DecompressionFailureAtRequestहै.
मैसेज प्रोसेसर के लॉग
मैसेज प्रोसेसर के लॉग का इस्तेमाल करके पुष्टि करने के लिए:
अगर आप Private Cloud के उपयोगकर्ता हैं, तो एचटीटीपी
400गड़बड़ियों के बारे में अहम जानकारी पाने के लिए, Message Processor के लॉग का इस्तेमाल किया जा सकता है.- एपीआई मॉनिटरिंग, ट्रेस टूल या NGINX ऐक्सेस लॉग का इस्तेमाल करके, अनुरोध के पूरे न होने की वजह बताने वाले मैसेज आईडी का पता लगाएं. इसके बारे में गड़बड़ी का पता लगाने के सामान्य तरीके में बताया गया है.
मैसेज प्रोसेसर के लॉग में मैसेज आईडी खोजें:
/opt/apigee/var/log/edge-message-processor/logs/system.logआपको इनमें से कोई एक अपवाद दिखेगा:
पहली स्थिति
पहली स्थिति: जब एपीआई अनुरोध में हेडर Content-Encoding: gzip मौजूद हो
2021-07-28 10:21:16,861 NIOThread@0 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-57-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739893ms lastIO=0ms isOpen=true.onExceptionRead exception: {} java.util.zip.ZipException: Not in GZIP format 2021-07-28 10:21:16,862 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rt-57-1, exception:java.util.zip.ZipException: Not in GZIP format, context:Context@71ea5ac input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739894ms lastIO=0ms isOpen=true) 2021-07-28 10:21:16,862 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exceptionjava.util.zip.ZipException: Not in GZIP formatoccurred while writing to channel null 2021-07-28 10:21:16,863 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: Not in GZIP formatऊपर दिए गए गड़बड़ी के मैसेज में मौजूद लाइन
java.util.zip.ZipException: Not in GZIP formatसे पता चलता है कि अनुरोध का पेलोड GZIP फ़ॉर्मैट में नहीं भेजा गया है. हालांकि,Content-Encodingको gzip के तौर पर तय किया गया है. इसलिए, Apigee Edge एक अपवाद दिखाता है. साथ ही, क्लाइंट ऐप्लिकेशन को400स्टेटस कोड और गड़बड़ी कोडmessaging.adaptors.http.flow.DecompressionFailureAtRequestदिखाता है.Scenario #2
दूसरी स्थिति: जब एपीआई अनुरोध में Content-Encoding: deflate हेडर मौजूद हो
2021-07-28 15:26:31,893 NIOThread@1 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-47875-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 bytesRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true.onExceptionRead exception: {}java.util.zip.ZipException: incorrect header check….Caused by: java.util.zip.DataFormatException: incorrect header check.. 2021-07-28 15:26:31,894 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rrt-47875-1, exception:java.util.zip.ZipException: incorrect header check, context:Context@69b3ac45 input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 byt esRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true)ऊपर दिए गए गड़बड़ी के मैसेज में मौजूद लाइनों
java.util.zip.ZipException: incorrect header checkऔरCaused by: java.util.zip.DataFormatException: incorrect header checkसे पता चलता है कि अनुरोध के पेलोड को डिफ़्लेट फ़ॉर्मैट में नहीं भेजा गया है. साथ ही, यह डिफ़्लेट केContent-Encodingहेडर में बताई गई एन्कोडिंग से मेल नहीं खाता. इसलिए, Apigee Edge, क्लाइंट ऐप्लिकेशन को अपवाद दिखाता है. साथ ही, गड़बड़ी कोडmessaging.adaptors.http.flow.DecompressionFailureAtRequestके साथ400स्टेटस कोड दिखाता है.
-
रिज़ॉल्यूशन
- अगर Apigee Edge
में एपीआई प्रॉक्सी फ़्लो और बैकएंड सर्वर में कंप्रेस किए गए अनुरोध पेलोड की ज़रूरत नहीं है, तो हेडर
Content-Encodingपास न करें. अगर अनुरोध के पेलोड को कंप्रेस करने की ज़रूरत है, तो दूसरे चरण पर जाएं. - पक्का करें कि क्लाइंट ऐप्लिकेशन हमेशा यह जानकारी भेजे:
- अनुरोध में
Content-Encodingहेडर की वैल्यू के तौर पर, सपोर्ट की गई कोई भी एन्कोडिंग - Apigee Edge को भेजे गए अनुरोध का पेलोड,
Content-Encodingहेडर में बताए गए फ़ॉर्मैट के मुताबिक है
- अनुरोध में
- ऊपर दिए गए उदाहरण में, अनुरोध का पेलोड ZIP फ़ॉर्मैट में है, लेकिन अनुरोध के हेडर में
Content-Encoding: gzipबताया गया है. अनुरोध हेडर कोContent-Encoding: gzipके तौर पर और अनुरोध पेलोड को भीgzipफ़ॉर्मैट में भेजकर, समस्या को ठीक किया जा सकता है:curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
खास जानकारी
Apigee Edge, 400 Bad Request स्टेटस कोड के साथ जवाब देता है. इसमें गड़बड़ी का कोड messaging.adaptors.http.flow.DecompressionFailureAtRequest होता है. यह जवाब, आरएफ़सी की इन खास बातों के मुताबिक होता है:
| खास जानकारी |
|---|
| RFC 7231, सेक्शन 6.5.1 |
| RFC 7231, सेक्शन 3.1.2.2 |
अगर आपको अब भी Apigee की सहायता टीम से मदद चाहिए, तो गड़बड़ी की जानकारी इकट्ठा करना ज़रूरी है पर जाएं.
डाइग्नोस्टिक जानकारी इकट्ठा करना ज़रूरी है
गड़बड़ी की यह जानकारी इकट्ठा करें. इसके बाद, Apigee Edge की सहायता टीम से संपर्क करें:
अगर आप पब्लिक क्लाउड के उपयोगकर्ता हैं, तो यह जानकारी दें:
- संगठन का नाम
- परिवेश का नाम
- एपीआई प्रॉक्सी का नाम
400गड़बड़ी को फिर से बनाने के लिए इस्तेमाल की गईcurlकमांड- एपीआई अनुरोधों के लिए ट्रेस फ़ाइल
अगर आप Private Cloud के उपयोगकर्ता हैं, तो यह जानकारी दें:
- अनुरोध पूरे न होने पर, गड़बड़ी का पूरा मैसेज दिखता है
- परिवेश का नाम
- एपीआई प्रॉक्सी बंडल
- एपीआई अनुरोधों के लिए ट्रेस फ़ाइल
NGINX ऐक्सेस लॉग
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logयहां: ORG, ENV, और PORT# को असल वैल्यू से बदल दिया जाता है.
- मैसेज प्रोसेसर के सिस्टम लॉग
/opt/apigee/var/log/edge-message-processor/logs/system.log