[
https://issues.apache.org/jira/browse/HTTPCORE-803?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18141226#comment-18141226
]
Arturo Bernal commented on HTTPCORE-803:
----------------------------------------
Hi [~abutkiewicz],
I've proposed a fix for HTTPCORE-803 in
[2b24595a|https://github.com/apache/httpcomponents-core/pull/744].
Could you please review it and test it against your original proxy scenario to
confirm it resolves the issue?
Thanks!
> Chunked encoding: Last chunk is written on failure
> --------------------------------------------------
>
> Key: HTTPCORE-803
> URL: https://issues.apache.org/jira/browse/HTTPCORE-803
> Project: HttpComponents HttpCore
> Issue Type: Bug
> Components: HttpCore
> Reporter: Adam Butkiewicz
> Priority: Minor
> Time Spent: 10m
> Remaining Estimate: 0h
>
> In my proxy (Spring MVC with http components transport) I noticed a chunked
> encoding request streaming failed on reading from client. It was visible as
> 500 in the proxy and as a valid request without a body (even though client
> did send the body) in the underlying server.
> I believe the culprit is "finish()" called during "close()". I'm not sure if
> it is a bug but such behavior is odd. At first glance, I would expect nothing
> more to be written on "close()" so that underying server could detect the
> requets is invalid.
> This is a patch with a test case which demonstrates what I mean:
> {code:java}
> Index:
> httpcore5/src/test/java/org/apache/hc/core5/http/impl/io/TestDefaultBHttpClientConnection.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> diff --git
> a/httpcore5/src/test/java/org/apache/hc/core5/http/impl/io/TestDefaultBHttpClientConnection.java
>
> b/httpcore5/src/test/java/org/apache/hc/core5/http/impl/io/TestDefaultBHttpClientConnection.java
> ---
> a/httpcore5/src/test/java/org/apache/hc/core5/http/impl/io/TestDefaultBHttpClientConnection.java
> (revision 57428d2b8c8e9c087a88258359b7ea353a45d971)
> +++
> b/httpcore5/src/test/java/org/apache/hc/core5/http/impl/io/TestDefaultBHttpClientConnection.java
> (date 1793960803181)
> @@ -28,7 +28,10 @@
>
> import java.io.ByteArrayInputStream;
> import java.io.ByteArrayOutputStream;
> +import java.io.EOFException;
> +import java.io.IOException;
> import java.io.InputStream;
> +import java.io.OutputStream;
> import java.net.Socket;
> import java.nio.charset.StandardCharsets;
>
> @@ -41,6 +44,7 @@
> import org.apache.hc.core5.http.NotImplementedException;
> import org.apache.hc.core5.http.config.Http1Config;
> import org.apache.hc.core5.http.impl.DefaultContentLengthStrategy;
> +import org.apache.hc.core5.http.io.entity.AbstractHttpEntity;
> import org.apache.hc.core5.http.io.entity.ByteArrayEntity;
> import org.apache.hc.core5.http.io.entity.StringEntity;
> import org.apache.hc.core5.http.message.BasicClassicHttpRequest;
> @@ -297,6 +301,59 @@
> "chunked\r\n\r\n3\r\n123\r\n0\r\n\r\n", s);
> }
>
> + @Test
> + void testWriteRequestEntityChunkCodedFailureDoesNotTerminateMessage()
> throws Exception {
> + final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
> + Mockito.when(socket.getOutputStream()).thenReturn(outStream);
> +
> + conn.bind(socket);
> +
> + final ClassicHttpRequest request = new
> BasicClassicHttpRequest(Method.POST, "/stuff");
> + request.addHeader("User-Agent", "test");
> + request.addHeader("Transfer-Encoding", "chunked");
> + request.setEntity(new AbstractHttpEntity(ContentType.TEXT_PLAIN,
> null, true) {
> +
> + @Override
> + public void writeTo(final OutputStream out) throws IOException {
> + out.write("123".getBytes(StandardCharsets.US_ASCII));
> + throw new EOFException("source stream failed");
> + }
> +
> + @Override
> + public InputStream getContent() {
> + throw new UnsupportedOperationException();
> + }
> +
> + @Override
> + public long getContentLength() {
> + return -1;
> + }
> +
> + @Override
> + public boolean isRepeatable() {
> + return false;
> + }
> +
> + @Override
> + public boolean isStreaming() {
> + return true;
> + }
> +
> + @Override
> + public void close() {
> + }
> +
> + });
> +
> + conn.sendRequestHeader(request);
> + Assertions.assertThrows(EOFException.class, () ->
> conn.sendRequestEntity(request));
> +
> + final String s = new String(outStream.toByteArray(),
> StandardCharsets.US_ASCII);
> + final String body = s.substring(s.indexOf("\r\n\r\n") + 4);
> + Assertions.assertFalse(body.endsWith("0\r\n\r\n"),
> + "Incomplete entity must not be sent as a terminated
> chunk-coded message: " + body);
> + }
> +
> @Test
> void testWriteRequestEntityNoContentLength() throws Exception {
> final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
> {code}
>
>
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]