You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hc.apache.org by "Michiel Proce (JIRA)" <ji...@apache.org> on 2013/01/08 15:26:12 UTC
[jira] [Comment Edited] (HTTPCLIENT-1294) CircularRedirectException
is falsely thrown on URI case mismatch
[ https://issues.apache.org/jira/browse/HTTPCLIENT-1294?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13546914#comment-13546914 ]
Michiel Proce edited comment on HTTPCLIENT-1294 at 1/8/13 2:25 PM:
-------------------------------------------------------------------
Workaround, in own implementation of org.apache.http.impl.client.DefaultRedirectStrategy:
@Override
protected URI createLocationURI(String location) throws ProtocolException {
// Let HttpClient build an URI
URI locationURI = super.createLocationURI(location);
// Workaround HttpClient bug: https://issues.apache.org/jira/browse/HTTPCLIENT-1294
// Lower case the host (case insenistive according to RFC-3986 http://tools.ietf.org/html/rfc3986#section-3.1)
// This way we prevent an extra redirect from IIS6: EXAMPLE.com -> example.com. These hosts are considered equal, and throw a CircularRedirectException
if (locationURI != null) {
String host = locationURI.getHost();
if (host != null) {
String hostLowerCase = host.toLowerCase();
// if the host contains uppercase characters
if (!host.equals(hostLowerCase)) {
// rebuild the URI with lower case host
try {
locationURI = new URIBuilder(locationURI)
.setHost(host.toLowerCase())
.build();
} catch (URISyntaxException ex) {
throw new ProtocolException("Invalid redirect URI: " + location, ex);
}
}
}
}
return locationURI;
}
was (Author: michielproce):
Workaround, in own implementation of org.apache.http.impl.client.DefaultRedirectStrategy:
{code:java}
@Override
protected URI createLocationURI(String location) throws ProtocolException {
// Let HttpClient build an URI
URI locationURI = super.createLocationURI(location);
// Workaround HttpClient bug: https://issues.apache.org/jira/browse/HTTPCLIENT-1294
// Lower case the host (case insenistive according to RFC-3986 http://tools.ietf.org/html/rfc3986#section-3.1)
// This way we prevent an extra redirect from IIS6: EXAMPLE.com -> example.com. These hosts are considered equal, and throw a CircularRedirectException
if (locationURI != null) {
String host = locationURI.getHost();
if (host != null) {
String hostLowerCase = host.toLowerCase();
// if the host contains uppercase characters
if (!host.equals(hostLowerCase)) {
// rebuild the URI with lower case host
try {
locationURI = new URIBuilder(locationURI)
.setHost(host.toLowerCase())
.build();
} catch (URISyntaxException ex) {
throw new ProtocolException("Invalid redirect URI: " + location, ex);
}
}
}
}
return locationURI;
}
{code}
> CircularRedirectException is falsely thrown on URI case mismatch
> ----------------------------------------------------------------
>
> Key: HTTPCLIENT-1294
> URL: https://issues.apache.org/jira/browse/HTTPCLIENT-1294
> Project: HttpComponents HttpClient
> Issue Type: Bug
> Components: HttpClient
> Affects Versions: 4.1.3, 4.2.2
> Reporter: Michiel Proce
>
> Some servers (including IIS6) redirect wrong-cased request URIs to lower case:
> http://EXAMPLE.com/ -> http://example.com/
> Now when I'm redirected from another URI to an uppercase URI, the following redirects happen:
> http://referrer.com/ -> http://EXAMPLE.com/ -> http://example.com/
> When running this request with HttpClient (with default ALLOW_CIRCULAR_REDIRECTS: false), I get a org.apache.http.client.CircularRedirectException, even though a circular redirect won't occur.
> The problem lies in java.net.URI, the following URIs are considered equal:
> URI a = new URI("http://example.com");
> URI b = new URI("http://EXAMPLE.com");
> // a.equals(b): true
> // a.hashCode() == b.hashCode(): true
> The redirect locations are stored in a HashSet<URI> in org.apache.http.impl.client.RedirectLocations. A CircularRedirectException is thrown when an URI is already in this hashset.
> I have no real suggestions on how to fix this, because I am not known with the coding style for HttpClient..
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org