Как мой браузер отображает PDF, если он не указывает, что это то, что он будет принимать?
Я пишу простой HTTP-сервер, который будет обслуживать контент из файловой системы.
Я немного сбит с толку относительно того, как клиент и сервер согласовывают тип контента.
Проведя некоторые исследования, я обнаружил, что Content-Type определяет тип содержимого отправляемого HTTP-сообщения, а заголовок Accept указывает, что программа ожидает получить в ответ.
Когда я захожу на свой сервер из браузера и читаю начальный запрос GET (при посещении с нулевым URI), я получаю следующее:
GET / HTTP/1.1
Host: 127.0.0.1:1234
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Как вы можете видеть, заголовок accept не указывает, что он будет принимать pdf, судя по тому, что я не могу увидеть application / pdf MIME-типа в значении заголовка accept.
Тем не менее, когда я отправляю pdf-байты вместе с типом контента, установленным в application/pdf, браузер волшебным образом отображает его.
Итак, что мне не хватает? Первоначально я думал, что браузер может сделать какой-то базовый вывод для URI, чтобы увидеть, заканчивает ли он его.pdf, а затем принять соответствующий тип MIME.
Но когда я посещаю его со ссылкой на PDF, заголовок Accept остается прежним.
Любая помощь могла бы быть полезна.
1 ответ
Я пишу простой HTTP-сервер
Затем вы должны научиться ориентироваться в различных RFC, описывающих HTTP.
Соответствующим здесь является RFC 7231, 5.3.2. Принять:
Если поле заголовка присутствует в запросе и ни одно из доступных представлений для ответа не имеет тип мультимедиа, который указан как приемлемый, сервер происхождения может либо удовлетворить поле заголовка, отправив ответ 406 (не приемлемо), либо игнорировать заголовок обработать ответ так, как будто он не подлежит согласованию содержимого.
Браузер в принципе хочет отображать документы в формате HTML для любого варианта (X)HTML, который сервер готов обслуживать, поэтому по умолчанию он отправляет заголовок accept, который вы наблюдали.
Однако, если запрос относится к другому типу ресурса, сервер может ответить этим типом контента.