Jetty 过早结束分块响应
Jetty ends chunked response too soon
Spring REST API(与 Jackson)运行 在 EC2 Linux 机器上 java 1.8.0_65
,在 jetty-distribution-9.3.0.v20150612
服务器上。
大多数 API 调用都运行良好,但有时我的客户(移动应用程序/curl)收到错误响应 - curl: (18) transfer closed with outstanding read data remaining
。它在本地和远程 Jetty 机器上复制,有或没有压缩和 SSL。
我已经使用 Wireshark 捕获了通信,看起来在发送 1414 字节的块时,突然(在发送整个 JSON 内容之前)有一个较小的块设置了 FIN 标志。
什么会导致块流过早结束?
更新
经过多次分而治之,我在响应对象中发现了一个 表情符号 可能会导致问题。
但奇怪的是,在不删除字符的情况下更改该字符串中的任何数据都会导致此方法起作用。好像不是字符本身,而是它在字符串中的位置。
目前响应对象通过spring-webmvc:4.1.7
自动序列化为JSON,当手动序列化并发送该对象时它可以工作。持有emoji注解@JsonRawValue
的数据成员,其值已经序列化为JSON.
表情符号字符未在 JSON 响应中转义。
由于包含此表情符号的数据成员未被 Spring MVC 序列化程序处理,它作为原始字符串发送到 JSON 对象中,因此使用一种方法手动将其转义' 处理一整套 unicode 字符。
用 commons-lang3:3.3.2
库中提供的 Apache StringEscapeUtils.escapeJson(..)
替换手动转义方法解决了这个问题。
Spring REST API(与 Jackson)运行 在 EC2 Linux 机器上 java 1.8.0_65
,在 jetty-distribution-9.3.0.v20150612
服务器上。
大多数 API 调用都运行良好,但有时我的客户(移动应用程序/curl)收到错误响应 - curl: (18) transfer closed with outstanding read data remaining
。它在本地和远程 Jetty 机器上复制,有或没有压缩和 SSL。
我已经使用 Wireshark 捕获了通信,看起来在发送 1414 字节的块时,突然(在发送整个 JSON 内容之前)有一个较小的块设置了 FIN 标志。
什么会导致块流过早结束?
更新
经过多次分而治之,我在响应对象中发现了一个 表情符号 可能会导致问题。
但奇怪的是,在不删除字符的情况下更改该字符串中的任何数据都会导致此方法起作用。好像不是字符本身,而是它在字符串中的位置。
目前响应对象通过spring-webmvc:4.1.7
自动序列化为JSON,当手动序列化并发送该对象时它可以工作。持有emoji注解@JsonRawValue
的数据成员,其值已经序列化为JSON.
表情符号字符未在 JSON 响应中转义。
由于包含此表情符号的数据成员未被 Spring MVC 序列化程序处理,它作为原始字符串发送到 JSON 对象中,因此使用一种方法手动将其转义' 处理一整套 unicode 字符。
用 commons-lang3:3.3.2
库中提供的 Apache StringEscapeUtils.escapeJson(..)
替换手动转义方法解决了这个问题。