54 lines
No EOL
1.1 KiB
Python
54 lines
No EOL
1.1 KiB
Python
from typing import Optional
|
|
from urllib.parse import urlparse, parse_qs
|
|
|
|
|
|
def url_query_string(fields:dict):
|
|
|
|
return '&'.join([f'{k}={v}' for k,v in fields.items()])
|
|
|
|
|
|
def url_append_query_param(url:str, name: str, value:str):
|
|
|
|
urlcomps = urlparse(url)
|
|
|
|
q = parse_qs(urlcomps.query)
|
|
|
|
q[name] = value
|
|
|
|
qs = url_query_string(q)
|
|
|
|
return urlcomps._replace(query=qs).geturl()
|
|
|
|
|
|
def url_upgrade_to_https(url: str, port: Optional[int] = 443):
|
|
|
|
urlcomps = urlparse(url)
|
|
|
|
urlcomps = urlcomps._replace(scheme='https')
|
|
|
|
if url != urlcomps.geturl():
|
|
|
|
hostname = urlcomps.netloc.rsplit(':', 1)[0]
|
|
|
|
if port != 443:
|
|
netloc = ':'.join((hostname, str(port)))
|
|
else:
|
|
netloc = hostname
|
|
|
|
urlcomps = urlcomps._replace(netloc=netloc)
|
|
|
|
return urlcomps.geturl()
|
|
|
|
|
|
def url_has_tld(url:str, tld:str):
|
|
|
|
urlcomps = urlparse(url)
|
|
|
|
hostname = urlcomps.netloc.rsplit(':', 1)[0]
|
|
|
|
hostname_levels = hostname.rsplit('.', 1)
|
|
|
|
if len(hostname_levels) > 1 and hostname_levels[-1:][0] == tld:
|
|
return True
|
|
|
|
return False |