400 Permintaan Tidak Valid -DuplicateHeader

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

Gejala

Aplikasi klien mendapatkan kode status HTTP 400 Bad Request dengan kode error protocol.http.DuplicateHeader sebagai respons untuk 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":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

Kemungkinan penyebab

Error ini terjadi jika header HTTP tertentu yang tidak diizinkan memiliki duplikat di Apigee Edge, muncul lebih dari sekali dengan nilai yang sama atau berbeda sebagai bagian dari permintaan HTTP yang dikirim oleh klien ke Apigee Edge.

Sesuai dengan RFC 7230, bagian 3.2.2: Urutan Kolom, pengirim TIDAK BOLEH membuat beberapa kolom header dengan nama kolom yang sama dalam pesan, kecuali jika seluruh nilai kolom untuk kolom header tersebut ditetapkan sebagai daftar yang dipisahkan koma, [yaitu, #(values)] atau kolom header adalah pengecualian yang umum digunakan. Jika menemukan header tertentu yang tidak diizinkan memiliki duplikat, lebih dari sekali dalam permintaan HTTP yang dikirim oleh klien, Apigee Edge akan merespons dengan 400 Bad Request dan kode error protocol.http.DuplicateHeader.

Berikut kemungkinan penyebab error ini:

Penyebab Deskripsi Petunjuk pemecahan masalah yang berlaku untuk
Header duplikat dalam permintaan Permintaan HTTP dari aplikasi klien ke Apigee berisi header duplikat. 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 protocol.http.DuplicateHeader seperti yang ditunjukkan di bawah ini:

  8. Informasi tentang kode kesalahan protocol.http.DuplicateHeader ditampilkan seperti yang ditunjukkan di bawah ini:

  9. Klik Lihat log dan luaskan baris untuk permintaan yang gagal.
  10. Dari jendela Logs, perhatikan detail berikut:
    1. Kode Status: 400
    2. Sumber Kesalahan: apigee
    3. Kode Kesalahan: protocol.http.DuplicateHeader.
  11. Jika Fault Source memiliki nilai apigee atau MP dan Fault Code memiliki nilai protocol.http.DuplicateHeader, berarti permintaan HTTP dari klien berisi header duplikat.

Alat pelacak

NGINX

Untuk mendiagnosis error menggunakan log akses NGINX:

  1. Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log akses NGINX untuk menentukan informasi penting 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 sebelumnya) atau apakah ada permintaan yang masih gagal dengan 400.
  4. Jika Anda menemukan error 400 dengan X-Apigee-fault-code yang cocok dengan nilai protocol.http.DuplicateHeader, tentukan nilai X-Apigee-fault-source.

    Contoh error 400 dari log akses NGINX:

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

    Header Respons Nilai
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

Penyebab: Header Duplikat yang diminta

Diagnosis

  1. Tentukan Kode Kesalahan dan Sumber Kesalahan untuk error yang diamati menggunakan API Monitoring atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
  2. Jika Fault Source memiliki nilai apigee atau MP, hal ini menunjukkan bahwa permintaan yang dikirim oleh aplikasi klien ke Apigee berisi header duplikat.
  3. Anda dapat menentukan header sebenarnya yang dikirim lebih dari sekali sebagai bagian dari permintaan menggunakan salah satu metode berikut:

    Pesan error

    Menggunakan pesan error

    1. Jika Anda memiliki akses ke pesan error lengkap yang diterima dari Apigee Edge, lihat faultstring. faultstring berisi nama header yang telah dikirim lebih dari sekali.

      Contoh pesan error:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. Dalam pesan error di atas, Anda dapat melihat bahwa header Expires dikirim lebih dari sekali seperti yang terlihat di faultstring.

    Permintaan sebenarnya

    Menggunakan permintaan sebenarnya

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

      1. Verifikasi daftar header yang diteruskan dalam permintaan.
      2. Jika Anda menemukan bahwa header tertentu muncul lebih dari sekali dalam permintaan dengan nilai yang sama atau berbeda , berarti itulah penyebab error ini.

      Contoh Permintaan:

      curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
      

      Dalam contoh permintaan di atas, header Expires dikirim lebih dari sekali. Oleh karena itu, permintaan ini gagal dengan error 400 Bad Request dan kode error: protocol.http.DuplicateHeader.

    2. Atau, jika memiliki akses ke log klien, Anda dapat melihat apakah Anda memiliki informasi tentang permintaan aktual yang dibuat ke Apigee Edge dan menentukan header yang dikirim lebih dari satu kali.

Resolusi

Memperbaiki duplikasi

Opsi #1 [Opsi yang Direkomendasikan] Memperbaiki aplikasi klien agar tidak menyertakan header duplikat

  1. Analisis alasan klien tertentu mengirim header duplikat. Misalnya, Expires dalam kasus di atas. Pastikan bahwa proxy API dapat menerima header duplikat. Biasanya, URL ini tidak diinginkan sesuai dengan spesifikasi HTTP RFC7230.
  2. Jika tidak diinginkan, ubah aplikasi klien Anda agar tidak mengirim header duplikat.

    Pada contoh yang dibahas di atas, terlihat bahwa header Expires dikirim dua kali dengan nilai yang sama, dan hal ini tidak diinginkan. Anda dapat memperbaiki masalah ini dengan meneruskan header Expires hanya satu kali, seperti yang ditunjukkan di bawah ini:

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. Jika diinginkan dan Anda ingin mengizinkan header duplikat, buka Opsi #2 Menggunakan properti CwC.

CwC

Opsi #2 Menggunakan properti CwC

Apigee menyediakan properti CwC HTTPHeader.<HeaderName> ,yang memungkinkan aplikasi klien dan server target mengirim header duplikat ke proxy API di Apigee Edge.

Properti CwC Nilai
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Misalnya, properti berikut dapat ditetapkan pada Pemroses Pesan untuk mengizinkan duplikat dan beberapa nilai untuk header Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Jika Anda adalah pengguna Private Cloud, Anda dapat mengonfigurasi properti ini agar Apigee Edge tidak memunculkan error 400 Bad Request, meskipun permintaan tersebut berisi header duplikat menggunakan panduan cara kerja Mengonfigurasi Prosesor Pesan untuk menggunakan header duplikat.
  2. Jika Anda adalah pengguna Cloud Publik, hubungi Dukungan Apigee Edge untuk mengonfigurasi properti ini bagi organisasi Anda.

Spesifikasi

Apigee memperkirakan aplikasi klien tidak akan mengirim header duplikat sebagai bagian dari permintaan sesuai dengan spesifikasi RFC berikut:

Spesifikasi
RFC 7230, bagian 3.2.2: Urutan Kolom
RFC 7230, bagian 3.2 Kolom Header

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
  • Selesaikan perintah curl yang Anda gunakan untuk mereproduksi error 400
  • 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