Здесь идет…
Принимая дамп пакета, я вижу, что 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
Так что я собираюсь предположить, что Facebook отправляет неверную длину контента.Чтобы проверить это, я буду использовать 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 нет).
Копая немного дальше, кажется, что Алески прав: Content-Length
правильно, когдаизображение отправлено сжатым gzip.Чтобы подтвердить это, я добавил Accept-Encoding: gzip
в мой файл headers
.Facebook корректно отправляет ответ gzip, который является ожидаемой длиной, и его распаковка приводит к правильному изображению.
tl; dr : Content-Length
в Facebook неправильный, если Content-Encoding
не gzip
.