Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

relative port address not updated #82

Closed
kkvilekval opened this issue Jan 6, 2017 · 5 comments
Closed

relative port address not updated #82

kkvilekval opened this issue Jan 6, 2017 · 5 comments

Comments

@kkvilekval
Copy link

furl ('http://domain.com:9999').join ('http://:9021/').url
 'http://:9021/

expected `http://domain.com:9021/'

In [17]: furl ('http://domain.com:9999').join ('https//:9021/').url
Out[17]: 'http://:9021/'

expected `https://domain.com:9021/'

@gruns
Copy link
Owner

gruns commented Jan 12, 2017

Hi kkvilekval,

While admittedly a bit of a head scratcher initially, this is expected behavior.

The host of 'http://:9021/' is empty. As such, join() adopts the empty
string as the new host.

For context, this is the behavior of Python's standard urllib.parse.urljoin(),
too.

>>> from urllib.parse import urljoin
>>> urljoin('http://domain.com:9999', 'http://:9021/')
'http://:9021/'

And other language's standard libraries, too. Like Node's.

$ node
> url.resolve('http://domain.com:9999/', 'http://:9021/')
'http://:9021/'

Back to your original example. If you want to set the port of an existing URL
to, the easiest way to do that is with set().

>>> from furl import furl
>>> furl('http://domain.com:9999').set(port=furl('http://:9021/').port).url
'http://domain.com:9021'

Or, to preserve the original host, join on a URL with that same host.

>>> from furl import furl
>>> furl('http://domain.com:9999').join('http://domain.com:9021/').url
'http://domain.com:9021'

Does that answer your question?

@kkvilekval
Copy link
Author

kkvilekval commented Jan 12, 2017

Furl seemed like a good place to actually have a join that would work properly (well at least similar to how the browser does joins). The other libraries don't really mimic browser behavior well and so I was looking for an alternative.. I ended up coding it externally but thought it might make a good addition:

def urljoin(base, partial, **kw):
    """ Join all components for a url overriding any components in base from partial

    @param base: The base url
    @param partial: The overriding url
    @param kw :  extra url parameters
    @return a new url string
    """
    updated = furl.furl (base)
    partial = furl.furl (partial)

    updated.scheme = partial.scheme or updated.scheme
    updated.username = partial.username or updated.username
    updated.password = partial.username or updated.username
    updated.host     = partial.host or updated.host
    updated.port     = partial.port or updated.port
    updated.path = urlparse.urljoin (str(updated.path), str(partial.path))
    updated.query.params  = partial.query.params or updated.query.params
    updated.query.params.update (kw)
    return updated.url

@gruns
Copy link
Owner

gruns commented Jan 16, 2017

(well at least similar to how the browser does joins)

Browsers don't join http://domain.com:9999/ and http://:9021/ into
http://domain.com:9021/ either, though. For example, a quick test:

In both Chrome and Firefox, the click me anchor doesn't navigate to

It doesn't navigate anywhere.

Do you have an example piece of software (application, library, tool, etc) that
joins http://domain.com:9999/ and http://:9021/ into
http://domain.com:9021/?

@gruns
Copy link
Owner

gruns commented Jan 22, 2017

Little bump -- did you find an example piece of software (application, library, tool, etc) that
joins http://domain.com:9999/ and http://:9021/ into http://domain.com:9021/?

@kkvilekval
Copy link
Author

I will close .. after checking the spec on relative urls (https://www.ietf.org/rfc/rfc1808.txt) it appears that netloc is not parsed at all and is replaced completely see (step 3 in section 4).

That said.. I do find the functionality useful especially when dealing with multi-port services such as websockets and others.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants