Как работает заголовок Range
с Content Negotiation? Позвольте мне объяснить, но сначала давайте соглашаемся на следующее: HTTP - это протокол без состояния.Контент HTTP-контента и заголовок диапазона
Когда HTTP-сервер может отправлять несколько представлений одного ресурса, согласование контента используется для определения того, какое представление необходимо отправить: клиент может указать его предпочтение (то есть английский и GIF), тогда сервер выполнит или - - в сценарии, где он не может - сервер будет выбирать через некоторую эвристическую оценку, какое представление отправить клиенту.
Пока все хорошо ... но что происходит, когда вы бросаете Range
в микс?
Представьте себе следующий сценарий:
Джона в аэропорту в Париже и его браузер отправляет запрос HTTP. По какой-то причине его браузер не указывает какие-либо предпочтения в типе контента, язык или сжатие.
GET /uri HTTP/1.1 Host: example.com
Поскольку он имеет очень мало, чтобы пройти, сервер, через некоторые эвристики, решает отправить французское представление URI (IP-распознаются как из Франции.)
200 Okay Accept-Ranges: bytes Content: text/html Content-Language: fr ....data...
Середина передачи, Джон останавливает загрузку, чтобы поймать свой полет. Джон возобновляет свою загрузку , как только он прибывает в Нью-Йорк.
GET /uri HTTP/1.1 Host: example.com Range: 2000-3000
Опять же, с небольшим количеством информации о предпочтении клиента, сервер на этот раз решает отправить английское представление URI (IP-распознаются как из Нью-Йорка.)
По этот момент, файл поврежден, поскольку часть его находится на французском языке, а другая часть - на английском языке.
Гипотеза:
- Возможно клиент запомнит тип контента и язык из первого ответа, с тем чтобы послать эту информацию обратно на сервер для второго запроса (под
Accept: text/html Accept-Language: fr
). Однако, поскольку nether RFC2616 или RFC7233 ничего не касается в отношении этого (даже рекомендации), я считаю, что HTTP-клиенты с таким поведением будут редкими ... но мне еще предстоит его протестировать.
Примечания:
- В приведенном выше сценарии, мы могли бы легко иметь клиент посылает предпочтения и имеющих сервер не способен соблюдать ... и по-прежнему отступали к другим эвристики. Проблема сохраняется.
- В качестве другого примера, эта проблема также будет существовать в этом другом так, вопрос: Sample http range request session
TL; DR
GET /uri HTTP/1.1
Host: example.com
Accept: text/html; q=1.0, text/plain; q=0.8, */*; q=0.1
Accept-Language: en; q=1.0, */*; q=0.1
Range: 100-200
В приведенном выше описании, диапазон относится и к которым представление запросил ресурс ?!