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.

On Oct 1, 2007, at 03:02 , Gareth A. wrote:

=> “/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.

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

Eric H. wrote:

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