400 Permintaan Buruk - DekompresiFailureAtRequest

Anda sedang melihat dokumentasi Apigee Edge.
Buka dokumentasi Apigee X.
info

Gejala

Aplikasi klien mendapatkan kode status HTTP 400 Bad Request dengan kode error messaging.adaptors.http.flow.DecompressionFailureAtRequest sebagai respons terhadap panggilan API.

Pesan error

Aplikasi klien mendapatkan kode respons berikut:

HTTP/1.1 400 Bad Request

Selain itu, Anda mungkin melihat pesan error yang mirip dengan yang ditampilkan di bawah ini:

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

Kemungkinan penyebab

Error ini hanya terjadi jika:

  • Encoding yang ditentukan dalam header permintaan HTTP Content-Encoding valid dan didukung oleh Apigee Edge,
  • TETAPI

  • Format payload yang dikirim oleh klien sebagai bagian dari permintaan HTTP tidak cocok dengan format encoding yang ditentukan pada header Content-Encoding

Hal ini karena Apigee Edge gagal mendekode payload menggunakan encoding yang ditentukan karena format payload tidak dalam format yang sama dengan encoding yang ditentukan dalam header Content-Encoding.

Berikut adalah beberapa contoh nilai Content-Encoding yang didukung dan bagaimana Apigee Edge mengharapkan format payload dalam kasus tersebut:

Skenario Content-Encoding Format Payload yang diharapkan
Encoding Tunggal gzip

Format gzip Unix.

Lihat Format GZIP RFC1952.

Encoding Tunggal mengempis

Format ini menggunakan struktur zlib dengan algoritme kompresi deflate.

Lihat RFC1950 dan RFC1951.

Beberapa Encoding

Beberapa Encoding

Misalnya, jika encoding dilakukan dua kali, hal ini dapat berupa:

  • gzip, mengecil
  • gzip, gzip
  • mengempis, gzip
  • mengempis, mengempis
Beberapa encoding diterapkan ke payload dalam urutan tertentu seperti yang muncul di header.

Kemungkinan penyebab error ini adalah sebagai berikut:

Penyebab Deskripsi Petunjuk pemecahan masalah yang berlaku untuk
Format payload permintaan tidak cocok dengan encoding yang ditentukan di header Content-Encoding Format payload permintaan yang dikirim oleh klien tidak dienkode atau tidak sesuai dengan encoding yang ditentukan pada header Content-Encoding. Pengguna Edge Publik dan Private Cloud

Langkah-langkah diagnosis umum

Gunakan salah satu alat/teknik berikut untuk mendiagnosis error ini:

Pemantauan API

Untuk mendiagnosis error menggunakan API Monitoring:

  1. Login ke UI Apigee Edge sebagai pengguna dengan peran yang sesuai.
  2. Beralihlah ke organisasi tempat Anda ingin menyelidiki masalah.

  3. Buka halaman Analyze > API Monitoring > Menyelidiki.
  4. Pilih jangka waktu spesifik saat Anda melihat error.
  5. Pastikan filter Proxy disetel ke Semua.
  6. Tempatkan Kode Kesalahan terhadap Waktu.
  7. Pilih sel yang memiliki kode kesalahan messaging.adaptors.http.flow.DecompressionFailureAtRequest seperti yang ditunjukkan di bawah ini:

    ( lihat gambar yang lebih besar)

  8. Informasi tentang kode kesalahan messaging.adaptors.http.flow.DecompressionFailureAtRequest ditampilkan seperti yang ditunjukkan di bawah ini:

    ( lihat gambar yang lebih besar)

  9. Klik View logs dan luaskan baris yang gagal dengan error 400.

    ( lihat gambar yang lebih besar)

  10. Dari jendela Logs, perhatikan detail berikut:
    • Kode Status: 400
    • Sumber Kesalahan: proxy
    • Kode Kesalahan: messaging.adaptors.http.flow.DecompressionFailureAtRequest.
  11. Jika Fault Source memiliki nilai proxy, hal itu menunjukkan bahwa format payload permintaan tidak sesuai dengan encoding yang didukung yang ditentukan dalam header Content-Encoding.

Alat pelacak

