400 - طلب غير صالح - إلغاء الضغط وفك التشفير

يتم الآن عرض مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
المعلومات

المشكلة

يحصل تطبيق العميل على رمز حالة HTTP لـ 400 Bad Request مع رمز الخطأ messaging.adaptors.http.flow.DecompressionFailureAtRequest كاستجابة لطلبات البيانات من واجهة برمجة التطبيقات.

رسالة الخطأ

يتلقى تطبيق العميل رمز الاستجابة التالي:

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 يتعذّر عليها فك ترميز الحمولة باستخدام الترميز المحدَّد لأنّ تنسيق الحمولة ليس بالتنسيق نفسه الذي يتم فيه تنسيق الترميز المحدّد في عنوان Content-Encoding.

في ما يلي بعض الأمثلة لقيم Content-Encoding المتوافقة والطريقة التي يتوقّع بها Apigee Edge تنسيق الحمولة في تلك الحالات:

السيناريو ترميز المحتوى تنسيق الحمولة المتوقع
ترميز فردي gzip

تنسيق Unix gzip

راجِع تنسيق RFC1952 GZIP.

ترميز فردي انكماش

يستخدِم هذا التنسيق بنية zlib مع خوارزمية ضغط الانكماش.

راجِع RFC1950 و RFC1951..

الترميز المتعدد

الترميز المتعدد

على سبيل المثال، في الحالات التي يتم فيها إجراء الترميز مرتين، يمكن أن يكون:

  • gzip، deflate
  • gzip وgzip
  • deflate، gzip
  • انكماش، انكماش
تم تطبيق ترميز متعدد على الحمولة بالترتيب المحدد الذي يظهر في العنوان.

الأسباب المحتملة لهذا الخطأ هي كما يلي:

السبب الوصف تعليمات تحديد المشاكل وحلّها السارية على
لا يتطابق تنسيق حمولة الطلب مع الترميز المحدّد في العنوان Content-Encoding إنّ تنسيق حمولة الطلب الذي أرسله العميل غير مرمّز أو لا يتطابق مع الترميز المحدّد في عنوان Content-Encoding. مستخدمو Edge العام والخاص على السحابة الإلكترونية

خطوات التشخيص الشائعة

استخدِم إحدى الأدوات/الأساليب التالية لتشخيص هذا الخطأ:

مراقبة واجهة برمجة التطبيقات

لتشخيص الخطأ باستخدام مراقبة واجهة برمجة التطبيقات:

  1. سجِّل الدخول إلى واجهة مستخدم Apigee Edge كمستخدم لديه دور مناسب.
  2. انتقِل إلى المؤسسة التي تريد التحقيق في المشكلة فيها.

  3. انتقل إلى صفحة تحليل > مراقبة واجهة برمجة التطبيقات > التحقيق.
  4. اختَر الإطار الزمني المحدّد الذي لاحظت فيه الأخطاء.
  5. تأكّد من ضبط فلتر الخادم الوكيل على الكل.
  6. ارسم رمز الخطأ مقابل الوقت.
  7. اختَر خلية تحتوي على رمز الخطأ messaging.adaptors.http.flow.DecompressionFailureAtRequest كما هو موضّح أدناه:

    ( عرض صورة أكبر حجمًا)

  8. يتم عرض المعلومات عن رمز الخطأ messaging.adaptors.http.flow.DecompressionFailureAtRequest كما هو موضّح أدناه:

    ( عرض صورة أكبر حجمًا)

  9. انقر على عرض السجلات ووسِّع الصف الذي يتعذّر عليه ظهور الخطأ 400.

    ( عرض صورة أكبر حجمًا)

  10. من نافذة السجلّات، دوِّن التفاصيل التالية:
    • رمز الحالة: 400
    • مصدر الخطأ: proxy
    • رمز الخطأ: messaging.adaptors.http.flow.DecompressionFailureAtRequest.
  11. إذا كانت القيمة proxy في مصدر الخطأ، هذا يشير إلى أنّ تنسيق حمولة الطلب لا يتطابق مع الترميز المتوافق المحدّد في العنوان Content-Encoding.

أداة التتبُّع

لتشخيص الخطأ باستخدام أداة التتبُّع:

  1. فعِّل جلسة التتبُّع وإمّا:
    1. انتظر حتى يحدث الخطأ 400 Bad Request، أو
    2. إذا كان بإمكانك إعادة إظهار المشكلة، عليك طلب بيانات من واجهة برمجة التطبيقات وإعادة إظهار المشكلة 400 Bad Request.
  2. تأكَّد من تفعيل Show all FlowInfos (إظهار جميع عمليات التدفق):

  3. اختَر أحد الطلبات التي تعذّر تنفيذها وافحص بيانات التتبّع.
  4. التنقّل خلال المراحل المختلفة لعملية التتبّع وتحديد مكان حدوث الخطأ.
  5. سيظهر لك الخطأ عادةً في المسار مباشرةً بعد مرحلة تم استلام الطلب من العميل كما هو موضّح أدناه:

    ( عرض صورة أكبر حجمًا)

  6. دوِّن قيم السمات من صفحة التتبّع:

    • خطأ: 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.

  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 (بيانات "إحصاءات Google" المسجّلة) في التتبُّع وانقر عليها.

  10. انتقِل للأسفل إلى قسم Stage Details (تفاصيل المرحلة) وError Headers (عناوين الخطأ) وحدِّد قيمتَي X-Apigee-Error-code وX-Apigee-fulfillment-source كما هو موضّح أدناه:

    ( عرض صورة أكبر حجمًا)

  11. ستظهر لك قيمتا X-Apigee-fault-code وX-Apigee-fault-code، على أنّه messaging.adaptors.http.flow.DecompressionFailureAtRequest وpolicy، ما يشير إلى أنّ تنسيق حمولة الطلب لم يتطابق مع الترميز المحدّد في عنوان Content-Encoding.
    عناوين الاستجابة القيمة
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
    X-Apigee-fault-source policy

