2015-02-02 4 views
0

Как работает заголовок 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 

В приведенном выше описании, диапазон относится и к которым представление запросил ресурс ?!

ответ

0

Короткий ответ: не используйте запрос диапазона без поля соответствия If-Match: etag.

Смежные вопросы