You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2010/05/11 21:49:39 UTC

svn commit: r943247 - in /httpcomponents/httpclient/trunk/httpclient/src: main/java/org/apache/http/impl/client/ test/java/org/apache/http/client/protocol/

Author: olegk
Date: Tue May 11 19:49:38 2010
New Revision: 943247

URL: http://svn.apache.org/viewvc?rev=943247&view=rev
Log:
HTTPCLIENT-939: 302 without redirect location should not cause a protocol exception

Modified:
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultRedirectStrategy.java
    httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/protocol/TestRedirects.java

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java?rev=943247&r1=943246&r2=943247&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java Tue May 11 19:49:38 2010
@@ -47,6 +47,7 @@ import org.apache.http.HttpEntity;
 import org.apache.http.auth.AuthSchemeRegistry;
 import org.apache.http.client.AuthenticationHandler;
 import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.RedirectHandler;
 import org.apache.http.client.RedirectStrategy;
 import org.apache.http.client.RequestDirector;
 import org.apache.http.client.ResponseHandler;
@@ -153,6 +154,7 @@ import org.apache.http.protocol.Immutabl
  * @since 4.0
  */
 @ThreadSafe
+@SuppressWarnings("deprecation")
 public abstract class AbstractHttpClient implements HttpClient {
 
     private final Log log = LogFactory.getLog(getClass());
@@ -269,7 +271,7 @@ public abstract class AbstractHttpClient
 
 
     @Deprecated
-    protected abstract org.apache.http.client.RedirectHandler createRedirectHandler();
+    protected abstract RedirectHandler createRedirectHandler();
 
 
     protected abstract AuthenticationHandler createTargetAuthenticationHandler();
@@ -391,7 +393,7 @@ public abstract class AbstractHttpClient
 
 
     @Deprecated
-    public synchronized final org.apache.http.client.RedirectHandler getRedirectHandler() {
+    public synchronized final RedirectHandler getRedirectHandler() {
         return createRedirectHandler();
     }
 
@@ -404,10 +406,9 @@ public abstract class AbstractHttpClient
     /**
      * @since 4.1
      */
-    @SuppressWarnings("deprecation")
     public synchronized final RedirectStrategy getRedirectStrategy() {
         if (redirectStrategy == null) {
-            redirectStrategy = new DefaultRedirectStrategyAdaptor(createRedirectHandler());
+            redirectStrategy = new DefaultRedirectStrategy();
         }
         return redirectStrategy;
     }

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultRedirectStrategy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultRedirectStrategy.java?rev=943247&r1=943246&r2=943247&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultRedirectStrategy.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultRedirectStrategy.java Tue May 11 19:49:38 2010
@@ -76,11 +76,14 @@ public class DefaultRedirectStrategy imp
         }
 
         int statusCode = response.getStatusLine().getStatusCode();
+        String method = request.getRequestLine().getMethod();
+        Header locationHeader = response.getFirstHeader("location");
         switch (statusCode) {
         case HttpStatus.SC_MOVED_TEMPORARILY:
+            return (method.equalsIgnoreCase(HttpGet.METHOD_NAME)
+                || method.equalsIgnoreCase(HttpHead.METHOD_NAME)) && locationHeader != null;
         case HttpStatus.SC_MOVED_PERMANENTLY:
         case HttpStatus.SC_TEMPORARY_REDIRECT:
-            String method = request.getRequestLine().getMethod();
             return method.equalsIgnoreCase(HttpGet.METHOD_NAME)
                 || method.equalsIgnoreCase(HttpHead.METHOD_NAME);
         case HttpStatus.SC_SEE_OTHER:

Modified: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/protocol/TestRedirects.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/protocol/TestRedirects.java?rev=943247&r1=943246&r2=943247&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/protocol/TestRedirects.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/protocol/TestRedirects.java Tue May 11 19:49:38 2010
@@ -304,6 +304,44 @@ public class TestRedirects extends Basic
     }
 
     @Test
+    public void testBasicRedirect302NoLocation() throws Exception {
+        InetSocketAddress address = this.localServer.getServiceAddress();
+        int port = address.getPort();
+        String host = address.getHostName();
+        this.localServer.register("*", new HttpRequestHandler() {
+
+            public void handle(
+                    final HttpRequest request, 
+                    final HttpResponse response,
+                    final HttpContext context) throws HttpException, IOException {
+                response.setStatusCode(HttpStatus.SC_MOVED_TEMPORARILY);
+            }
+            
+        });
+
+        DefaultHttpClient client = new DefaultHttpClient();
+        HttpContext context = new BasicHttpContext();
+
+        HttpGet httpget = new HttpGet("/oldlocation/");
+
+        HttpResponse response = client.execute(getServerHttp(), httpget, context);
+        HttpEntity e = response.getEntity();
+        if (e != null) {
+            e.consumeContent();
+        }
+
+        HttpRequest reqWrapper = (HttpRequest) context.getAttribute(
+                ExecutionContext.HTTP_REQUEST);
+        HttpHost targetHost = (HttpHost) context.getAttribute(
+                ExecutionContext.HTTP_TARGET_HOST);
+
+        Assert.assertEquals(HttpStatus.SC_MOVED_TEMPORARILY, response.getStatusLine().getStatusCode());
+        Assert.assertEquals("/oldlocation/", reqWrapper.getRequestLine().getUri());
+        Assert.assertEquals(host, targetHost.getHostName());
+        Assert.assertEquals(port, targetHost.getPort());
+    }
+
+    @Test
     public void testBasicRedirect303() throws Exception {
         InetSocketAddress address = this.localServer.getServiceAddress();
         int port = address.getPort();