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 2006/01/07 19:13:21 UTC

svn commit: r366870 - in /jakarta/commons/proper/httpclient/trunk: release_notes.txt src/java/org/apache/commons/httpclient/HttpMethodDirector.java src/test/org/apache/commons/httpclient/TestVirtualHost.java

Author: olegk
Date: Sat Jan  7 10:12:55 2006
New Revision: 366870

URL: http://svn.apache.org/viewcvs?rev=366870&view=rev
Log:
PR #38004 (Explicit VirtualHosts Can Cause Issues On Redirects)

Contributed by Oleg Kalnichevski
Reviewed by Ortwin Glück and Michael Becke


Modified:
    jakarta/commons/proper/httpclient/trunk/release_notes.txt
    jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodDirector.java
    jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/TestVirtualHost.java

Modified: jakarta/commons/proper/httpclient/trunk/release_notes.txt
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/release_notes.txt?rev=366870&r1=366869&r2=366870&view=diff
==============================================================================
--- jakarta/commons/proper/httpclient/trunk/release_notes.txt (original)
+++ jakarta/commons/proper/httpclient/trunk/release_notes.txt Sat Jan  7 10:12:55 2006
@@ -1,9 +1,15 @@
 Changes since Release 3.0:
 
- * 38139 - Calling MultiThreadedHttpConnectionManager.setMaxTotalConnections(int) had no effect
+ * 38004 - Fixed bug causing cyclic redirects when virtual host is set
+           Contributed by Oleg Kalnichevski <olegk at apache.org>
+
+ * 38139 - Calling deprecated MultiThreadedHttpConnectionManager.setMaxTotalConnections(int) 
+           had no effect
+           Contributed by Ortwin Glueck <oglueck at apache.org>
 
  * 37988 - Fixed bug in URI#toString() causing user name / password to 
            stripped from the resultant String
+           Contributed by Oleg Kalnichevski <olegk at apache.org>
 
 Release 3.0 
 -------------------

Modified: jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodDirector.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodDirector.java?rev=366870&r1=366869&r2=366870&view=diff
==============================================================================
--- jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodDirector.java (original)
+++ jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodDirector.java Sat Jan  7 10:12:55 2006
@@ -604,7 +604,10 @@
 					LOG.debug("Redirect URI is not absolute - parsing as relative");
 					redirectUri = new URI(currentUri, redirectUri);
 				}
-			}
+			} else {
+                // Reset the default params
+                method.getParams().setDefaults(this.params);
+            }
             method.setURI(redirectUri);
             hostConfiguration.setHost(redirectUri);
 		} catch (URIException e) {

Modified: jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/TestVirtualHost.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/TestVirtualHost.java?rev=366870&r1=366869&r2=366870&view=diff
==============================================================================
--- jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/TestVirtualHost.java (original)
+++ jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/TestVirtualHost.java Sat Jan  7 10:12:55 2006
@@ -31,12 +31,19 @@
 package org.apache.commons.httpclient;
 
 import java.io.IOException;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.UnknownHostException;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
 import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.params.HttpConnectionParams;
+import org.apache.commons.httpclient.protocol.Protocol;
+import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
 import org.apache.commons.httpclient.server.HttpService;
+import org.apache.commons.httpclient.server.RequestLine;
 import org.apache.commons.httpclient.server.SimpleRequest;
 import org.apache.commons.httpclient.server.SimpleResponse;
 
@@ -121,4 +128,94 @@
             httpget.releaseConnection();
         }
     }
+    
+    private class VirtualHostService implements HttpService {
+
+        public VirtualHostService() {
+            super();
+        }
+
+        public boolean process(final SimpleRequest request, final SimpleResponse response)
+            throws IOException {
+            RequestLine reqline = request.getRequestLine();
+            HttpVersion ver = reqline.getHttpVersion();
+            Header header =  request.getFirstHeader("Host");
+            if (header == null) {
+                response.setStatusLine(ver, HttpStatus.SC_BAD_REQUEST);
+                return true;
+            }
+            String host = header.getValue();
+            if (host.equalsIgnoreCase("whatever.com")) {
+                response.setStatusLine(ver, HttpStatus.SC_MOVED_TEMPORARILY);
+                response.setHeader(new Header("Location", "testhttp://www.whatever.com/"));
+                return true;
+            } else if (host.equalsIgnoreCase("www.whatever.com")) {
+                response.setStatusLine(ver, HttpStatus.SC_MOVED_TEMPORARILY);
+                response.setHeader(new Header("Location", "testhttp://www.whatever.co.nz/"));
+                return true;
+            } else if (host.equalsIgnoreCase("www.whatever.co.nz")) {
+                response.setStatusLine(ver, HttpStatus.SC_OK);
+                return true;
+            } else {
+                response.setStatusLine(ver, HttpStatus.SC_NOT_FOUND);
+                return true;
+            }
+        }
+    }
+    
+    private class VirtualSocketFactory implements ProtocolSocketFactory {
+        
+        private final String hostname;
+        private final int port;
+        
+        public VirtualSocketFactory(final String hostname, int port) {
+            super();
+            this.hostname = hostname;
+            this.port = port;
+        }
+
+        public Socket createSocket(
+                final String host, 
+                int port, 
+                final InetAddress localAddress, 
+                int localPort, 
+                final HttpConnectionParams params) throws IOException, UnknownHostException, ConnectTimeoutException {
+            return new Socket(this.hostname, this.port);
+        }
+
+        public Socket createSocket(String host, int port, InetAddress localAddress, int localPort) throws IOException, UnknownHostException {
+            return new Socket(this.hostname, this.port);
+        }
+
+        public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
+            return new Socket(this.hostname, this.port);
+        }
+        
+    }
+
+    public void testRedirectWithVirtualHost() throws IOException {
+        String host = this.server.getLocalAddress();
+        int port = this.server.getLocalPort();
+
+        Protocol testhttp = new Protocol("http", new VirtualSocketFactory(host, port), port);
+        Protocol.registerProtocol("testhttp", testhttp);
+        try {
+            this.server.setHttpService(new VirtualHostService());
+            this.client.getHostConfiguration().setHost(host, port, "testhttp");
+            this.client.getHostConfiguration().getParams().setVirtualHost("whatever.com");
+            GetMethod httpget = new GetMethod("/");
+            httpget.setFollowRedirects(true);
+            try {
+                this.client.executeMethod(httpget);
+                assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
+                assertEquals("http://www.whatever.co.nz/", httpget.getURI().toString());
+            } finally {
+                httpget.releaseConnection();
+            }
+        } finally {
+            Protocol.unregisterProtocol("testhttp");
+        }
+        
+    }
+    
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org