You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ol...@apache.org on 2005/08/08 22:40:17 UTC
svn commit: r230882 - in /jakarta/commons/proper/httpclient/trunk/src:
java/org/apache/commons/httpclient/HttpMethodBase.java
test/org/apache/commons/httpclient/TestResponseHeaders.java
Author: olegk
Date: Mon Aug 8 13:40:11 2005
New Revision: 230882
URL: http://svn.apache.org/viewcvs?rev=230882&view=rev
Log:
PR #35085 (An HTTP "204 NO CONTENT" response results in dropped connection)
Contributed by Ian Bray <Ian.Bray at logicacmg.com>
Reviewed by Oleg Kalnichevski & Michael Becke
Modified:
jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodBase.java
jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/TestResponseHeaders.java
Modified: jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodBase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodBase.java?rev=230882&r1=230881&r2=230882&view=diff
==============================================================================
--- jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodBase.java (original)
+++ jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodBase.java Mon Aug 8 13:40:11 2005
@@ -1673,6 +1673,7 @@
if (Wire.CONTENT_WIRE.enabled()) {
is = new WireLogInputStream(is, Wire.CONTENT_WIRE);
}
+ boolean canHaveBody = canResponseHaveBody(statusLine.getStatusCode());
InputStream result = null;
Header transferEncodingHeader = responseHeaders.getFirstHeader("Transfer-Encoding");
// We use Transfer-Encoding if present and ignore Content-Length.
@@ -1711,15 +1712,16 @@
} else {
long expectedLength = getResponseContentLength();
if (expectedLength == -1) {
- Header connectionHeader = responseHeaders.getFirstHeader("Connection");
- String connectionDirective = null;
- if (connectionHeader != null) {
- connectionDirective = connectionHeader.getValue();
- }
- if (this.effectiveVersion.greaterEquals(HttpVersion.HTTP_1_1) &&
- !"close".equalsIgnoreCase(connectionDirective)) {
- LOG.info("Response content length is not known");
- setConnectionCloseForced(true);
+ if (canHaveBody && this.effectiveVersion.greaterEquals(HttpVersion.HTTP_1_1)) {
+ Header connectionHeader = responseHeaders.getFirstHeader("Connection");
+ String connectionDirective = null;
+ if (connectionHeader != null) {
+ connectionDirective = connectionHeader.getValue();
+ }
+ if (!"close".equalsIgnoreCase(connectionDirective)) {
+ LOG.info("Response content length is not known");
+ setConnectionCloseForced(true);
+ }
}
result = is;
} else {
@@ -1728,7 +1730,7 @@
}
// See if the response is supposed to have a response body
- if (!canResponseHaveBody(statusLine.getStatusCode())) {
+ if (!canHaveBody) {
result = null;
}
// if there is a result - ALWAYS wrap it in an observer which will
Modified: jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/TestResponseHeaders.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/TestResponseHeaders.java?rev=230882&r1=230881&r2=230882&view=diff
==============================================================================
--- jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/TestResponseHeaders.java (original)
+++ jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/TestResponseHeaders.java Mon Aug 8 13:40:11 2005
@@ -363,4 +363,45 @@
method.shouldCloseConnection(connectionManager.getConection()));
assertFalse("Connection should NOT be closed", method.isConnectionCloseForced());
}
+
+ public void testNoContent() throws Exception {
+ // test with connection header
+ this.server.setRequestHandler(new HttpRequestHandler() {
+ public boolean processRequest(SimpleHttpServerConnection conn,
+ SimpleRequest request) throws IOException {
+ ResponseWriter out = conn.getWriter();
+ out.println("HTTP/1.1 204 NO CONTENT");
+ out.println();
+ out.flush();
+ return true;
+ }
+ });
+
+ GetMethod method = new GetMethod("/");
+ client.executeMethod(method);
+ method.getResponseBodyAsString();
+
+ assertTrue(connectionManager.getConection().isOpen());
+
+ // test without connection header
+ this.server.setRequestHandler(new HttpRequestHandler() {
+ public boolean processRequest(SimpleHttpServerConnection conn,
+ SimpleRequest request) throws IOException {
+ ResponseWriter out = conn.getWriter();
+ out.println("HTTP/1.1 204 NO CONTENT");
+ out.println("Connection: keep-alive");
+ out.println();
+ out.flush();
+ return true;
+ }
+ });
+
+ // test with connection header
+ method = new GetMethod("/");
+ client.executeMethod(method);
+ method.getResponseBodyAsString();
+
+ assertTrue(connectionManager.getConection().isOpen());
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org