İstekler için http sıkıştırmayı etkinleştirmek mümkün mü?


35

Sunucu yanıtları için http sıkıştırmayı etkinleştirme hakkında birçok bilgi görüyorum, ancak gelen isteklere ne olacak. Tarayıcıların, büyük form gönderilerini sunucuya göndermeden önce sıkıştırması mantıklı olmaz mıydı?

Başka bir örnek, kullandığımız bir REST web servisidir. Büyük XML dosyaları (10+ MB) içeren sık PUT istekleri göndermemiz gerekiyor ve kesinlikle her iki tarafta da bazı bant genişliği / hız avantajlarını göreceğiz.

Öyleyse bu, sunucu tarafında çözülmüş bir sorun mu yoksa her web uygulaması ayrı ayrı ele almalı mı?

Yanıtlar:


30

To PUTsunucuya verileri istek gövdesini sıkıştırmak ve ayarlamalısınız sıkıştırılmış Content-Encoding: gzipbaşlığı. Başlığın kendisi sıkıştırılmamış olmalıdır. Mod_deflate içinde belgelenmiştir :

Mod_deflate modülü ayrıca, bir gzip sıkıştırılmış istek gövdesinin sıkıştırmasını açmak için bir filtre sağlar. Bu özelliği etkinleştirmek için SetInputFilter veya AddInputFilter kullanarak DEFLATE filtresini giriş filtresi zincirine yerleştirmeniz gerekir.

...

Şimdi bir istek İçerik Kodlama: gzip başlığı içeriyorsa, gövde otomatik olarak açılır. Çok az sayıda tarayıcı istek organlarını gzipleyebilme özelliğine sahiptir. Ancak, bazı özel uygulamalar aslında bazı WebDAV istemcileri gibi istek sıkıştırmasını desteklemektedir.

Ve onu anlatan bir makale burada :

Peki nasıl yapıyorsun? Mod_deflate kaynak kodundan yine bulanık: sadece ana istek üzerinde çalışıyor / alt talep yok. Bu, isteğin tüm gövdesinin, bunu kullanmayı seçtiğimizde gzip sıkıştırılmış olması gerektiği anlamına gelir, örneğin dosyayı çok parçalı bir istekte yalnızca parçanın sıkıştırılması mümkün değildir.

Ayrı olarak, bir tarayıcı, burada belirtildiğiAccept-Encoding gibi başlığını ayarlayarak sunucu yanıtı içeriğinin sıkıştırılmasını talep edebilir :

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

Bu sıkıştırılmış verileri tarayıcıya döndürür.


5
+1 NB yazıyorsunuz you must compress the whole request, inclusive of header. Ancak, http başlıkları sıkıştırılmamalıdır . Sıkıştırılması gereken tek şey (tam olarak, doğru şekilde belirttiğiniz makalede belirtildiği gibi) http gövdesidir.
Eugene Beresovsky

1
Bu yanlıştır: Accept-EncodingSunucuya, istemcinin hangi sıkıştırmayı desteklediğini bildirir. Başlık Content-Encoding, vücudun sıkıştırılmasını açıklar.
maaartinus

@maaartinus birinci teklifi ikinci paragrafa bakın. Netlik için cevabı yeniden organize ettim.
Andy,

4

Sıkıştırılmış istekler hakkındaki kısma cevap vermek, cevaplar değil: evet, yaygın kullanımda görünmese bile mümkündür. İstemci tarafı uygulamasının uygun içerik kodlama başlığını ayarlaması gerekir. Sunucu tarafı uygulamasına gelince, 2 seçenek vardır:

  1. Uygulama, istek gövdesini kendi kendine reddetmeyi destekler. Bunu yapabilen örnek bir kütüphane phpxmlrpc'dir.

  2. Web sunucusu, cevap gövdesini uygulamaya geçirmeden önce şişirir. Bu Apache'nin mod_deflate filtresini kullanarak ve bir inputFilter kurarak mümkündür.


2

Yerel olarak bildiğim herhangi bir tarayıcıdan değil, sizin için yapacak bir eklenti bulmanız gerekecek. Temelde, sunucunun isteğin nasıl geldiğini bilmesi için içerik kodlama HTTP başlığını ayarlamanız gerekir. Elbette, sunucunun bu kodlamayı kullanabilmesi gerekir.


0

Buna izin verilmiyor. HTTP spesifikasyonuna göre ( RFC 2616 ), Content-Encodingolası istek başlık alanlarından biri DEĞİLDİR, bu nedenle, sunucunun bunun meydana geldiğini bildirmesinin yasal bir yolu olmadığından talep varlık gövdesini sıkıştırmak mümkün değildir. İstek gövdesinin herhangi bir sıkıştırması sadece standart olmayan bir uzantı olarak yapılır.


12
Bu cevap yanlış RFC 2616 özellikle bahseder 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).ayrıca belirtilir Request and Response messages MAY transfer an entity if not otherwise restricted by the request methodve Content-Encodingbir seçenek olarak listelenmesinientity-header
PeterT
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.