Untuk mendiagnosis error menggunakan alat Trace:

  1. Aktifkan sesi perekaman aktivitas dan:
    1. Tunggu hingga error 400 Bad Request terjadi, atau
    2. Jika Anda dapat merekonstruksi masalah, lakukan panggilan API dan reproduksi 400 Bad Request.
  2. Pastikan Show all FlowInfos diaktifkan:

  3. Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitas.
  4. Jelajahi berbagai fase rekaman aktivitas dan temukan lokasi terjadinya kegagalan.
  5. Biasanya Anda akan menemukan error dalam alur tepat setelah fase Request Received from Client seperti yang ditunjukkan di bawah ini:

    ( lihat gambar yang lebih besar)

  6. Catat nilai properti dari rekaman aktivitas:

    • error: Decompression failure at request
    • error.class: com.apigee.rest.framework.BadRequestException
    • error.cause: Not in GZIP format

    error.cause menyatakan bahwa payload permintaan TIDAK dalam format GZIP. Artinya, Apigee Edge mengharapkan payload permintaan dalam format GZIP karena telah ditentukan dalam header Content-Encoding.

  7. Tentukan nilai header permintaan Content-Encoding. Untuk melakukannya, buka fase Request Received from Client seperti yang ditunjukkan di bawah ini:

    ( lihat gambar yang lebih besar)

    Perhatikan bahwa nilai header permintaan Content-Encoding memang gzip.

    Contoh rekaman aktivitas di atas menunjukkan bahwa encoding yang ditentukan dalam header permintaan Content-Encoding adalah gzip; namun, payload permintaan tidak dalam format GZIP. Oleh karena itu, Apigee tidak dapat mendekompresi payload menggunakan gzip dan menampilkan error Decompression failure at request.

  8. Perhatikan kode status dan pesan error yang ditampilkan oleh Apigee Edge dengan menavigasi

    ke fase Response Sent to Client dalam pelacakan seperti yang ditunjukkan di bawah ini:

    ( lihat gambar yang lebih besar)

    Perhatikan detail berikut dari rekaman aktivitas:

    • Kode status: 400 Bad Request.
    • Konten Error: {"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
  9. Buka fase AX (Data Analytics Dicatat) dalam rekaman aktivitas tersebut, lalu klik.

  10. Scroll ke bawah ke bagian Phase Details, Error Headers, lalu tentukan nilai X-Apigee-fault-code dan X-Apigee-fault-source seperti yang ditunjukkan di bawah ini:

    ( lihat gambar yang lebih besar)

  11. Anda akan melihat nilai X-Apigee-fault-code dan X-Apigee-fault-source sebagai messaging.adaptors.http.flow.DecompressionFailureAtRequest dan policy, yang menunjukkan bahwa format payload permintaan tidak cocok dengan encoding yang ditentukan dalam header Content-Encoding.
    Header respons Nilai
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
    X-Apigee-fault-source policy

NGINX

Untuk mendiagnosis error menggunakan log akses NGINX:

  1. Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log akses NGINX untuk menentukan informasi utama tentang error 400 HTTP.
  2. Periksa log akses NGINX:

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

    Tempat: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.

  3. Telusuri untuk melihat apakah ada error 400 selama durasi tertentu (jika masalah terjadi di masa lalu) atau apakah ada permintaan yang masih gagal dengan 400.
  4. Jika Anda menemukan error 400 dengan X-Apigee-fault-code yang cocok dengan nilai messaging.adaptors.http.flow.DecompressionFailureAtRequest, maka tentukan nilai X-Apigee-fault-source.

    Contoh error 400 dari log akses NGINX:

    Contoh entri di atas dari log akses NGINX memiliki nilai berikut untuk X-Apigee-fault-code dan X-Apigee-fault-source:

    Header respons Nilai
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
    X-Apigee-fault-source policy

Penyebab: Format payload permintaan tidak cocok dengan encoding yang ditentukan di header Content-Encoding

Secara default, Apigee Edge selalu mendekompresi payload jika header permintaan Content-Encoding berisi encoding yang valid dan didukung. Oleh karena itu, format payload permintaan harus sesuai dengan encoding yang ditentukan dalam header permintaan Content-Encoding. Jika ada ketidakcocokan, Anda akan mendapatkan error ini.

Diagnosis

  1. Tentukan Kode Kesalahan dan Sumber Kesalahan untuk error yang diamati menggunakan Pemantauan API, Alat Pelacakan, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
  2. Jika Fault Code adalah messaging.adaptors.http.flow.DecompressionFailureAtRequest dan Fault Source memiliki nilai policy atau proxy, hal ini menunjukkan bahwa permintaan yang dikirim oleh aplikasi klien memiliki payload yang tidak sesuai dengan encoding yang didukung yang ditentukan dalam header permintaan Content-Encoding.
  3. Anda dapat menentukan ketidakcocokan ini sebagai bagian dari permintaan HTTP menggunakan salah satu metode berikut:

    Pesan error

    Untuk memvalidasi menggunakan pesan error:

    1. Jika Anda memiliki akses ke pesan error lengkap yang diterima dari Apigee Edge, lihat faultstring.

      Contoh pesan error:

      "faultstring":"Decompression failure at request"
      
    2. Dalam pesan error di atas, kode menampilkan "Decompression failure at request" yang menyiratkan bahwa permintaan tidak dapat didekompresi menggunakan encoding yang ditentukan dalam header Content-Encoding.

    Rekaman aktivitas

    Untuk melakukan validasi menggunakan Trace:

    1. Tentukan nilai header permintaan Content-Encoding dan properti error.Cause menggunakan Trace seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
    2. Nilai dari rekaman aktivitas sampel adalah sebagai berikut:

      • Encoding Konten: gzip
      • error.cause: Not in GZIP format

      Nilai dalam header permintaan Content-Encoding adalah gzip; namun, payload permintaan tidak dalam format GZIP (seperti yang ditunjukkan oleh error.Cause). Oleh karena itu, Apigee Edge merespons dengan 400 Bad Request dan kode error messaging.adaptors.http.flow.DecompressionFailureAtRequest.

    Permintaan sebenarnya

    Untuk memvalidasi menggunakan permintaan yang sebenarnya:

    Jika Anda memiliki akses ke permintaan aktual yang dibuat oleh aplikasi klien, lakukan langkah-langkah berikut:

    1. Tentukan nilai yang diteruskan ke header permintaan Content-Encoding.
    2. Tentukan format payload yang dikirim sebagai bagian dari permintaan.
    3. Jika nilai header Content-Encoding ada dalam daftar encoding yang didukung tetapi format payload permintaan tidak sesuai dengan encoding yang ditentukan dalam header Content-Encoding, maka itulah penyebab masalah.

      Contoh permintaan:

      curl -v "http://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.zip
      

      Contoh permintaan di atas mengirimkan nilai gzip ke header Content-Encoding yang merupakan encoding yang didukung di Apigee Edge. Namun, payload permintaan request_payload.zip dalam format ZIP. Oleh karena itu, permintaan ini gagal dengan kode status 400 Bad Request dan kode error: messaging.adaptors.http.flow.DecompressionFailureAtRequest.

    Log Pemroses Pesan

    Untuk memvalidasi menggunakan log Pemroses Pesan:

    Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log Pemroses Pesan untuk menentukan informasi penting tentang error 400 HTTP.

    1. Tentukan ID pesan dari permintaan yang gagal menggunakan Pemantauan API, Alat Pelacakan, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
    2. Telusuri ID pesan di log Message Processor:

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

    3. Anda akan melihat salah satu pengecualian berikut:

      Skenario #1

      Skenario #1: Saat permintaan API memiliki header 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
      

      Baris java.util.zip.ZipException: Not in GZIP format pada pesan error di atas menunjukkan bahwa payload permintaan tidak dikirim dalam format GZIP meskipun Content-Encoding ditetapkan sebagai gzip. Oleh karena itu, Apigee Edge menampilkan pengecualian dan menampilkan kode status 400 dengan kode kesalahan messaging.adaptors.http.flow.DecompressionFailureAtRequest ke aplikasi klien.

      Skenario #2

      Skenario #2: Saat permintaan API memiliki header 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)
      

      Baris java.util.zip.ZipException: incorrect header check dan Caused by: java.util.zip.DataFormatException: incorrect header check pada pesan error di atas menunjukkan bahwa payload permintaan tidak dikirim dalam format deflate dan tidak sesuai dengan encoding yang ditentukan dalam header deflate Content-Encoding. Oleh karena itu, Apigee Edge akan menampilkan pengecualian dan menampilkan kode status 400 dengan kode kesalahan messaging.adaptors.http.flow.DecompressionFailureAtRequest ke aplikasi klien.

Resolusi

  1. Jika payload permintaan terkompresi tidak diperlukan dalam alur proxy API di Apigee Edge dan di server backend, jangan teruskan header Content-Encoding. Jika payload permintaan perlu dikompresi, lanjutkan ke langkah 2.
  2. Pastikan aplikasi klien selalu mengirim hal berikut:
    • Salah satu encoding yang didukung sebagai nilai untuk header Content-Encoding dalam permintaan
    • Payload permintaan dalam format yang didukung ke Apigee Edge cocok dengan format encoding yang ditentukan dalam header Content-Encoding
  3. Dalam contoh yang dibahas di atas, payload permintaan dalam format ZIP, tetapi header permintaan menentukan Content-Encoding: gzip. Anda dapat memperbaiki masalah ini dengan mengirimkan header permintaan sebagai Content-Encoding: gzip dan payload permintaan juga dalam format gzip:
    curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
    

Spesifikasi

Apigee Edge merespons kode status 400 Bad Request dengan kode error messaging.adaptors.http.flow.DecompressionFailureAtRequest sesuai dengan spesifikasi RFC berikut:

Spesifikasi
RFC 7231, bagian 6.5.1
RFC 7231, bagian 3.1.2.2

Jika Anda masih memerlukan bantuan dari Dukungan Apigee, buka Harus mengumpulkan informasi diagnostik.

Harus mengumpulkan informasi diagnostik

Kumpulkan informasi diagnostik berikut, lalu hubungi Dukungan Apigee Edge:

Jika Anda adalah pengguna Cloud Publik, berikan informasi berikut:

  • Nama organisasi
  • Nama lingkungan
  • Nama Proxy API
  • Selesaikan perintah curl yang digunakan untuk mereproduksi error 400
  • File rekaman aktivitas untuk permintaan API

Jika Anda adalah pengguna Private Cloud, berikan informasi berikut:

  • Pesan error lengkap yang diamati untuk permintaan yang gagal
  • Nama lingkungan
  • Paket Proxy API
  • File rekaman aktivitas untuk permintaan API
  • Log akses NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Tempat: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.

  • Log sistem Pemroses Pesan /opt/apigee/var/log/edge-message-processor/logs/system.log