令我困惑的是解码HTTP标头值。
示例标题:
Some-Header: "quoted string?"; *utf-8'en'Weirdness
可以引用标题值吗? "
本身的编码怎么样?是'
有效的引用字符?分号(;
)有什么意义? HTTP标头的值解析器是否可以被视为MIME解析器?
我正在制作一个透明的代理,需要透明地处理和修改许多野外的头字段。这就是为什么我需要这么多关于格式的细节。
答案 0 :(得分:8)
可以引用标题值吗?
如果您的意思是RFC 5987 parameter
生产适用于标头值的主要部分,那么没有。
Some-Header: "foo"; bar*=utf-8'en'bof
此处标题值的主要部分可能是"foo"
,包括引号,但是......
分号(;)有什么意义?
分别为每个命名标题定义特定处理。因此,分号对于Content-Disposition
很重要,但对Content-Length
则不重要。
显然这不是一个非常令人满意的解决方案,但这就是我们所坚持的。
我正在制作一个透明的代理,需要透明地处理和修改许多野外的头字段。
您无法以通用方式处理这些问题,您必须知道每个可能标头的形式。对于您无法识别的任何内容,请勿尝试分解标头值;实际上,目前很少支持RFC 5987,你不太可能对它进行有用的处理。
今天的现状是标题值中的非ASCII字符无法正常使用跨浏览器,无论是编码还是原始。
幸运的是,他们很少需要。唯一真正常见的用例是Content-Disposition
的非ASCII文件名,但通过将文件名放在尾随URL路径部分中更容易解决。
HTTP标头的值解析器是否可以被视为MIME解析器?
没有。 HTTP一般从MIME和RFC 822系列标准中借用,但它不属于822系列。它有自己的标题低级语法,看起来像822,但不太兼容。任意MIME功能都不能在HTTP中使用,必须有一个标准化机制来明确地将它们拖到HTTP中 - 这就是RFC 5987对RFC 2231(部分)的作用。
(有关其他一些差异的讨论,请参见RFC 2616第19.4节。)
理论上,multipart
表单提交是 822系列的一部分,您应该能够在那里使用RFC 2231编码。但实际情况是浏览器也不支持。