urljs
urljs copied to clipboard
host() returns undefined if URL is 'localhost'
var url = new URL('localhost') url.host() undefined
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.
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"
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.
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.
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.
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 Ah okay. I can verify that this is in fact happening: http://jsfiddle.net/ericf/JhPCH/
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
@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.
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 Yup! I want to replace the guts to use http://blog.stevenlevithan.com/archives/parseuri
Also, I found out about jsURI after I wrote this project :P
I also consider it a bug that URL("http://localhost").host() returns undefined.