解析HTTP标头值:引用,RFC 5987,MIME等

时间:2011-12-22 20:31:34

标签: unicode http-headers mime quoting

令我困惑的是解码HTTP标头

示例标题:
Some-Header: "quoted string?"; *utf-8'en'Weirdness

可以引用标题吗? "本身的编码怎么样?是'有效的引用字符?分号(;)有什么意义? HTTP标头的值解析器是否可以被视为MIME解析器?

我正在制作一个透明的代理,需要透明地处理和修改许多野外的头字段。这就是为什么我需要这么多关于格式的细节。

1 个答案:

答案 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编码。但实际情况是浏览器也不支持。