java - 升级到 Jetty 9.3 后 header 解析错误

标签 java http jetty war

当我将 Jetty 发行版从 9.2 更改为 9.3 时遇到问题。在 9.2 下,我的应用程序运行完美,但是当运行相同的 war 文件并从同一客户端连接时,我在 9.3 下运行时收到以下错误消息:

015-08-30 14:55:32.174:WARN:oejh.HttpParser:qtp1100439041-12: Illegal character 0x20 in state=HEADER_IN_NAME for buffer HeapByteBuffer@26dab36[p=62,l=654,c=8192,r=592]={POST /api/v1/time...0.1:8080\r\nKey <<<Info Header: ...erica/Toronto"}>>>\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00...\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00}

2015-08-30 14:55:32.175:WARN:oejh.HttpParser:qtp1100439041-12: bad HTTP parsed: 400 Illegal character 0x20 for HttpChannelOverHttp@6765bf81{r=0,c=false,a=IDLE,uri=-}

据我了解, header 中存在非法字符,但是为什么一个版本会抛出此错误而另一个版本却不会?

此外,我正在使用 Apache httpclient 4.4.1 发送数据。

最佳答案

从 Jetty 9.2 升级到 9.3 意味着您进入了 HTTP/1.1 更新规范和 rfc 的新世界,以及新的 HTTP/2 要求,甚至包括对 HTTP/1.1 的更改以支持 HTTP/2 升级 (h2c) .

Jetty 9.2 遵循 RFC2616(现已废弃:RFC7230、RFC7231、RFC7232、RFC7233、RFC7234、RFC7235,更新:RFC2817、RFC5785、RFC6266、RFC6585)

Jetty 9.3 遵循对古老的(从 1999 年开始!)RFC2616 规范的更新。许多过去有效的东西不再有效。我们还在 Jetty 9.3 中放弃了对 HTTP/0.9 的支持

整理了 HTTP/1.1 的许多部分以利用更新后的 RFC,其中一些可能对您有所帮助。

查看规范,RFC7230: Section 3.2 - Header Fields ,您会看到 header 字段声明为...

 header-field   = field-name ":" OWS field-value OWS

 field-name     = token
 field-value    = *( field-content / obs-fold )
 field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
 field-vchar    = VCHAR / obs-text

 obs-fold       = CRLF 1*( SP / HTAB )
                ; obsolete line folding
                ; see Section 3.2.4

使用 tokenRFC7230: Appendix B - Collected ABNF 中定义作为...

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

这意味着 "Info Header:" 中的 ""(空格)根据规范无效。

如果它是 "Info-Header" 或更准确地遵循规范为 "X-Info-Header" 会更好(以免与规范保留 header 名称)

关于java - 升级到 Jetty 9.3 后 header 解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32300109/

相关文章:

java 将不可修改的随机访问列表转换为数组

java - 在 Java 中将位 vector ( boolean 数组)转换为整数,并将整数转换为位 vector

java - 自定义 HashMap 代码问题

json - 无法将特殊字符发布到对话流查询中

java - 将字符集添加到响应 header

http - 我可以在 Authorization header 中同时使用 Basic 和 Bearer 吗?

java - 使用 Jetty 从 jarfile 提供静态内容?

java - jetty 不关闭连接

jetty - 如何在 Jetty 7 中启用响应时间日志记录

java - Maven 嵌套依赖项不可访问