[ 
https://issues.apache.org/jira/browse/HTTPCLIENT-1188?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15256448#comment-15256448
 ] 

Tobias Oberlies commented on HTTPCLIENT-1188:
---------------------------------------------

bq. If for whatever reason you cannot use the 'expect-continue' handshaking to 
avoid this problem, ...

This is e.g. the case if the server is a Tomcat: see 
https://bz.apache.org/bugzilla/show_bug.cgi?id=57661


> HTTP client does not monitor connection for error status while sending 
> request body
> -----------------------------------------------------------------------------------
>
>                 Key: HTTPCLIENT-1188
>                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-1188
>             Project: HttpComponents HttpClient
>          Issue Type: Bug
>          Components: HttpClient
>    Affects Versions: 4.1.3
>            Reporter: Benjamin Bentmann
>
> Quoting from http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.2.2:
> bq. An HTTP/1.1 (or later) client sending a message-body SHOULD monitor the 
> network connection for an error status while it is transmitting the request. 
> If the client sees an error status, it SHOULD immediately cease transmitting 
> the body. If the body is being sent using a "chunked" encoding (section 3.6), 
> a zero length chunk and empty trailer MAY be used to prematurely mark the end 
> of the message. If the body was preceded by a Content-Length header, the 
> client MUST close the connection. 
> This is apparently not the case with the HttpClient. While uploading large 
> files (tens of MBs) whose transfer takes notable time (~ 30 sec) we observed 
> the following exceptions (the variation in detail msg are either due to Java 
> version or OS):
> {noformat}
> java.net.SocketException: Broken pipe
>   at java.net.SocketOutputStream.socketWrite0(Native Method)
>   at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
>   at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
>   at 
> com.sun.net.ssl.internal.ssl.OutputRecord.writeBuffer(OutputRecord.java:297)
>   at com.sun.net.ssl.internal.ssl.OutputRecord.write(OutputRecord.java:286)
>   at 
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:743)
>   at 
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:731)
>   at 
> com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
>   at 
> org.apache.http.impl.io.AbstractSessionOutputBuffer.write(AbstractSessionOutputBuffer.java:153)
>   at 
> org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:114)
>   at org.apache.http.entity.FileEntity.writeTo(FileEntity.java:75)
>   at 
> org.apache.http.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:96)
>   at 
> org.apache.http.impl.client.EntityEnclosingRequestWrapper$EntityWrapper.writeTo(EntityEnclosingRequestWrapper.java:108)
>   at 
> org.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:120)
>   at 
> org.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:264)
>   at 
> org.apache.http.impl.conn.AbstractClientConnAdapter.sendRequestEntity(AbstractClientConnAdapter.java:224)
>   at 
> org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:255)
>   at 
> org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
>   at 
> org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:647)
>   at 
> org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:464)
>   at 
> org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
>   
> java.net.SocketException: Connection reset by peer: socket write error
>   at java.net.SocketOutputStream.socketWrite0(Native Method)
>   at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
>   at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
>   at 
> com.sun.net.ssl.internal.ssl.OutputRecord.writeBuffer(OutputRecord.java:297)
>   at com.sun.net.ssl.internal.ssl.OutputRecord.write(OutputRecord.java:286)
>   at 
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:748)
>   at 
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:736)
>   at 
> com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:89)
>   at 
> org.apache.http.impl.io.AbstractSessionOutputBuffer.write(AbstractSessionOutputBuffer.java:153)
>   at 
> org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:114)
>   at org.apache.http.entity.FileEntity.writeTo(FileEntity.java:75)
>   at 
> org.apache.http.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:96)
>   at 
> org.apache.http.impl.client.EntityEnclosingRequestWrapper$EntityWrapper.writeTo(EntityEnclosingRequestWrapper.java:108)
>   at 
> org.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:120)
>   at 
> org.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:264)
>   at 
> org.apache.http.impl.conn.AbstractClientConnAdapter.sendRequestEntity(AbstractClientConnAdapter.java:224)
>   at 
> org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:255)
>   at 
> org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
>   at 
> org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:647)
>   at 
> org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:464)
>   at 
> org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
> {noformat}
> The cause for those is apparently that the server sends an error response 
> before fully consuming the request body sent by the client. The server 
> eventually closes the TCP connection (after having notified the client via 
> FIN and RST) but the client continues to upload and runs into the closed 
> server side.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org

Reply via email to