java - HTTP header 中的非法字符

标签 java http http-headers

我正在创建一个 HttpUrlConnection 并且需要设置多个自定义 header 。

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

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 header 名称都不包含任何空格(通常使用破折号代替?),因此我可以使用单个空格将名称与值分隔开。至于名称-值集,我似乎搞砸了,因为根据给定的答案,该值几乎可以包含任何内容。所以我刚刚选择了一个我很确定很可能永远不会使用的字符:§。如果事实证明确实需要它,我只需要调整我的代码即可:p

Header1 Value1§Header2 Value2§Header3 Header3

最佳答案

来自 RFC7230 的相关 BNF是:

field-name = token

token = 1*tchar

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

字符集可见USASCII。

RFC 7230 比你的问题更新,但在相关细节上,它并没有改变 RFC 2616 之前所说的内容。

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

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

我依稀记得有一次跟踪一个 bug 是因为某些实现足够严格,不允许一个单词(恰好是首字母缩写词)中有多个大写字母。 IE。非常严格地遵循这种更受限制的格式是值得的。

  • 非 ASCII 字符集在字段名称中不起任何作用,但它们可能会在字段值中使用。

  • 标准不支持字段名称转义。转义值不是 HTTP 或 MIME 标准的关注点,但您可以选择重用标准 URL 编码方法来对一组名称值对进行编码。

关于java - HTTP header 中的非法字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19028068/

相关文章:

java - chrome 不允许 localhost 来源

http - nginx如何获取$http_upgrade的值

PHP - 引用重定向脚本

java - 在 IntelliJ 中创建 Java 包

java - 对象化 : Use an entity key juste created

javascript - 客户端调用的 api 方法内的 HTTP GET

java - getImage() 性能

c# - 传输大文件 : combining streamed transfer and content-length

ruby - 如何阻止 sinatra 重写我的标题名称?

java - H2 org.h2.jdbc.JdbcSQLException 与正确的 DDL sql : error code = [42000-196]