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">