当我的浏览器没有指定它会接受的内容时,它如何显示 pdf?

How does my browser display a pdf when it didn't specify that's something it would accept?

我正在编写一个简单的 HTTP 服务器,它将提供来自文件系统的内容。

我对客户端和服务器如何协商内容类型有点困惑。

经过一些研究,我发现 Content-Type 指定了正在发送的 HTTP 消息的内容类型,而 Accept header 指定了程序期望接收的响应。

当我从浏览器访问我的服务器并读取初始 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 header 没有指定它将接受 pdf,根据我在 accept [=32] 中看不到 MIME 类型 application/pdf 的事实来判断=]值。

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

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

但是,当我使用 link 访问 pdf 时,接受 header 保持不变。

任何帮助将不胜感激。

I'm writing a simple HTTP server

那么您应该学会在描述 HTTP 的各种 RFC 中寻找出路。

这里相关的是RFC 7231, 5.3.2. Accept:

If the header field is present in a request and none of the available representations for the response have a media type that is listed as acceptable, the origin server can either honor the header field by sending a 406 (Not Acceptable) response or disregard the header field by treating the response as if it is not subject to content negotiation.

浏览器原则上想要显示 HTML-formatted 文档,对于服务器愿意提供的 (X)HTML 的任何变体,因此默认情况下它发送接受 header你观察到了。

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