0

我正在编写一个简单的 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,这是根据我在 accept 标头值中看不到 MIME 类型 application/pdf 的事实来判断的。

然而,当我发送 pdf 的字节以及设置为 application/pdf 的内容类型时,浏览器会神奇地显示它。

那么,我错过了什么?我原本以为浏览器可能会对 URI 做一些基本的推断,看看它是否以 .pdf 结尾,然后接受相应的 MIME 类型。

但是,当我通过指向 pdf 的链接访问它时,Accept 标头保持不变。

任何帮助将非常感激。

4

1 回答 1

1

我正在编写一个简单的 HTTP 服务器

然后,您应该学习如何绕过描述 HTTP 的各种 RFC。

此处相关的是RFC 7231, 5.3.2。接受

如果请求中存在标头字段,并且响应的所有可用表示都没有被列为可接受的媒体类型,则源服务器可以通过发送 406(不可接受)响应来尊重标头字段或忽略标头通过将响应视为不受内容协商的影响来处理字段。

原则上,浏览器希望显示 HTML 格式的文档,对于服务器愿意提供的 (X)HTML 的任何变体,因此默认情况下它会发送您观察到的接受标头。

但是,如果请求是针对另一种资源的,则服务器可以自由地使用该类型的内容进行响应。

于 2017-10-30T11:30:08.120 回答