Exemple #1
0
    def sanitize_scheme(url):
        if urlparse.urlsplit(unquote(url)).scheme not in VALID_SCHEMES:
            if level in ("validate", "filter"):
                parts = urlparse.urlsplit(url)
                url = urlparse.urlunsplit(("", parts.netloc, parts.path, parts.query, parts.fragment))
                return urlparse.urljoin("http:", re.sub("^/*", "//", url))
            else:
                raise UrlValidationException

        return url
Exemple #2
0
def update_url(url, update_args=None, remove_args=None):

    # Определяем схему и обрабатываем её вручную, в урле оставляем `//`.
    # Нужно для работы с кастомными схемами (`magic://`) в 2.7.3, см. баг:
    # http://bugs.python.org/issue9374 (исправлен в 2.7.4)
    scheme, sep, url_new = url.partition('://')
    trim_fake_slashes = False

    if len(scheme) == len(url):
        scheme = ''
        if not url.startswith('//'):
            trim_fake_slashes = True
            url = '//' + url
    else:
        url = '//' + url_new

    url_split = urlparse.urlsplit(_to_native_string(url))
    query_dict = urlparse.parse_qs(url_split.query, keep_blank_values=True)

    if update_args:
        update_args = _deep_encode(update_args)
        query_dict.update(update_args)

    if remove_args:
        query_dict = {k: query_dict.get(k) for k in query_dict if k not in remove_args}

    query = urlencode(query_dict, doseq=True)

    # Нужно для работы с кастомными схемами без netloc, см. баг:
    # http://bugs.python.org/issue8339 (wont fix).
    # warning: does not preserve original string type
    if not url_split.netloc:
        return ''.join([
            _to_native_string(scheme),
            '://' if scheme else '',
            url_split.path,
            '?' if query else '',
            _to_native_string(query),
            '#' if url_split.fragment else '',
            _to_native_string(url_split.fragment)
        ])

    result = urlparse.urlunsplit(
        [_to_native_string(part) for part in (scheme, url_split.netloc, url_split.path, query, url_split.fragment)]
    )

    # Убираем слеши, добавленные выше, если `urlunsplit` не убрал их сам.
    if trim_fake_slashes and result.startswith('//'):
        result = result[2:]

    return result