【问题标题】:Illegal characters in HTTP headersHTTP 标头中的非法字符
【发布时间】:2013-10-02 09:52:35
【问题描述】:

我正在创建一个HttpUrlConnection,需要设置多个自定义标头。

我想按照以下方式做一些事情,但标题映射的内容需要来自单个字符串。 HTTP 标头名称和 HTTP 标头值中是否存在非法或极少使用的字符?

HashMap<String, String> headers = new HashMap<String, String>();

// TODO: How can I fill the headers map reliably from a single string?

HttpURLConnection c = (HttpURLConnection) url.openConnection();
for(Map.Entry<String, String> e : headers.entrySet())
    c.setRequestProperty(e.getKey(), e.getValue());

目前的解决方案

似乎没有任何 HTTP 标头名称包含任何空格(通常使用破折号代替?),因此我可以使用单个空格将名称与值分开。至于名称-值集,我似乎搞砸了,因为根据给定的答案,值可以包含几乎任何东西。所以我刚刚选择了一个我很确定很可能永远不会使用的字符:§。如果事实证明确实需要它,我只需要调整我的代码:p

Header1 Value1§Header2 Value2§Header3 Header3

【问题讨论】:

标签: java http http-headers


【解决方案1】:

来自RFC7230的相关BNF是:

field-name = token

token = 1*tchar

tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / 
        "." / "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA

字符集是可见的 USASCII。

RFC 7230 比您的问题更新,但在相关细节中,它不会改变 RFC 2616 以前所说的内容。

字段名称有一个非常严格的约定,它比 RFC 允许的限制要严格得多,并且在不同的实现中不同程度地强制执行。字段名称通常遵循 [ASCII / NUMERAL] 单词序列的模式,每个单词的第一个字母(仅)大写。单词用一个连字符分隔。

因此,例如“HttpUrlConnection”应该是一个 HTTP 标头名称(而不是 java 令牌),您可以将其称为“Http-Url-Connection”。

我依稀记得曾经追踪一个错误,直到某个实现严格到不能在一个单词中承认多个大写字母(这恰好是一个首字母缩略词)。 IE。非常严格地遵循这种更受限制的格式是值得的。

  • 非 ASCII 字符集在字段名称中不起作用,尽管它们可以在字段值中使用。

  • 标准不支持在字段名称中转义。值的转义不是 HTTP 或 MIME 标准所关心的问题,但您可以选择重用标准 URL 编码方法来编码一组名称值对。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2011-07-22
    • 2017-07-12
    • 1970-01-01
    相关资源
    最近更新 更多