NGINX

لتشخيص الخطأ باستخدام سجلات الوصول إلى NGINX:

  1. إذا كنت من مستخدمي السحابة الإلكترونية الخاصة، يمكنك استخدام سجلات وصول NGINX لتحديد المعلومات الأساسية حول أخطاء 400 في HTTP.
  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-code

    نموذج للخطأ 400 من سجلّ الوصول إلى NGINX:

    يحتوي إدخال النموذج أعلاه من سجلّ الوصول إلى NGINX على القيم التالية للسمة X-Apigee-fault-code وX-Apigee-fault-code :

    عناوين الاستجابة القيمة
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
    X-Apigee-fault-source policy

السبب: لا يتطابق تنسيق حمولة الطلب مع الترميز المحدّد في العنوان Content-Encoding

وفقًا للإعدادات التلقائية، يفكّ Apigee Edge الحمولة دائمًا إذا كان عنوان الطلب Content-Encoding يحتوي على ترميز متوافق وصالح. وبالتالي، من المتوقّع أن يتطابق تنسيق حمولة الطلب مع الترميز المحدّد في عنوان الطلب Content-Encoding. وفي حال عدم التطابق، ستحصل على هذا الخطأ.

التشخيص

  1. حدِّد رمز الخطأ ومصدر الخطأ للخطأ الذي يتم رصده باستخدام مراقبة واجهة برمجة التطبيقات أو أداة التتبُّع أو سجلات الوصول إلى NGINX كما هو موضّح في خطوات التشخيص الشائعة.
  2. إذا كان رمز الخطأ هو messaging.adaptors.http.flow.DecompressionFailureAtRequest وقيمة مصدر الخطأ هي policy أو proxy، يعني ذلك أنّ الطلب الذي أرسله تطبيق العميل يتضمّن حمولة لا تتطابق مع الترميز المتوافق المحدّد في عنوان الطلب Content-Encoding.
  3. يمكنك تحديد عدم التطابق كجزء من طلب HTTP باستخدام إحدى الطرق التالية:

    رسالة الخطأ

    للتأكُّد من استخدام رسالة الخطأ، اتّبِع الخطوات التالية:

    1. إذا كان بإمكانك الوصول إلى رسالة الخطأ الكاملة التي تم تلقّيها من Apigee Edge، يُرجى الرجوع إلى faultstring.

      نموذج لرسالة خطأ:

      "faultstring":"Decompression failure at request"
      
    2. في رسالة الخطأ أعلاه، يتم عرض "Decompression failure at request" ما يعني أنّه تعذّر فك ضغط الطلب باستخدام الترميز المحدّد في العنوان Content-Encoding.

    التتبّع

    للتحقق من استخدام التتبع:

    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.

    سجلّات "معالج الرسائل"

    للتحقق من صحة استخدام سجلات معالج الرسائل:

    إذا كنت من مستخدمي السحابة الإلكترونية الخاصة، يمكنك استخدام سجلات معالج الرسائل لتحديد المعلومات الأساسية حول أخطاء 400 في HTTP.

    1. حدِّد رقم تعريف الرسالة للطلب الذي تعذّر تنفيذه باستخدام رصد واجهة برمجة التطبيقات أو أداة التتبُّع أو سجلات الوصول إلى NGINX كما هو موضّح في خطوات التشخيص الشائعة.
    2. ابحث عن معرِّف الرسالة في سجلّ معالج الرسائل:

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

    3. سيظهر أحد الاستثناءات التالية:

      السيناريو الأول

      السيناريو 1: عندما يحتوي طلب واجهة برمجة التطبيقات على العنوان 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 لتطبيقات العملاء.

      السيناريو الثاني

      السيناريو 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 في رسالة الخطأ أعلاه إلى أنّ حمولة الطلب لا يتم إرسالها بتنسيق deflate ولا تتطابق مع الترميز المحدّد في العنوان Content-Encoding من deflate. لذلك، تعرض Apigee Edge الاستثناء وتعرض رمز الحالة 400 الذي يتضمّن رمز الخطأ messaging.adaptors.http.flow.DecompressionFailureAtRequest لتطبيقات العملاء.

درجة الدقّة

  1. إذا لم تكن هناك حاجة إلى حمولة الطلب المضغوطة في تدفق الخادم الوكيل لواجهة برمجة التطبيقات في Apigee Edge وفي خادم الخلفية، يجب عدم تمرير الرأس Content-Encoding. إذا كانت هناك حاجة لضغط حمولة الطلب، انتقِل إلى الخطوة 2.
  2. تأكَّد من أنّ تطبيق العميل يرسل ما يلي دائمًا:
    • أي من الترميز المتوافق كقيمة للعنوان Content-Encoding في الطلب
    • تتطابق حمولة الطلب بالتنسيق المتوافق مع Apigee Edge مع تنسيق الترميز المحدّد في العنوان Content-Encoding.
  3. في المثال الذي تمت مناقشته أعلاه، تكون حمولة الطلب بتنسيق 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:

إذا كنت من مستخدمي Cloud Cloud، يُرجى تقديم المعلومات التالية:

  • اسم المؤسسة
  • اسم البيئة
  • اسم الخادم الوكيل لواجهة برمجة التطبيقات
  • أكمِل أمر curl المستخدَم لإعادة إظهار الخطأ 400.
  • ملف التتبُّع الخاص بطلبات واجهة برمجة التطبيقات

إذا كنت مستخدم 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