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

Posted

技术标签:

【中文标题】HTTP 标头值解析:引用、RFC 5987、MIME 等【英文标题】:Parsing of HTTP Headers Values: Quoting, RFC 5987, MIME, etc 【发布时间】:2012-01-26 10:04:52 【问题描述】:

让我困惑的是 HTTP 标头的解码。

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

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

我正在制作一个透明代理,它需要透明地处理和修改许多 in-the-wild 标头字段。这就是为什么我需要如此详细的格式。

【问题讨论】:

【参考方案1】:

可以引用标题值吗?

如果您的意思是 RFC 5987 parameter 生产适用于标头值的主要部分,那么不。

Some-Header: "foo"; bar*=utf-8'en'bof

这里标头值的主要部分可能是"foo",包括引号,但是...

分号 (;) 有什么意义?

为每个命名的标头分别定义特定的处理。所以分号对于Content-Disposition 很重要,但对于Content-Length 则不重要。

显然这不是一个非常令人满意的解决方案,但这就是我们坚持的问题。

我正在制作一个透明代理,它需要透明地处理和修改许多 in-the-wild 标头字段。

您不能以通用的方式处理这些,您必须知道每个可能的标题的形式。对于您不认识的任何内容,请不要尝试分解标头值;真的,目前支持 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 编码。但现实情况是浏览器也不支持。

【讨论】:

以上是关于HTTP 标头值解析:引用、RFC 5987、MIME 等的主要内容,如果未能解决你的问题,请参考以下文章

如何停止 HTTP(和 rfc822、电子邮件)标头注入?

通过 RFC 5987 处理带有空格的文件名* 参数会导致文件名中出现“+”

如何从 python 中的 RFC 2822 邮件标头中提取多个电子邮件地址?

解析类似电子邮件的标头(类似于 RFC822)

在哪里可以找到所有可能的“连接”标头值?

网上有没有全面的 MIME 标头格式参考?