Apakah mungkin untuk mengaktifkan kompresi http untuk permintaan?

35

Saya melihat banyak informasi tentang mengaktifkan kompresi http untuk respons server, tetapi bagaimana dengan permintaan masuk. Tidakkah masuk akal bagi browser untuk mengompres posting bentuk besar sebelum mengirimnya ke server?

Contoh lain adalah layanan web REST yang kami gunakan. Kami harus sering mengirim permintaan PUT dengan file XML besar (10+ MB) dan pasti akan melihat manfaat bandwidth / kecepatan di kedua sisi.

Jadi apakah ini masalah yang diselesaikan di sisi server atau apakah setiap aplikasi web harus menanganinya secara terpisah?

Mike L
sumber

Jawaban:

30

Untuk PUTdata ke server yang dikompresi, Anda harus mengompres badan permintaan dan mengatur Content-Encoding: gzipheader. Header itu sendiri harus dikompresi. Ini didokumentasikan dalam mod_deflate :

Modul mod_deflate juga menyediakan filter untuk mendekompres sebuah tubuh permintaan terkompresi gzip. Untuk mengaktifkan fitur ini, Anda harus memasukkan filter DEFLATE ke rantai filter input menggunakan SetInputFilter atau AddInputFilter.

...

Sekarang jika sebuah permintaan berisi Content-Encoding: gzip header, badan akan secara otomatis didekompresi. Beberapa peramban memiliki kemampuan untuk gzip badan permintaan. Namun, beberapa aplikasi khusus benar-benar mendukung kompresi permintaan, misalnya beberapa klien WebDAV.

Dan sebuah artikel yang menggambarkannya ada di sini :

Jadi, bagaimana Anda melakukannya? Ini adalah uraian singkat, sekali lagi dari kode sumber mod_deflate: hanya bekerja berdasarkan permintaan utama / tidak ada subrequest. Ini berarti bahwa seluruh tubuh permintaan harus dikompresi gzip jika kami memilih untuk menggunakan ini, tidak mungkin untuk mengkompres hanya bagian yang berisi file misalnya dalam permintaan multi-bagian.

Secara terpisah, browser dapat meminta konten respons server untuk dikompres dengan mengatur Accept-Encodingtajuk sesuai di sini :

GET /index.html HTTP/1.1
Host: www.http-compression.com
Accept-Encoding: gzip
User-Agent: Firefox/1.0

Ini akan mengembalikan data terkompresi ke browser.

Andy
sumber
5
+1 NB Anda menulis you must compress the whole request, inclusive of header. Namun, header http tidak boleh dikompres . Satu-satunya hal yang harus dikompresi (secara penuh, seperti yang dinyatakan dalam artikel yang Anda kutip dengan benar), adalah badan http.
Eugene Beresovsky
1
Ini salah: Accept-Encodingmemberi tahu server, kompresi apa yang didukung klien. Header Content-Encodingmenjelaskan kompresi tubuh.
maaartinus
@maaartinus lihat kutipan pertama paragraf kedua. Saya telah mengatur ulang jawaban untuk kejelasan.
Andy
4

Menjawab bagian tentang permintaan terkompresi, bukan tanggapan: ya, itu mungkin, bahkan jika itu tampaknya tidak digunakan secara luas. Aplikasi sisi klien perlu mengatur header penyandian konten yang sesuai. Adapun aplikasi sisi server, ada 2 pilihan:

  1. aplikasi ini mendukung pemasangan kembali badan permintaan dengan sendirinya. Contoh perpustakaan yang dapat melakukan ini adalah phpxmlrpc.

  2. server web mengembang tubuh tanggapan sebelum meneruskannya ke aplikasi. Ini dimungkinkan dengan menggunakan filter mod_deflate dari Apache dan mengatur inputFilter

gggeek
sumber
2

Bukan bawaan dari browser apa pun yang saya tahu, Anda harus menemukan plugin yang akan melakukannya untuk Anda. Anda pada dasarnya harus mengatur header HTTP enkode-konten agar server tahu bagaimana permintaan itu masuk. Server, tentu saja, harus mampu menangani encoding itu.

squillman
sumber
0

Ini TIDAK diizinkan. Menurut spesifikasi HTTP ( RFC 2616 ), Content-EncodingBUKAN salah satu bidang tajuk permintaan yang mungkin, oleh karena itu tidak mungkin untuk mengompres badan entitas permintaan karena tidak ada cara hukum untuk memberi tahu server bahwa ini telah terjadi. Kompresi dari tubuh permintaan dilakukan hanya sebagai ekstensi non-standar.

Steve
sumber
12
Jawaban ini salah RFC 2616 secara khusus menyebutkan bahwa If the content-coding of an entity in a request message is not acceptable to the origin server, the server SHOULD respond with a status code of 415 (Unsupported Media Type).selanjutnya ditunjukkan oleh Request and Response messages MAY transfer an entity if not otherwise restricted by the request methoddan Content-Encodingterdaftar sebagai opsi dalamentity-header
PeterT