URI.join inconsistency

I just got stung by rather annoying feature of URI.join:

irb(main):001:0> URI.join('http://www.example.com/something', 'else').to_s
=> "http://www.example.com/else"

Note that this completely ignores the 'something' in the original URI. I had
assumed that it joined in a similar way to File.join:

irb(main):002:0> File.join('/something', 'else').to_s
=> "/something/else"

I notice that adding a slash works as expected, but why is there a difference?
Is there something in the HTTP spec that defines URI joining like this?

irb(main):001:0> URI.join('http://www.example.com/something/', 'else').to_s
=> "http://www.example.com/something/else"

Maybe this is a case of incomplete documentation not explaining what the join
is actually doing, this doesn't seem to be 'least surprising' approach at the
moment.

URIs and paths are not the same, "http://example.com/something" and "http://example.com/something/" are allowed to return different content. URI.join works off the directory, "/" in your case, rather than assuming that "/something" is a directory, which may be incorrect.

(My annoyance with this method is that the first argument cannot be a URI::Generic.)

···

On Oct 1, 2007, at 03:02 , Gareth Adams wrote:

I just got stung by rather annoying feature of URI.join:

irb(main):001:0> URI.join('http://www.example.com/something', 'else').to_s
=> "http://www.example.com/else"

Note that this completely ignores the 'something' in the original URI. I had assumed that it joined in a similar way to File.join:

irb(main):002:0> File.join('/something', 'else').to_s
=> "/something/else"

I notice that adding a slash works as expected, but why is there a difference?

--
Poor workers blame their tools. Good workers build better tools. The
best workers get their tools to do the work for them. -- Syndicate Wars

Eric Hodel wrote:

irb(main):002:0> File.join('/something', 'else').to_s
=> "/something/else"

I notice that adding a slash works as expected, but why is there a
difference?

URIs and paths are not the same, "http://example.com/something" and
"http://example.com/something/" are allowed to return different
content. URI.join works off the directory, "/" in your case, rather
than assuming that "/something" is a directory, which may be incorrect.

Then again, /something in the filesystem may just as well be a file,
rather than a directory, thus if we consider combining a directory name
with a file name,

File.join('/something', 'else')

should logically result /else, while

File.join('/something/', 'else')

return /something/else. So I guess the behaviour is still inconsistent,
unless there's an explicitly different rule for dealing with URLs
compared to FS paths...

mortee

···

On Oct 1, 2007, at 03:02 , Gareth Adams wrote: