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

时间:2017-10-30 11:23:16

标签: http http-headers httpserver http-accept-header

我正在编写一个简单的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

正如您所看到的,接受标头未指定它将接受pdf,因为我无法在accept标头值中看到MIME类型application / pdf。

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

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

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

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:1)

  

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

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

此处的相关内容为RFC 7231, 5.3.2. Accept

  

如果标题字段是      出现在请求中,并且没有任何可用的表示形式      响应的媒体类型列为可接受的,      原始服务器可以通过发送406(不是      可接受的)响应或忽略标题字段通过处理      回应好像不受内容协商的影响。

原则上,浏览器希望显示HTML格式的文档,无论服务器愿意为哪种(X)HTML提供服务,所以默认情况下它会发送您观察到的接受标头。

如果请求是针对其他类型的资源,则服务器可以自由回复该类型的内容。