Как я могу считать файл из сервера, запускающегося с некоторого смещения (Подобное поведение к wget-c)? Какие заголовки я должен отправить на сервер? Какие фьючерсы сервер должен поддерживать?
В запросе следует использовать заголовок Range
. Но вы можете использовать его только в том случае, если сервер сообщает вам, что он принимает запрос диапазона, в заголовке ответа Accept-Ranges
.
Это пример сеанса. Предположим, мы заинтересованы в получении части этой картинки . Сначала мы отправляем запрос HTTP HEAD
, чтобы определить: a) поддерживает ли сервер байтовые диапазоны, b) длину содержимого:
> HEAD /2238/2758537173_670161cac7_b.jpg HTTP/1.1
> Host: farm3.static.flickr.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Thu, 08 Jul 2010 12:22:12 GMT
< Content-Type: image/jpeg
< Connection: keep-alive
< Server: Apache/2.0.52 (Red Hat)
< Expires: Mon, 28 Jul 2014 23:30:00 GMT
< Last-Modified: Wed, 13 Aug 2008 06:13:54 GMT
< Accept-Ranges: bytes
< Content-Length: 350015
Затем мы отправляем запрос GET
с заголовок Range
, запрашивающий первые 11 байтов изображения:
> GET /2238/2758537173_670161cac7_b.jpg HTTP/1.1
> Host: farm3.static.flickr.com
> Accept: */*
> Range: bytes=0-10
>
< HTTP/1.1 206 Partial Content
< Date: Thu, 08 Jul 2010 12:26:54 GMT
< Content-Type: image/jpeg
< Connection: keep-alive
< Server: Apache/2.0.52 (Red Hat)
< Expires: Mon, 28 Jul 2014 23:30:00 GMT
< Last-Modified: Wed, 13 Aug 2008 06:13:54 GMT
< Accept-Ranges: bytes
< Content-Range: bytes 0-10/350015
< Content-Length: 11
<
Это шестнадцатеричный дамп первых 11 байтов:
00000000 ff d8 ff e0 00 10 4a 46 49 46 00 |......JFIF.|
0000000b
Для получения дополнительной информации см. Спецификацию заголовка диапазона в HTTP RFC 2616.
В http://www.gnu.org/software/wget/manual/wget.html
Обратите внимание, что «-c» работает только с ftp. серверов и с http-серверами, которые поддерживают заголовок Range.
В http: //tools.ietf.org / html / rfc2616
Примеры спецификатора диапазонов байтов значения (предполагается, что тело объекта
длина 10000):- Первые 500 байтов (байтовые смещения 0–499 включительно): bytes = 0- 499 - Вторые 500 байт (смещения байтов 500-999 включительно): байтов = 500-999 - Последние 500 байт (смещения байтов 9500-9999 включительно): байтов = -500 - Или байты = 9500- - Только первый и последний байты (байты 0 и 9999): байты = 0-0, -1 - Несколько юридических, но не канонических спецификаций второго
500 байт (байтовые смещения 500-999 включительно): байтов = 500-600,601-999 bytes = 500-700,601-999
Таким образом, вы должны отправить
Range:bytes=9500-
Чтобы проверить, поддерживает ли сервер его, вы можете протестировать принимаемый диапазон как таковой
Исходные серверы, которые принимают запросы байтового диапазона, МОГУТ отправлять
Accept -Диапазоны: байты
, но не обязательны для этого. Клиенты МОГУТ генерировать байтовый диапазон запросы без получения этого заголовка для ресурса вовлеченный. Единицы измерения определены в разделе 3.12.
Серверы, которые не принимают никаких запросов диапазона для ресурс МОЖЕТ отправить
Accept-Ranges: none
, чтобы посоветовать клиенту не пытаться выполнить запрос диапазона.