400 Bad Request - DecompressionFailureAtRequest

شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید .
اطلاعات

علامت

برنامه‌ی کلاینت، کد وضعیت HTTP با مقدار 400 Bad Request و کد خطای messaging.adaptors.http.flow.DecompressionFailureAtRequest را به عنوان پاسخی به فراخوانی‌های API دریافت می‌کند.

پیام خطا

برنامه‌ی کلاینت کد پاسخ زیر را دریافت می‌کند:

HTTP/1.1 400 Bad Request

علاوه بر این، ممکن است پیام خطایی مشابه آنچه در زیر نشان داده شده است را مشاهده کنید:

{
   "fault":{
      "faultstring":"Decompression failure at request",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"
      }
   }
}

علل احتمالی

این خطا فقط در صورتی رخ می‌دهد که:

  • کدگذاری مشخص شده در سربرگ درخواست HTTP، Content-Encoding معتبر است و توسط Apigee Edge پشتیبانی می‌شود .
  • اما

  • قالب بار داده ارسالی توسط کلاینت به عنوان بخشی از درخواست HTTP با قالب کدگذاری مشخص شده در سربرگ Content-Encoding مطابقت ندارد.

دلیل این امر آن است که Apigee Edge نمی‌تواند payload را با استفاده از کدگذاری مشخص‌شده رمزگشایی کند، زیرا فرمت payload با کدگذاری مشخص‌شده در سربرگ Content-Encoding یکسان نیست.

در اینجا چند نمونه از مقادیر پشتیبانی‌شده‌ی Content-Encoding و نحوه‌ی انتظار Apigee Edge از فرمت payload در این موارد آورده شده است:

سناریو کدگذاری محتوا قالب بار مفید مورد انتظار
رمزگذاری تکی gzip

فرمت gzip یونیکس.

به فرمت GZIP در RFC1952 مراجعه کنید.

رمزگذاری تکی باد کردن

این فرمت از ساختار zlib با الگوریتم فشرده‌سازی deflate استفاده می‌کند.

به RFC1950 و RFC1951 مراجعه کنید .

رمزگذاری چندگانه

رمزگذاری چندگانه

برای مثال، در مواردی که کدگذاری دو بار انجام می‌شود، می‌تواند به صورت زیر باشد:

  • gzip، کاهش حجم
  • جی‌زیپ، جی‌زیپ
  • باد کردن، gzip
  • باد کردن، خالی کردن از باد
کدگذاری چندگانه به ترتیبی که در هدر نشان داده شده است، روی محموله اعمال می‌شود.

علل احتمالی این خطا به شرح زیر است:

علت توضیحات دستورالعمل‌های عیب‌یابی قابل اجرا برای
فرمت بار درخواست با کدگذاری مشخص شده در سربرگ Content-Encoding مطابقت ندارد. قالب درخواست ارسالی توسط کلاینت یا کدگذاری نشده است یا با کدگذاری مشخص شده در سربرگ Content-Encoding مطابقت ندارد. کاربران فضای ابری عمومی و خصوصی Edge

مراحل تشخیص مشترک

برای تشخیص این خطا از یکی از ابزارها/تکنیک‌های زیر استفاده کنید:

نظارت بر API

برای تشخیص خطا با استفاده از مانیتورینگ API:

  1. به عنوان کاربری با نقش کاربری مناسب، وارد Apigee Edge UI شوید .
  2. به سازمانی که می‌خواهید مشکل را در آن بررسی کنید، مراجعه کنید.

  3. به صفحه Analyze > API Monitoring > Investigate بروید.
  4. بازه زمانی خاصی را که در آن خطاها را مشاهده کرده‌اید، انتخاب کنید.
  5. مطمئن شوید که فیلتر پروکسی روی «همه» تنظیم شده است.
  6. رسم کد خطا در مقابل زمان .
  7. سلولی را انتخاب کنید که کد خطای messaging.adaptors.http.flow.DecompressionFailureAtRequest در آن قرار دارد، همانطور که در زیر نشان داده شده است:

    ( تصویر را بزرگتر ببینید )

  8. اطلاعات مربوط به کد خطا messaging.adaptors.http.flow.DecompressionFailureAtRequest مطابق شکل زیر نمایش داده می‌شود:

    ( تصویر را بزرگتر ببینید )

  9. روی «مشاهده گزارش‌ها» کلیک کنید و ردیفی را که با خطای 400 مواجه شده است، باز کنید.

    ( تصویر را بزرگتر ببینید )

  10. از پنجره Logs ، جزئیات زیر را یادداشت کنید:
    • کد وضعیت: 400
    • منبع خطا: proxy
    • کد خطا: messaging.adaptors.http.flow.DecompressionFailureAtRequest .
  11. اگر منبع خطا مقدار proxy داشته باشد، نشان می‌دهد که فرمت بار داده درخواست با کدگذاری پشتیبانی‌شده مشخص‌شده در سرآیند Content-Encoding مطابقت ندارد.

