[ http://issues.apache.org/jira/browse/HTTPCLIENT-587?page=all ]
Gordon Mohr updated HTTPCLIENT-587:
-----------------------------------
Attachment: httpclient-587.patch
Patch with unit test illustrating problem, and patch which resolves unit test
without breaking any prior unit tests.
Theory of patch is:
(1) There is a block that previously ran when relative._scheme !=null -- it
assumed this meant 'relative' was an absolute URI and copied all its state into
the new URI instance. Now, this block only runs if scheme !=null AND either the
relative._scheme is different than the 'base' scheme (meaning no
derelativization would be appropriate) or relative._authority is non-null
(implying it truly is an absolute URI)
(2) There is a block for derelativizing the path that previously ran only when
relative._scheme and relative._authority were both null -- assuming that this
was the only case where combining the paths was necessary. Now, this block also
runs when relative._authority is null and the relative._scheme is identical to
the base_scheme.
(3) The early setting of this._authority to base._authority (~line 6 of method)
counts on authority being reset later if necessary. It appears the same tack
should be taken with _is_net_path; otherwise the later setURI() will not retain
the set-up _authority.
> derelativizing of relative URIs with a scheme is incorrect
> ----------------------------------------------------------
>
> Key: HTTPCLIENT-587
> URL: http://issues.apache.org/jira/browse/HTTPCLIENT-587
> Project: Jakarta HttpClient
> Type: Bug
> Versions: 3.0.1
> Reporter: Gordon Mohr
> Attachments: httpclient-587.patch
>
> URI constructor "public URI(URI base, URI relative) throws URIException"
> assumes that if given 'relative' URI has a scheme, it should provide an
> authority and complete path to the constructed URI. However, a URI can have a
> scheme but still be relative, requiring the authority and base path of the
> 'base' URI.
> Demonstration code:
> URI base = new URI("http://www.example.com/some/page");
> URI rel = new URI("http:boo");
> URI derel = new URI(base,rel);
> derel.toString();
> (java.lang.String) http:boo
> In fact, derel should be "http://www.example.com/some/boo".
> RFC2396 is a little confused about this; section 3.1 states ""Relative URI
> references are distinguished from absolute URI in that they do not begin with
> a scheme name." But, in section 5, there are several sentences talking about
> relative URIs that begin with schemes (and how this prevents using relative
> URIs that have leading path segments that look like scheme identifiers).
> RFC3896, which supercedes RFC2396, removes the implication a relative URI
> cannot begin with a scheme, leaving the other text explcitly discussing
> relative URIs with schemes.
> Both Firefox (1.5) and IE (6.0) treat "http:boo" the same as "boo" for
> purposes of derelativization against an HTTP base URI, which would give the
> final URI "http://www.example.com/some/boo" in the example above.
> Even relative URIs like "http:../../boo" are explicitly legal.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]