2011-03-31 10 views

cevap

13
İşte

gider ... Ben Facebook kez kıvrılıp yaptığı gibi Safari aynı Content-Length döndürdüğünü görmek ve bu içerik uzunlukta yanlış 11252 geçerli:

 
GET /hprofile-ak-snc4/41674_660962816_995_n.jpg HTTP/1.1 
User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3 
Host: profile.ak.fbcdn.net 
Accept: */* 

HTTP/1.1 200 OK 
Content-Type: image/jpeg 
... snip .... 
Content-Length: 11252 

Ve Safari ile :

Yani
 
GET /hprofile-ak-snc4/41674_660962816_995_n.jpg HTTP/1.1 
Host: profile.ak.fbcdn.net 
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 
... snip ... 

HTTP/1.1 200 OK 
Content-Type: image/jpeg 
... snip ... 
Content-Length: 11252 

Ben Facebo tahmin gidiyorum Tamam yanlış Content-Length gönderiyor. Bunu test etmek için, ben Netcat'i kullanacağız:

 
$ cat headers 
GET /hprofile-ak-snc4/41674_660962816_995_n.jpg HTTP/1.0 
Host: profile.ak.fbcdn.net 
Accept: */* 

EOF 
$ nc -vvv profile.ak.fbcdn.net 80 output 
Warning: Inverse name lookup failed for `142.231.1.174' 
Notice: Real hostname for profile.ak.fbcdn.net [142.231.1.165] is a142-231-1-165.deploy.akamaitechnologies.com 
profile.ak.fbcdn.net [142.231.1.174] 80 (http) open 
Total received bytes: 12k (11639) 
Total sent bytes: 97 
$ head output 
HTTP/1.0 200 OK 
Content-Type: image/jpeg 
... snip ... 
Content-Length: 11252 

(kullandığım dikkat HTTP/1.0 yüzden Facebook sunucuları açık bağlantı tutmaya çalıştığım olmaz) ilk 10 satırları Çıkarma

ouput'un bir metin editörü kullanarak output.jpg olarak kaydetmesini sağlayarak tam görüntüye sahibim.

Bu nedenle, Facebook'un Content-Length numaralı bir üstbilgiyi yanlış gönderdiğinden emin olun (ve kıvrım netcat yokken içerik uzunluğuna dikkat ettiğinden resim kesiliyor).

Biraz daha kazma, bu Aleski'nin doğru gibi görünüyor - görüntü gzip sıkıştırılmış olduğunda Content-Length doğrudur. Bunu doğrulamak için 'u headers dosyama ekledim. Facebook, beklenen uzunluk olan bir gzip'd yanıtını doğru bir şekilde gönderir ve açılmadan doğru görüntüye yol açar.

tl; dr: Content-Encodinggzip değilse Facebook'un Content-Length yanlıştır.

+0

Harika. Bunu anlamak için teşekkürler. – Leopd

4

Sunucu hatalı görünüyor. Bunu test ettiğimde, firefox ve firefox arasındaki fark, firefox'un, talebe gzip veya deflate-depressed cevaplar kabul ettiğini, wget'in de yapmadığını gösterdi.

Firefox'a sunucu yanıtı sıkıştırılmış verilerin 11252 bayt'ıydı ve wget'e yanıtı sıkıştırılmamış veriden 11377 bayt oldu. Gönderdiği İçerik Uzunluğu her ikisi için de 11252 idi (David'in söylediği gibi). Başka bir deyişle, sunucunun sıkıştırılmış sürümü önbelleğe aldığını ve sıkıştırılmamış verileri gönderirken bile sıkıştırılmış boyutun yanlış gönderilmesini sağladığını görüyoruz. Tüm verileri alırsınız, ancak sunucu daha az veri tanıttığından, wget (ve sıkıştırılmamış veriyi isteyen diğer yazılımlar) "fazladan" verileri atar.

İlgili konular