Hi Mark, I’m uploading some test files |
GetPayloadServlet.java
Description: Binary data
HttpPostTest.java
Description: Binary data
web.xml
Description: XML document
Below are the steps: 1. compile GetPayloadServlet.java and put it to webapps/test/WEB-INF/classes/test/ 2. put web.xml to webapps/test/WEB-INF/ 3. start tomcat (9.0.19), I tried with 9.0.53, I got the same result 4. use HttpPostTest(I’m using Apache httpclient-4.5.1.jar, httpcore-4.4.4.jar), the test is sending data with chunked transfer-encoding, one step here 4.1. put a debug point before streamWrite at flushBuffer method in org.apache.http.impl.io.SessionOutputBufferImpl, the purpose is to pause flushing to the socket private void flushBuffer() throws IOException { final int len = this.buffer.length(); if (len > 0) { streamWrite(this.buffer.buffer(), 0, len); this.buffer.clear(); this.metrics.incrementBytesTransferred(len); } } 5. put a debug point on GetPayloadServlet @Override public void onDataAvailable() throws IOException { byte buffer[] = new byte[BUFFER_SIZE]; while(inputStream.isReady()) { // when isReady returns true, inputStream.read(buffer) is actually blocked with chunked encoding int read = inputStream.read(buffer); if (read < 0) { break; } bos.write(buffer, 0, read); } } 6. we can see once SessionOutputBufferImpl.flushBuffer flushes the data, inputStream.read(buffer) inside GetPayloadServlet will be un-blocked with read Or am I doing something wrong? this is a basic use case. Thanks, Andrew
|