Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 区块末尾出现意外内容-是什么构建了损坏的流?_Java_Spring_Http_Tomcat_Chunked Encoding - Fatal编程技术网

Java 区块末尾出现意外内容-是什么构建了损坏的流?

Java 区块末尾出现意外内容-是什么构建了损坏的流?,java,spring,http,tomcat,chunked-encoding,Java,Spring,Http,Tomcat,Chunked Encoding,我遇到了一个返回大约900k XML的端点。我时不时地(在今天的测试中不到5000分之一)会收到一个格式错误的chunkcodingException 这是从一个相当古老的webapp(大约10年)开始的,它建立在spring3上。我转而直接使用RestTemplate而不是httpclient,但这并没有解决它。今天在httpclient上启用了线级日志记录,运行了几个小时之后,我成功地捕获了一个 Caused by: org.apache.http.MalformedChunkCodingE

我遇到了一个返回大约900k XML的端点。我时不时地(在今天的测试中不到5000分之一)会收到一个格式错误的chunkcodingException

这是从一个相当古老的webapp(大约10年)开始的,它建立在spring3上。我转而直接使用RestTemplate而不是httpclient,但这并没有解决它。今天在httpclient上启用了线级日志记录,运行了几个小时之后,我成功地捕获了一个

Caused by: org.apache.http.MalformedChunkCodingException: Unexpected content at the end of chunk
    at org.apache.http.impl.io.ChunkedInputStream.getChunkSize(ChunkedInputStream.java:259)
    at org.apache.http.impl.io.ChunkedInputStream.nextChunk(ChunkedInputStream.java:227)
    at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:186)
    at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:137)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.Reader.read(Reader.java:140)
    at org.springframework.util.StreamUtils.copyToString(StreamUtils.java:74)
    at org.springframework.http.converter.StringHttpMessageConverter.readInternal(StringHttpMessageConverter.java:85)
    at org.springframework.http.converter.StringHttpMessageConverter.readInternal(StringHttpMessageConverter.java:40)
    at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:153)
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:103)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:724)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:709)
通常情况下,日志似乎如下所示:

DEBUG org.apache.http.wire - << "words words words"
DEBUG org.apache.http.wire - << "[\r][\n]"
DEBUG org.apache.http.wire - << "FAF[\r][\n]"
DEBUG org.apache.http.wire - << "words words words up to FAF bytes" 
DEBUG org.apache.http.wire - << "[\r][\n]"
DEBUG org.apache.http.wire - << "BAA[\r][\n]"
DEBUG org.apache.http.wire - << "words words words up to BAA bytes"

DEBUG org.apache.http.wire-正如您所说,该应用程序非常旧。您可能需要更新所有库版本,希望该问题已在某处检测到并修复

但是找到一个坏演员会有帮助,因为你只需要解决这个问题

根据我自己在HTTP工具中测试糟糕语法支持的经验,我非常确定Haproxy是您列出的元素中更健壮的元素。但这并不排除其中的一个问题


发送和接收端点之间的每个HTTP参与者都可以更改HTTP主体(修改区块大小),因此您需要捕获所有参与者(spring、tomcat、haproxy、任何其他代理和/或反向代理、负载平衡器、ssl终止器)的输入和输出,以检测坏区块。我将从消息发射器开始,即XML端点。我会使用wireshark/pcap/httpdump,这是真正捕获TCP和HTTP流量的东西。但是,您可能必须找到一种方法,在达到失败点之前快速丢弃捕获,因为1/5000意味着您有很大的风险捕获大量数据。

我已经花了一个月的大部分时间运行了针对这一点的测试。虽然我没有100%确定的答案,但我发现:

使用haproxy 1.7.x版运行时,我无法触发错误

使用haproxy 2.0.x版运行时,我偶尔会触发错误

它可能与此有关,也可能与此无关:

DEBUG org.apache.http.wire - << "words words words"
DEBUG org.apache.http.wire - << "[\r][\n]"
DEBUG org.apache.http.wire - << "B50[\r][\n]"
DEBUG org.apache.http.wire - << "words words words up to B50 bytes"
DEBUG org.apache.http.wire - << "3FC0[\r][\n]"