我很難過這個。嘗試在瀏覽器中加載此圖像,然後將其保存到硬盤上。瀏覽器和wget加載JPEG的方式不同嗎?
http://profile.ak.fbcdn.net/hprofile-ak-snc4/41674_660962816_995_n.jpg
這是在11377個字節的有效的JPEG文件。
現在嘗試下載wget
或curl
。只有11252字節出現,並且圖像的右下部分缺失。
什麼給?
我很難過這個。嘗試在瀏覽器中加載此圖像,然後將其保存到硬盤上。瀏覽器和wget加載JPEG的方式不同嗎?
http://profile.ak.fbcdn.net/hprofile-ak-snc4/41674_660962816_995_n.jpg
這是在11377個字節的有效的JPEG文件。
現在嘗試下載wget
或curl
。只有11252字節出現,並且圖像的右下部分缺失。
什麼給?
這裏去...
以一包垃圾,我看到了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-Encoding
不gzip
。
看來服務器有問題。當我測試它時,firefox和wget的區別在於firefox表示它接受gzip或deflate壓縮的請求,而wget沒有。
服務器對firefox的響應是11252字節的壓縮數據,它對wget的響應是11377字節的未壓縮數據。但它發送的內容長度卻是11252(正如David所說的)。
換句話說,即使發送未壓縮數據,服務器似乎緩存壓縮版本並錯誤地發送壓縮大小。您可以獲取所有數據,但由於服務器通告的數據較少,因此wget(以及其他需要未壓縮數據的軟件)會丟棄「額外」數據。
太棒了。爲了弄清楚這一點,謝謝。 – Leopd 2011-04-01 01:18:35