urljs icon indicating copy to clipboard operation
urljs copied to clipboard

host() returns undefined if URL is 'localhost'

Open srw opened this issue 13 years ago • 13 comments

var url = new URL('localhost') url.host() undefined

srw avatar Feb 04 '12 09:02 srw

This is intentional. There is no way to know whether this is representative of a hostname or path.

Imagine a current URL of: http://example.com/ with a link: <a href="foo">Foo</a>. This would resolve to http://example.com/foo, just how <a href="localhost">Foo</a> would resolve to http://example.com/localhost.

When the String used to construct a new URL does not have enough information to determine whether is absolute or scheme-relative, host-relative, it is assumed to just be a relative URL.

ericf avatar Feb 07 '12 19:02 ericf

This seems like the right behavior to me. Other URL parsing libs do the same thing.

Node.js:

> url.parse('localhost').host
undefined
> url.parse('localhost').path
'localhost'

Ruby:

ruby-1.9.2-p290 :005 > URI('localhost').host
 => nil 
ruby-1.9.2-p290 :006 > URI('localhost').path
 => "localhost" 

rgrove avatar Feb 07 '12 19:02 rgrove

Don't agree. If I go to localhost in Google Chrome and type: document.location in the console, host is handled properly. if you follow a more canonical example like the solution proposal at http://stackoverflow.com/a/736970/88231 it doesn't work either.

srw avatar Feb 07 '12 20:02 srw

That's because Chrome has context. When you type "localhost" in the URL bar, it assumes you meant "http://localhost", because that's much more likely to be your intent than "file:///localhost" or something else. So Chrome browses to the hostname "localhost", and window.location then operates in the context of the hostname "localhost", path "/".

A generic URL parsing library is not a browser, and can't make browser-like assumptions about user intent, because the prupose of a generic URL parsing library is to parse URLs, not to display web pages to users. Given that the other non-browser-related generic URL parsing libraries I've tried have treated "localhost" as a path rather than a hostname, I think this behavior is well established, and violating it would violate the principle of least surprise.

A BrowserURL class that extends URL and provides more browser-like URL behavior would be well within its rights to interpret "localhost" as a hostname, however.

rgrove avatar Feb 07 '12 20:02 rgrove

A browser's Address Bar is afforded more contextual information in that it assumes a String which does not begin with a "/" is assumed to be the hostname and "http://" can be implied. In the case of Chrome, it special-cases "localhost", if you type in "asdf" it will do a Google search for "asdf".

To solve you're particular use-case, URL('http://localhost') or URL('//localhost') will signal that the specified String should be treated as a hostname.

ericf avatar Feb 07 '12 20:02 ericf

Sorry but I wrongly wrote the original issue.

I rechecked and It is:

var u = new URL('http://localhost') u.host() undefined

even if I use 'http://localhost'

srw avatar Feb 07 '12 20:02 srw

@srw Ah okay. I can verify that this is in fact happening: http://jsfiddle.net/ericf/JhPCH/

ericf avatar Feb 07 '12 22:02 ericf

Is there a solution to this issue yet? I'd like to fix it myself, but my regexp is pretty limited and it seems URL_ABSOLUTE_REGEX is the variable that needs to be modified for this to work correctly

dangmai avatar Jul 04 '12 15:07 dangmai

@dunkdt It has not been resolved yet. I'd like to eventually revisit this project and change the core rexexes that it uses. I just haven't had time to dedicate to doing that since it is currently meeting my needs.

ericf avatar Jul 05 '12 17:07 ericf

I tried also with http://code.google.com/p/jsuri/ may be good to integrate all URI's parsers? I don't see that competition is good in this terrain!

srw avatar Jul 05 '12 17:07 srw

@srw Yup! I want to replace the guts to use http://blog.stevenlevithan.com/archives/parseuri

ericf avatar Jul 05 '12 17:07 ericf

Also, I found out about jsURI after I wrote this project :P

ericf avatar Jul 05 '12 17:07 ericf

I also consider it a bug that URL("http://localhost").host() returns undefined.

awb avatar Jul 13 '13 00:07 awb