2011-03-31 52 views

回答

13

這裏去...

以一包垃圾,我看到了Facebook的返回相同 Content-Length的Safari瀏覽器,因爲它不捲曲,且內容長度是不正確11252:

 
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 

和Safari瀏覽器:

 
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 

所以我要去猜測Facebo好的是發送一個不正確的內容長度。爲了驗證這一點,我將使用netcat的:

 
$ 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 

(請注意,我用HTTP/1.0所以Facebook的服務器不會試圖舉行公開的連接)

卸下前10行ouput使用文本編輯器,然後將其保存爲output.jpg,我已經得到完整的圖像。

因此,這確認Facebook發送不正確的Content-Length標題(因爲curl關注內容長度而netcat不是),所以圖像正在切斷。

進一步挖掘,看起來像Aleski是正確的 - Content-Length是正確的,當圖像發送gzip壓縮。爲了證實這一點,我添加了Accept-Encoding: gzip到我的headers文件。 Facebook正確地發送一個gzip'd響應,這是預期的長度,並解壓縮它會產生正確的圖像。

TL;博士:Facebook的Content-Length不正確,如果Content-Encodinggzip

+0

太棒了。爲了弄清楚這一點,謝謝。 – Leopd 2011-04-01 01:18:35

4

看來服務器有問題。當我測試它時,firefox和wget的區別在於firefox表示它接受gzip或deflate壓縮的請求,而wget沒有。

服務器對firefox的響應是11252字節的壓縮數據,它對wget的響應是11377字節的未壓縮數據。但它發送的內容長度卻是11252(正如David所說的)。

換句話說,即使發送未壓縮數據,服務器似乎緩存壓縮版本並錯誤地發送壓縮大小。您可以獲取所有數據,但由於服務器通告的數據較少,因此wget(以及其他需要未壓縮數據的軟件)會丟棄「額外」數據。

相關問題