You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hc.apache.org by Michael Becke <be...@u.washington.edu> on 2003/03/17 04:22:10 UTC
[PATCH] switch redirect to use URI
Again, but with the patch inlined.
On Sunday, March 16, 2003, at 10:20 PM, Michael Becke wrote:
> Attached is a patch that switches redirect processing from using URL
> to URI. The only reason for doing this is to avoid setting the system
> property "java.protocol.handler.pkgs" to
> "com.sun.net.ssl.internal.www.protocol" when using HTTPS in pre 1.4
> JVMs. Please let me know if you think this is worthwhile.
>
> Mike
>
Index: src/java/org/apache/commons/httpclient/HttpMethodBase.java
===================================================================
RCS file:
/home/cvspublic/jakarta-commons/httpclient/src/java/org/apache/commons/
httpclient/HttpMethodBase.java,v
retrieving revision 1.123
diff -u -r1.123 HttpMethodBase.java
--- src/java/org/apache/commons/httpclient/HttpMethodBase.java 13 Mar
2003 17:51:28 -0000 1.123
+++ src/java/org/apache/commons/httpclient/HttpMethodBase.java 17 Mar
2003 03:14:40 -0000
@@ -68,14 +68,12 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.InterruptedIOException;
-import java.net.MalformedURLException;
-import java.net.URL;
import java.util.HashSet;
import java.util.Set;
-import org.apache.commons.httpclient.cookie.MalformedCookieException;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.cookie.CookieSpec;
+import org.apache.commons.httpclient.cookie.MalformedCookieException;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.util.URIUtil;
import org.apache.commons.logging.Log;
@@ -128,7 +126,7 @@
* @author <a href="mailto:dion@apache.org">dIon Gillard</a>
* @author <a href="mailto:jsdever@apache.org">Jeff Dever</a>
* @author <a href="mailto:dims@apache.org">Davanum Srinivas</a>
- * @author Ortwin GlÔøΩ
+ * @author Ortwin GlÔøΩck
* @author Eric Johnson
* @author Michael Becke
* @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
@@ -1074,33 +1072,37 @@
//rfc2616 demands the location value be a complete URI
//Location = "Location" ":" absoluteURI
- URL redirectUrl = null;
- URL currentUrl = null;
+ URI redirectUri = null;
+ URI currentUri = null;
try {
- currentUrl = new URL(conn.getProtocol().getScheme(),
- conn.getHost(), conn.getPort(), this.getPath());
- redirectUrl = new URL(location);
- } catch (MalformedURLException e) {
- if (isStrictMode()) {
- LOG.warn("Redirected location '" + location
- + "' is not acceptable in strict mode");
- return false;
- } else { //location is incomplete, use current values for
defaults
- try {
- LOG.debug("Redirect URL is not absolute - parsing
as relative");
- redirectUrl = new URL(currentUrl, location);
- } catch (MalformedURLException ex) {
- LOG.warn("Redirected location '" + location
- + "' is malformed");
+ currentUri = new URI(
+ conn.getProtocol().getScheme(),
+ null,
+ conn.getHost(),
+ conn.getPort(),
+ this.getPath()
+ );
+ redirectUri = new URI(location.toCharArray());
+ if (redirectUri.isRelativeURI()) {
+ if (isStrictMode()) {
+ LOG.warn("Redirected location '" + location
+ + "' is not acceptable in strict mode");
return false;
+ } else {
+ //location is incomplete, use current values for
defaults
+ LOG.debug("Redirect URI is not absolute - parsing
as relative");
+ redirectUri = new URI(currentUri, redirectUri);
}
}
+ } catch (URIException e) {
+ LOG.warn("Redirected location '" + location + "' is
malformed");
+ return false;
}
//check for redirect to a different protocol, host or port
try {
- checkValidRedirect(currentUrl, redirectUrl);
+ checkValidRedirect(currentUri, redirectUri);
} catch (HttpException ex) {
//LOG the error and let the client handle the redirect
LOG.warn(ex.getMessage());
@@ -1110,51 +1112,56 @@
//update the current location with the redirect location.
//avoiding use of URL.getPath() and URL.getQuery() to keep
//jdk1.2 comliance.
- setPath(URIUtil.getPath(redirectUrl.toString()));
- setQueryString(URIUtil.getQuery(redirectUrl.toString()));
+ setPath(redirectUri.getEscapedPath());
+ setQueryString(redirectUri.getEscapedQuery());
if (LOG.isDebugEnabled()) {
- LOG.debug("Redirecting from '" +
currentUrl.toExternalForm()
- + "' to '" + redirectUrl.toExternalForm());
+ LOG.debug("Redirecting from '" + currentUri.getEscapedURI()
+ + "' to '" + redirectUri.getEscapedURI());
}
return true;
-
}
-
/**
- * Check for a valid redirect given the current conn and new url.
+ * Check for a valid redirect given the current conn and new URI.
* Redirect to a different protocol, host or port are checked for
validity.
*
- * @param currentUrl The current URL (redirecting from)
- * @param redirectUrl The new URL to redirect to
+ * @param currentUri The current URI (redirecting from)
+ * @param redirectUri The new URI to redirect to
* @throws HttpException if the redirect is invalid
* @since 2.0
*/
- private static void checkValidRedirect(URL currentUrl, URL
redirectUrl)
+ private static void checkValidRedirect(URI currentUri, URI
redirectUri)
throws HttpException {
LOG.trace("enter
HttpMethodBase.checkValidRedirect(HttpConnection, URL)");
- String oldProtocol = currentUrl.getProtocol();
- String newProtocol = redirectUrl.getProtocol();
+ String oldProtocol = currentUri.getScheme();
+ String newProtocol = redirectUri.getScheme();
if (!oldProtocol.equals(newProtocol)) {
throw new HttpException("Redirect from protocol " +
oldProtocol
+ " to " + newProtocol + " is not supported");
}
- String oldHost = currentUrl.getHost();
- String newHost = redirectUrl.getHost();
- if (!oldHost.equalsIgnoreCase(newHost)) {
- throw new HttpException("Redirect from host " + oldHost
- + " to " + newHost + " is not supported");
+ try {
+ String oldHost = currentUri.getHost();
+ String newHost = redirectUri.getHost();
+ if (!oldHost.equalsIgnoreCase(newHost)) {
+ throw new HttpException("Redirect from host " + oldHost
+ + " to " + newHost + " is not supported");
+ }
+ } catch (URIException e) {
+ LOG.warn("Error getting URI host", e);
+ throw new HttpException("Invalid Redirect URI from: "
+ + currentUri.getEscapedURI() + " to: " +
redirectUri.getEscapedURI()
+ );
}
- int oldPort = currentUrl.getPort();
+ int oldPort = currentUri.getPort();
if (oldPort < 0) {
oldPort = getDefaultPort(oldProtocol);
}
- int newPort = redirectUrl.getPort();
+ int newPort = redirectUri.getPort();
if (newPort < 0) {
newPort = getDefaultPort(newProtocol);
}
@@ -1163,7 +1170,6 @@
+ " to " + newPort + " is not supported");
}
}
-
/**
* Returns the default port for the given protocol.