ابزار ردیابی

برای تشخیص خطا با استفاده از ابزار Trace:

  1. جلسه ردیابی را فعال کنید و یکی از موارد زیر را انجام دهید:
    1. منتظر بمانید تا خطای 400 Bad Request رخ دهد، یا
    2. اگر می‌توانید مشکل را دوباره ایجاد کنید، فراخوانی API را انجام دهید و خطای 400 Bad Request دوباره ایجاد کنید.
  2. مطمئن شوید که گزینه‌ی Show all FlowInfos فعال است:

  3. یکی از درخواست‌های ناموفق را انتخاب کنید و مسیر پیگیری را بررسی کنید.
  4. مراحل مختلف ردیابی را طی کنید و محل وقوع خرابی را پیدا کنید.
  5. معمولاً خطا را در جریانی درست پس از مرحله درخواست دریافت شده از کلاینت، مطابق شکل زیر، مشاهده خواهید کرد:

    ( تصویر را بزرگتر ببینید )

  6. به مقادیر ویژگی‌ها از مسیر ردیابی توجه کنید:

    • خطا: Decompression failure at request
    • کلاس خطا : com.apigee.rest.framework.BadRequestException
    • error.cause: Not in GZIP format

    error.cause بیان می‌کند که فایل درخواست با فرمت GZIP نیست. این بدان معناست که Apigee Edge انتظار داشته که فایل درخواست با فرمت GZIP باشد، همانطور که در هدر Content-Encoding مشخص شده است.

  7. مقدار هدر درخواست Content-Encoding را تعیین کنید. برای این کار، مطابق شکل زیر به مرحله درخواست دریافت شده از کلاینت بروید:

    ( تصویر را بزرگتر ببینید )

    توجه داشته باشید که مقدار هدر درخواست Content-Encoding در واقع gzip است.

    ردیابی نمونه بالا نشان می‌دهد که کدگذاری مشخص شده در هدر درخواست Content-Encoding ، gzip است؛ با این حال، فایل درخواست در قالب GZIP نیست. بنابراین، Apigee نمی‌تواند فایل را با استفاده از gzip از حالت فشرده خارج کند و خطای Decompression failure at request را برمی‌گرداند.

  8. با پیمایش به کد وضعیت و پیام خطایی که توسط Apigee Edge برگردانده می‌شود، توجه کنید.

    به مرحله پاسخ ارسال شده به کلاینت در ردیابی، همانطور که در زیر نشان داده شده است:

    ( تصویر را بزرگتر ببینید )

    به جزئیات زیر از ردیابی توجه کنید:

    • کد وضعیت: 400 Bad Request .
    • محتوای خطا: {"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
  9. در مسیر ردیابی، به مرحله AX (داده‌های تحلیلی ثبت‌شده) بروید و روی آن کلیک کنید.

  10. به پایین صفحه و بخش Phase Details و Error Headers بروید و مقادیر X-Apigee-fault-code و X-Apigee-fault-source را مطابق شکل زیر تعیین کنید:

    ( تصویر را بزرگتر ببینید )

  11. مقادیر X-Apigee-fault-code و X-Apigee-fault-source را به صورت messaging.adaptors.http.flow.DecompressionFailureAtRequest و policy مشاهده خواهید کرد که نشان می‌دهد فرمت بار داده درخواست با کدگذاری مشخص شده در سربرگ Content-Encoding مطابقت ندارد.
    هدرهای پاسخ ارزش
    کد خطای X-Apigee messaging.adaptors.http.flow.DecompressionFailureAtRequest
    منبع گسل X-Apigee policy

انجینکس

برای تشخیص خطا با استفاده از گزارش‌های دسترسی NGINX:

  1. اگر شما یک کاربر Private Cloud هستید، می‌توانید از گزارش‌های دسترسی NGINX برای تعیین اطلاعات کلیدی در مورد خطاهای HTTP 400 استفاده کنید.
  2. گزارش‌های دسترسی NGINX را بررسی کنید:

    /opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log

    که در آن: ORG ، ENV و PORT# با مقادیر واقعی جایگزین شده‌اند.

  3. جستجو کنید تا ببینید آیا در یک بازه زمانی خاص (اگر مشکل در گذشته رخ داده است) خطای 400 وجود دارد یا خیر، یا اینکه آیا درخواست‌هایی با 400 همچنان با شکست مواجه می‌شوند یا خیر.
  4. اگر هرگونه خطای 400 با کد خطای X-Apigee-fault-code که با مقدار messaging.adaptors.http.flow.DecompressionFailureAtRequest مطابقت دارد، پیدا کردید، مقدار منبع خطای X-Apigee-fault را تعیین کنید.

    نمونه خطای ۴۰۰ از لاگ دسترسی NGINX:

    ورودی نمونه بالا از لاگ دسترسی NGINX دارای مقادیر زیر برای X-Apigee-fault-code و X-Apigee-fault-source است:

    هدرهای پاسخ ارزش
    کد خطای X-Apigee messaging.adaptors.http.flow.DecompressionFailureAtRequest
    منبع گسل X-Apigee policy

علت: فرمت بار درخواست با کدگذاری مشخص شده در هدر Content-Encoding مطابقت ندارد.

به طور پیش‌فرض، Apigee Edge همیشه در صورتی که هدر درخواست Content-Encoding حاوی یک کدگذاری معتبر و پشتیبانی‌شده باشد، payload را از حالت فشرده خارج می‌کند. بنابراین، انتظار می‌رود که قالب payload درخواست با کدگذاری مشخص‌شده در Content-Encoding هدر درخواست مطابقت داشته باشد . اگر عدم تطابق وجود داشته باشد، این خطا را دریافت می‌کنید.

تشخیص

  1. کد خطا و منبع خطا را برای خطای مشاهده شده با استفاده از API Monitoring، ابزار Trace یا گزارش‌های دسترسی NGINX، همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید.
  2. اگر کد خطا messaging.adaptors.http.flow.DecompressionFailureAtRequest باشد و منبع خطا دارای مقدار policy یا proxy باشد، این نشان می‌دهد که درخواست ارسال شده توسط برنامه کلاینت دارای payload است که با کدگذاری پشتیبانی شده مشخص شده در هدر درخواست Content-Encoding مطابقت ندارد.
  3. شما می‌توانید عدم تطابق را به عنوان بخشی از درخواست HTTP با استفاده از یکی از روش‌های زیر تعیین کنید:

    پیام خطا

    برای اعتبارسنجی با استفاده از پیام خطا:

    1. اگر به پیام خطای کامل دریافتی از Apigee Edge دسترسی دارید، به faultstring مراجعه کنید.

      نمونه پیام خطا:

      "faultstring":"Decompression failure at request"
    2. در پیام خطای بالا، عبارت "Decompression failure at request" نمایش داده می‌شود که نشان می‌دهد درخواست با استفاده از کدگذاری مشخص شده در سربرگ Content-Encoding قابل decompress شدن نیست.

    ردیابی

    برای اعتبارسنجی با استفاده از Trace:

    1. مقدار هدر درخواست Content-Encoding و ویژگی error.cause را با استفاده از Trace همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید.
    2. مقادیر حاصل از ردیابی نمونه به شرح زیر است:

      • رمزگذاری محتوا: gzip
      • error.cause: Not in GZIP format

      مقدار موجود در هدر درخواست Content-Encoding برابر با gzip است؛ با این حال، فایل درخواست در قالب GZIP نیست (همانطور که با error.cause نشان داده شده است). بنابراین، Apigee Edge با 400 Bad Request و کد خطای messaging.adaptors.http.flow.DecompressionFailureAtRequest پاسخ می‌دهد.

    درخواست واقعی

    برای اعتبارسنجی با استفاده از درخواست واقعی:

    اگر به درخواست واقعی ارسال شده توسط برنامه کلاینت دسترسی دارید، مراحل زیر را انجام دهید:

    1. مقدار ارسالی به هدر درخواست Content-Encoding را تعیین کنید.
    2. قالب بار داده ارسالی به عنوان بخشی از درخواست را تعیین کنید.
    3. اگر مقدار هدر 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.zip در قالب ZIP است. بنابراین، این درخواست با کد وضعیت 400 Bad Request و کد خطای messaging.adaptors.http.flow.DecompressionFailureAtRequest با شکست مواجه می‌شود.

    گزارش‌های پردازنده پیام

    برای اعتبارسنجی با استفاده از گزارش‌های پردازشگر پیام:

    اگر شما یک کاربر ابر خصوصی هستید، می‌توانید از گزارش‌های پردازشگر پیام برای تعیین اطلاعات کلیدی در مورد خطاهای HTTP 400 استفاده کنید.

    1. شناسه پیام درخواست ناموفق را با استفاده از API Monitoring، ابزار Trace یا گزارش‌های دسترسی NGINX، همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید.
    2. شناسه پیام را در گزارش پردازشگر پیام جستجو کنید:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. یکی از استثنائات زیر را مشاهده خواهید کرد:

      سناریوی شماره ۱

      سناریوی شماره ۱: وقتی درخواست API دارای هدر 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() :
      Exception java.util.zip.ZipException: Not in GZIP format occurred 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 به برنامه‌های کلاینت برمی‌گرداند.

      سناریوی شماره ۲

      سناریوی شماره ۲: وقتی درخواست API دارای هدر 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 در پیام خطای بالا نشان می‌دهند که payload درخواست با فرمت deflate ارسال نشده و با کدگذاری مشخص شده در هدر Content-Encoding مربوط به deflate مطابقت ندارد. بنابراین، Apigee Edge این استثنا را ایجاد می‌کند و کد وضعیت 400 با کد خطای messaging.adaptors.http.flow.DecompressionFailureAtRequest به برنامه‌های کلاینت برمی‌گرداند.

وضوح تصویر

  1. اگر در جریان پروکسی API در Apigee Edge و در سرور backend نیازی به فشرده‌سازی payload درخواست نیست، هدر Content-Encoding را ارسال نکنید . اگر نیاز به فشرده‌سازی payload درخواست است، به مرحله ۲ بروید.
  2. مطمئن شوید که برنامه کلاینت همیشه موارد زیر را ارسال می‌کند:
    • هر یک از کدگذاری‌های پشتیبانی‌شده به عنوان مقدار هدر Content-Encoding در درخواست
    • بار داده درخواست در قالب پشتیبانی‌شده توسط Apigee Edge با قالب کدگذاری مشخص‌شده در سربرگ Content-Encoding مطابقت دارد.
  3. در مثالی که در بالا مورد بحث قرار گرفت، فایل درخواست (payload) با فرمت 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 زیر پاسخ می‌دهد:

مشخصات
RFC 7231، بخش 6.5.1
RFC 7231، بخش 3.1.2.2

اگر هنوز به هرگونه کمکی از پشتیبانی Apigee نیاز دارید، به بخش «باید اطلاعات تشخیصی را جمع‌آوری کنید» بروید.

باید اطلاعات تشخیصی جمع‌آوری کند

اطلاعات تشخیصی زیر را جمع‌آوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید:

اگر کاربر فضای ابری عمومی هستید، اطلاعات زیر را ارائه دهید:

  • نام سازمان
  • نام محیط
  • نام پروکسی API
  • دستور curl کامل که برای بازتولید خطای 400 استفاده می‌شود
  • فایل ردیابی برای درخواست‌های API

اگر کاربر Private Cloud هستید، اطلاعات زیر را ارائه دهید:

  • پیام خطای کامل مشاهده شده برای درخواست‌های ناموفق
  • نام محیط
  • بسته پروکسی API
  • فایل ردیابی برای درخواست‌های API
  • گزارش‌های دسترسی 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