Author: jochen
Date: Sun Feb 11 12:53:31 2007
New Revision: 506132

URL: http://svn.apache.org/viewvc?view=rev&rev=506132
Log:
Added support for redirects.
PR: XMLRPC-133
Submitted-by: Andrew Norman, [EMAIL PROTECTED]

Modified:
    
webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/XmlRpcCommonsTransport.java
    webservices/xmlrpc/trunk/pom.xml
    webservices/xmlrpc/trunk/src/changes/changes.xml

Modified: 
webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/XmlRpcCommonsTransport.java
URL: 
http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/XmlRpcCommonsTransport.java?view=diff&rev=506132&r1=506131&r2=506132
==============================================================================
--- 
webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/XmlRpcCommonsTransport.java
 (original)
+++ 
webservices/xmlrpc/trunk/client/src/main/java/org/apache/xmlrpc/client/XmlRpcCommonsTransport.java
 Sun Feb 11 12:53:31 2007
@@ -25,7 +25,10 @@
 import org.apache.commons.httpclient.Header;
 import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.HttpStatus;
 import org.apache.commons.httpclient.HttpVersion;
+import org.apache.commons.httpclient.URI;
+import org.apache.commons.httpclient.URIException;
 import org.apache.commons.httpclient.UsernamePasswordCredentials;
 import org.apache.commons.httpclient.auth.AuthScope;
 import org.apache.commons.httpclient.methods.PostMethod;
@@ -44,6 +47,11 @@
  * HTTP Client.
  */
 public class XmlRpcCommonsTransport extends XmlRpcHttpTransport {
+    /**
+     * Maximum number of allowed redirects.
+     */
+    private static final int MAX_REDIRECT_ATTEMPTS = 100;
+
     protected final HttpClient client;
        private static final String userAgent = USER_AGENT + " (Jakarta Commons 
httpclient Transport)";
        protected PostMethod method;
@@ -139,7 +147,43 @@
                }
        }
 
-       protected void writeRequest(final ReqWriter pWriter) throws 
XmlRpcException {
+       protected boolean isRedirectRequired() {
+           switch (method.getStatusCode()) {
+               case HttpStatus.SC_MOVED_TEMPORARILY:
+               case HttpStatus.SC_MOVED_PERMANENTLY:
+               case HttpStatus.SC_SEE_OTHER:
+               case HttpStatus.SC_TEMPORARY_REDIRECT:
+                   return true;
+               default:
+                   return false;
+           }
+       }
+
+       protected void resetClientForRedirect()
+            throws XmlRpcException {
+           //get the location header to find out where to redirect to
+           Header locationHeader = method.getResponseHeader("location");
+           if (locationHeader == null) {
+            throw new XmlRpcException("Invalid redirect: Missing location 
header");
+           }
+           String location = locationHeader.getValue();
+
+           URI redirectUri = null;
+           URI currentUri = null;
+           try {
+               currentUri = method.getURI();
+               String charset = currentUri.getURI();
+               redirectUri = new URI(location, true, charset);
+               method.setURI(redirectUri);
+           } catch (URIException ex) {
+            throw new XmlRpcException(ex.getMessage(), ex);
+           }
+
+           //And finally invalidate the actual authentication scheme
+           method.getHostAuthState().invalidate();
+    }
+
+    protected void writeRequest(final ReqWriter pWriter) throws 
XmlRpcException {
                method.setRequestEntity(new RequestEntity(){
                        public boolean isRepeatable() { return contentLength != 
-1; }
                        public void writeRequest(OutputStream pOut) throws 
IOException {
@@ -173,7 +217,17 @@
                        public String getContentType() { return "text/xml"; }
                });
                try {
-                       client.executeMethod(method);
+            int redirectAttempts = 0;
+            for (;;) {
+                       client.executeMethod(method);
+                if (!isRedirectRequired()) {
+                    break;
+                }
+                if (redirectAttempts++ > MAX_REDIRECT_ATTEMPTS) {
+                    throw new XmlRpcException("Too many redirects.");
+                }
+                resetClientForRedirect();
+            }
                } catch (XmlRpcIOException e) {
                        Throwable t = e.getLinkedException();
                        if (t instanceof XmlRpcException) {

Modified: webservices/xmlrpc/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/pom.xml?view=diff&rev=506132&r1=506131&r2=506132
==============================================================================
--- webservices/xmlrpc/trunk/pom.xml (original)
+++ webservices/xmlrpc/trunk/pom.xml Sun Feb 11 12:53:31 2007
@@ -160,6 +160,10 @@
         <contributor>
             <name>Walter Mundt</name>
             <email>[EMAIL PROTECTED]</email>
+        </contributor>
+        <contributor>
+            <name>Andrew Norman</name>
+            <email>[EMAIL PROTECTED]</email>
         </contributor>
         <contributor>
             <name>Perry Nguyen</name>

Modified: webservices/xmlrpc/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/src/changes/changes.xml?view=diff&rev=506132&r1=506131&r2=506132
==============================================================================
--- webservices/xmlrpc/trunk/src/changes/changes.xml (original)
+++ webservices/xmlrpc/trunk/src/changes/changes.xml Sun Feb 11 12:53:31 2007
@@ -52,6 +52,10 @@
           due-to="Steffen Pingel" due-to-email="[EMAIL PROTECTED]">
         Made extending the XmlRpcCommonsTransportFactory easier.
       </action>
+      <action dev="jochen" type="add" issue="XMLRPC-133"
+          due-to="Andrew Norman" due-to-email="[EMAIL PROTECTED]">
+        Added support for redirects.
+      </action>
     </release>
     <release version="3.0.1-SNAPSHOT" date="Not yet released">
       <action dev="jochen" type="fix">


Reply via email to