当我将码头发行版从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=-}
根据我的理解,标题中有一个非法字符,但为什么一个版本抛出此错误而另一个版本没有?
我也使用Apache httpclient 4.4.1发送数据。
答案 0 :(得分:19)
从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: Section 3.2 - Header Fields,您会看到标题字段声明为...
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: Appendix B - Collected ABNF中将token
定义为......
tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." /
"^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
token = 1*tchar
表示" "
中的"Info Header:"
(空格)符合规范无效。
最好是"Info-Header"
或更准确地遵循规范"X-Info-Header"
(以免与规范保留的标题名称冲突)