我正在编写一个简单的 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,根据我在接受标头值中看不到 MIME 类型 application/pdf 的事实来判断。
然而,当我发送 pdf 的字节以及设置为 application/pdf 的内容类型时,浏览器会神奇地显示它。
那么,我错过了什么?我原本以为浏览器可能会对URI做一些基本的推断,看看它是否以.pdf结尾,然后接受相应的MIME类型。
但是,当我通过 pdf 链接访问它时,Accept 标头保持不变。
任何帮助将非常感激。
我正在编写一个简单的 HTTP 服务器
然后,您应该学习如何绕过描述 HTTP 的各种 RFC。
这里相关的是RFC 7231, 5.3.2。接受:
如果请求中存在标头字段并且响应的可用表示都没有列为可接受的媒体类型,则源服务器可以通过发送 406(不可接受)响应来接受标头字段或忽略标头字段,将响应视为不受内容协商的影响。
原则上,浏览器希望显示 HTML 格式的文档,无论服务器愿意提供何种 (X)HTML 变体,因此默认情况下它会发送您观察到的接受标头。
但是,如果请求是针对另一种资源,则服务器可以自由地响应该类型的内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句