升级到Jetty 9.3后的标头解析错误

当我将docker发行版从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 <<>>\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=-}

根据我的理解,标题中有一个非法字符,但为什么一个版本抛出此错误而另一个版本没有?

我也使用Apache httpclient 4.4.1发送数据。

从Jetty 9.2升级到9.3意味着您进入了HTTP / 1.1更新规范和rfcs的新世界,以及新的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:第3.2节 – 标题字段 ,您会看到标题字段声明为…

  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 

使用RFC7230中定义的令牌:附录B – 收集ABNF为……

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

这意味着"Info Header:"中的" " (空格)对于每个规范都是无效的。

如果它是"Info-Header"或更准确地遵循规范作为"X-Info-Header" (以便不与规范保留的标题名称冲突)会更好