Return-Path: X-Original-To: apmail-hc-dev-archive@www.apache.org Delivered-To: apmail-hc-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 2584C19D1E for ; Mon, 25 Apr 2016 15:04:13 +0000 (UTC) Received: (qmail 11293 invoked by uid 500); 25 Apr 2016 15:04:13 -0000 Delivered-To: apmail-hc-dev-archive@hc.apache.org Received: (qmail 11256 invoked by uid 500); 25 Apr 2016 15:04:13 -0000 Mailing-List: contact dev-help@hc.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "HttpComponents Project" Delivered-To: mailing list dev@hc.apache.org Received: (qmail 11245 invoked by uid 99); 25 Apr 2016 15:04:12 -0000 Received: from arcas.apache.org (HELO arcas) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 25 Apr 2016 15:04:12 +0000 Received: from arcas.apache.org (localhost [127.0.0.1]) by arcas (Postfix) with ESMTP id D54F02C1F5D for ; Mon, 25 Apr 2016 15:04:12 +0000 (UTC) Date: Mon, 25 Apr 2016 15:04:12 +0000 (UTC) From: "Tobias Oberlies (JIRA)" To: dev@hc.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Commented] (HTTPCLIENT-1188) HTTP client does not monitor connection for error status while sending request body MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ 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-unsubscribe@hc.apache.org For additional commands, e-mail: dev-help@hc.apache.org