Header 升级到 Jetty 9.3 后解析错误

Header parse error after upgrade to Jetty 9.3

我在将 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 要求,甚至包括对 [=35= .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:" 中的 " " (space) 根据规范无效。

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