Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions Doc/library/urllib.parse.rst
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,13 @@ or on combining URL components into a URL string.
.. versionchanged:: 3.2
Result is a structured object rather than a simple 2-tuple.

.. function:: unwrap(url)

Extract the url from a wrapped URL (that is, a string formatted as
``<URL:scheme://host/path>``, ``<scheme://host/path>``, ``URL:scheme://host/path``
or ``scheme://host/path``). If *url* is not a wrapped URL, it is returned
without changes.

.. _parsing-ascii-encoded-bytes:

Parsing ASCII Encoded Bytes
Expand Down
12 changes: 4 additions & 8 deletions Lib/test/test_urlparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -1140,8 +1140,10 @@ def test_to_bytes(self):
'http://www.python.org/medi\u00e6val')

def test_unwrap(self):
url = urllib.parse._unwrap('<URL:type://host/path>')
self.assertEqual(url, 'type://host/path')
for wrapped_url in ('<URL:scheme://host/path>', '<scheme://host/path>',
'URL:scheme://host/path', 'scheme://host/path'):
url = urllib.parse.unwrap(wrapped_url)
self.assertEqual(url, 'scheme://host/path')


class DeprecationTest(unittest.TestCase):
Expand Down Expand Up @@ -1222,12 +1224,6 @@ def test_to_bytes_deprecation(self):
self.assertEqual(str(cm.warning),
'urllib.parse.to_bytes() is deprecated as of 3.8')

def test_unwrap(self):
with self.assertWarns(DeprecationWarning) as cm:
urllib.parse.unwrap('')
self.assertEqual(str(cm.warning),
'urllib.parse.unwrap() is deprecated as of 3.8')


if __name__ == "__main__":
unittest.main()
14 changes: 6 additions & 8 deletions Lib/urllib/parse.py
Original file line number Diff line number Diff line change
Expand Up @@ -952,17 +952,15 @@ def _to_bytes(url):


def unwrap(url):
warnings.warn("urllib.parse.unwrap() is deprecated as of 3.8",
DeprecationWarning, stacklevel=2)
return _unwrap(url)


def _unwrap(url):
"""unwrap('<URL:type://host/path>') --> 'type://host/path'."""
"""Transform a string like '<URL:scheme://host/path>' into 'scheme://host/path'.

Comment thread
remilapeyre marked this conversation as resolved.
Resolved
The string is returned unchanged if it's not a wrapped URL.
"""
url = str(url).strip()
if url[:1] == '<' and url[-1:] == '>':
url = url[1:-1].strip()
if url[:4] == 'URL:': url = url[4:].strip()
if url[:4] == 'URL:':
url = url[4:].strip()
return url


Expand Down
8 changes: 4 additions & 4 deletions Lib/urllib/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@

from urllib.error import URLError, HTTPError, ContentTooShortError
from urllib.parse import (
urlparse, urlsplit, urljoin, _unwrap, quote, unquote,
urlparse, urlsplit, urljoin, unwrap, quote, unquote,
_splittype, _splithost, _splitport, _splituser, _splitpasswd,
_splitattr, _splitquery, _splitvalue, _splittag, _to_bytes,
unquote_to_bytes, urlunparse)
Expand Down Expand Up @@ -349,7 +349,7 @@ def full_url(self):
@full_url.setter
def full_url(self, url):
# unwrap('<URL:type://host/path>') --> 'type://host/path'
self._full_url = _unwrap(url)
self._full_url = unwrap(url)
self._full_url, self.fragment = _splittag(self._full_url)
self._parse()

Expand Down Expand Up @@ -1727,7 +1727,7 @@ def addheader(self, *args):
# External interface
def open(self, fullurl, data=None):
"""Use URLopener().open(file) instead of open(file, 'r')."""
fullurl = _unwrap(_to_bytes(fullurl))
fullurl = unwrap(_to_bytes(fullurl))
fullurl = quote(fullurl, safe="%/:=&?~#+!$,;'@()*[]|")
if self.tempcache and fullurl in self.tempcache:
filename, headers = self.tempcache[fullurl]
Expand Down Expand Up @@ -1775,7 +1775,7 @@ def open_unknown_proxy(self, proxy, fullurl, data=None):
def retrieve(self, url, filename=None, reporthook=None, data=None):
"""retrieve(url) returns (filename, headers) for a local object
or (tempfilename, headers) for a remote object."""
url = _unwrap(_to_bytes(url))
url = unwrap(_to_bytes(url))
if self.tempcache and url in self.tempcache:
return self.tempcache[url]
type, url1 = _splittype(url)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Remove deprecation and document urllib.parse.unwrap(). Patch contributed by
Rémi Lapeyre.