new URI("http://example.com/foo#bar").resolve("")

Jack Bates jack.bates at gmail.com
Mon Jan 25 15:51:36 PST 2010


Hi Michael,

On Mon, 2010-01-25 at 11:20 +0000, Michael McMahon wrote:
> I don't think this is a bug. Everything to the
> right of the final "/" in the original URI is discarded when resolving
> against any relative URI.

I think you're referring to step 6a) in RFC2396 section 5.2,

      a) All but the last segment of the base URI's path component is
         copied to the buffer.  In other words, any characters after the
         last (right-most) slash character, if any, are excluded.

- however step 2) is,

   2) If the path component is empty and the scheme, authority, and
      query components are undefined, then it is a reference to the
      current document and we are done.  Otherwise, the reference URI's
      query and fragment components are defined as found (or not found)
      within the URI reference and not inherited from the base URI.

In my example the path component is empty and the scheme, authority, and
query components are undefined, which is why I expect it to return,
"http://example.com/foo"

There's also an example in appendix C.2,

   An empty reference refers to the start of the current document.

      <>            =  (current document)

RFC3986 section 5.4.1 gives some more examples,

   Within a representation with a well defined base URI of

      http://a/b/c/d;p?q

   a relative reference is transformed to its target URI as follows.

   [...]

   ""              =  "http://a/b/c/d;p?q"

- however when I run,

import java.net.URI;

public class Test
{
  public static void main(String[] args) throws Exception
  {
    System.out.println(new URI("http://a/b/c/d;p?q").resolve(""));
  }
}

- instead of "http://a/b/c/d;p?q", it outputs,

$ java Test
http://a/b/c/
$ 

RFC3986 section 5.2.2 also includes,

            if (R.path == "") then
               T.path = Base.path;

> So, "foo#bar" is correctly discarded, leaving the new URI
> 
> http://example.com/
> 
> That would be my reading of RFC2396 anyway.
> 
> - Michael.
> 
> Jack Bates wrote:
> > new URI("http://example.com/foo#bar").resolve("")
> >
> > ^ I expect this to return "http://example.com/foo", but when I run,
> >
> > import java.net.URI;
> >
> > public class Test
> > {
> >   public static void main(String[] args) throws Exception
> >   {
> >     System.out.println(new URI("http://example.com/foo#bar").resolve(""));
> >   }
> > }
> >
> > - it outputs,
> >
> > $ java Test
> > http://example.com/
> > $ 
> >
> > Do you think this is a bug?
> >
> > I'm running OpenJDK 6, but I can find only cosmetic differences between
> > URI.java in the version I'm running and URI.java in,
> > http://www.java.net/download/openjdk/jdk7/promoted/b80/openjdk-7-ea-src-b80-21_jan_2010.zip
> >
> > - so I assume the issue (if it is an issue) still exists?
> >   
> 
> 




More information about the net-dev mailing list