Skip to content

Add resolve() method (or function) #31

Open
@pix666

Description

@pix666

Here's the helper function I wrote:

from purl import URL
from urllib import parse

def resolve(base, url):
    """
    Resolves a target URL relative to a base URL in a manner similar to that of a Web browser resolving an anchor tag HREF
    :param base: str|URL
    :param url: str|URL
    :return: URL
    """
    if isinstance(base, URL):
        baseurl = base
    else:
        baseurl = URL(base)

    if isinstance(url, URL):
        relurl = url
    else:
        relurl = URL(url)

    if relurl.host():
        return relurl

    if relurl.path():
        return URL(
            scheme=baseurl.scheme(),
            host=baseurl.host(),
            port=baseurl.port(),
            path=parse.urljoin(baseurl.path(), relurl.path()),
            query=relurl.query(),
            fragment=relurl.fragment(),
        )
    elif relurl.query() or '?' in url:
        return URL(
            scheme=baseurl.scheme(),
            host=baseurl.host(),
            port=baseurl.port(),
            path=baseurl.path(),
            query=relurl.query(),
            fragment=relurl.fragment(),
        )
    elif relurl.fragment() or '#' in url:
        return URL(
            scheme=baseurl.scheme(),
            host=baseurl.host(),
            port=baseurl.port(),
            path=baseurl.path(),
            query=baseurl.query(),
            fragment=relurl.fragment(),
        )
    return baseurl

Usage:

>>> base = URL('http://user:[email protected]:8080/path/to/some/doc.html?q=query#frag')
...
>>> print(resolve(base, '../home'))
http://user:[email protected]:8080/path/to/home

>>> print(resolve(base, 'doc2.html'))
http://user:[email protected]:8080/path/to/some/doc2.html

>>> print(resolve(base, '?'))
http://user:[email protected]:8080/path/to/some/doc.html

>>> print(resolve(base, '?q=git'))
http://user:[email protected]:8080/path/to/some/doc.html?q=git

>>> print(resolve(base, '#'))
http://user:[email protected]:8080/path/to/some/doc.html?q=query

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions