4040from ._compat import unquote
4141from ._compat import unquote_to_bytes
4242from ._compat import urlencode
43+ from ._compat import urlsplit
44+ from ._compat import urlunsplit
4345from ._compat import urlparse
4446from ._compat import urlunparse
4547from ._version import __version__
@@ -355,12 +357,11 @@ def __init__(self, method=HTTP_METHOD, url=None, parameters=None,
355357 self .body = body
356358 self .is_form_encoded = is_form_encoded
357359
358-
359360 @setter
360361 def url (self , value ):
361362 self .__dict__ ['url' ] = value
362363 if value is not None :
363- scheme , netloc , path , params , query , fragment = urlparse (value )
364+ scheme , netloc , path , query , fragment = urlsplit (value )
364365
365366 # Exclude default port numbers.
366367 if scheme == 'http' and netloc [- 3 :] == ':80' :
@@ -371,7 +372,7 @@ def url(self, value):
371372 raise ValueError ("Unsupported URL %s (%s)." % (value , scheme ))
372373
373374 # Normalized URL excludes params, query, and fragment.
374- self .normalized_url = urlunparse ((scheme , netloc , path , None , None , None ))
375+ self .normalized_url = urlunsplit ((scheme , netloc , path , None , None ))
375376 else :
376377 self .normalized_url = None
377378 self .__dict__ ['url' ] = None
@@ -416,21 +417,26 @@ def to_postdata(self):
416417 def to_url (self ):
417418 """Serialize as a URL for a GET request."""
418419 base_url = urlparse (self .url )
419- try :
420- query = base_url .query
421- except AttributeError : #pragma NO COVER
422- # must be python <2.5
423- query = base_url [4 ]
424- query = parse_qs (to_utf8 (query ))
425- for k , v in self .items ():
426- query .setdefault (to_utf8 (k ), []).append (to_utf8_optional_iterator (v ))
427-
428- scheme = to_utf8 (base_url .scheme )
429- netloc = to_utf8 (base_url .netloc )
430- path = to_utf8 (base_url .path )
431- params = to_utf8 (base_url .params )
432- fragment = to_utf8 (base_url .fragment )
433-
420+
421+ if PY3 :
422+ query = parse_qs (base_url .query )
423+ for k , v in self .items ():
424+ query .setdefault (k , []).append (to_utf8_optional_iterator (v ))
425+ scheme = base_url .scheme
426+ netloc = base_url .netloc
427+ path = base_url .path
428+ params = base_url .params
429+ fragment = base_url .fragment
430+ else :
431+ query = parse_qs (to_utf8 (base_url .query ))
432+ for k , v in self .items ():
433+ query .setdefault (to_utf8 (k ), []).append (to_utf8_optional_iterator (v ))
434+ scheme = to_utf8 (base_url .scheme )
435+ netloc = to_utf8 (base_url .netloc )
436+ path = to_utf8 (base_url .path )
437+ params = to_utf8 (base_url .params )
438+ fragment = to_utf8 (base_url .fragment )
439+
434440 url = (scheme , netloc , path , params , urlencode (query , True ), fragment )
435441 return urlunparse (url )
436442
0 commit comments