считайте файл из сервера с некоторым смещением

Как я могу считать файл из сервера, запускающегося с некоторого смещения (Подобное поведение к wget-c)? Какие заголовки я должен отправить на сервер? Какие фьючерсы сервер должен поддерживать?

7
задан Mykola Kharechko 8 July 2010 в 11:52
поделиться

2 ответа

В запросе следует использовать заголовок 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.

15
ответ дан 6 December 2019 в 10:47
поделиться

В 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

, чтобы посоветовать клиенту не пытаться выполнить запрос диапазона.

3
ответ дан 6 December 2019 в 10:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: