add request.update_query_params which update query params of given url and return new url

This commit is contained in:
Prodesire 2018-03-27 20:41:01 +08:00
parent 14a476868c
commit b91f25a193
3 changed files with 22 additions and 2 deletions

View File

@ -17,10 +17,12 @@ if PY2:
import urllib as urlib import urllib as urlib
import urlparse import urlparse
from urlparse import urljoin from urlparse import urljoin
from urllib import urlencode
else: else:
import urllib.request as urlib import urllib.request as urlib
import urllib.parse as urlparse import urllib.parse as urlparse
from urllib.parse import urljoin from urllib.parse import urljoin
from urllib.parse import urlencode
# Dictionary iteration # Dictionary iteration
if PY2: if PY2:

View File

@ -5,7 +5,7 @@ import socket
from . import logger from . import logger
from .string import safeunicode from .string import safeunicode
from .compat import PY2, string_types, urlparse, urlib from .compat import PY2, string_types, urlparse, urlib, urlencode
class FileName(object): class FileName(object):
@ -125,3 +125,15 @@ def check_connect(ip, port, retry=1, timeout=0.5):
finally: finally:
retry -= 1 retry -= 1
return None return None
def update_query_params(url, params):
"""
Update query params of given url and return new url.
"""
parts = list(urlparse.urlparse(url))
query = dict(urlparse.parse_qsl(parts[4]))
query.update(params)
parts[4] = urlencode(query)
new_url = urlparse.urlunparse(parts)
return new_url

View File

@ -2,7 +2,7 @@ import socket
from .testing import mockserver from .testing import mockserver
import pydu.request import pydu.request
from pydu.network import get_free_port from pydu.network import get_free_port
from pydu.request import FileName, check_connect from pydu.request import FileName, check_connect, update_query_params
def test_filename_from_url(): def test_filename_from_url():
@ -52,3 +52,9 @@ def test_check_connect(port=None):
pydu.request.socket.socket = mock_socket pydu.request.socket.socket = mock_socket
assert not check_connect('127.0.0.1', port=port, timeout=0.01) assert not check_connect('127.0.0.1', port=port, timeout=0.01)
def test_update_query_params():
assert update_query_params('http://example.com/', {'foo': 1}) == 'http://example.com/?foo=1'
assert update_query_params('http://example.com/?foo=1', {'foo': 2}) == 'http://example.com/?foo=2'
assert update_query_params('http://example.com/?foo=1', {'foo': 2, 'bar': 3}) == 'http://example.com/?foo=2&bar=3'