aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/urllib/request.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/urllib/request.py')
-rw-r--r--Lib/urllib/request.py19
1 files changed, 12 insertions, 7 deletions
diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
index 9a6b29a90a2..41dc5d7b35d 100644
--- a/Lib/urllib/request.py
+++ b/Lib/urllib/request.py
@@ -1466,7 +1466,7 @@ class FileHandler(BaseHandler):
def open_local_file(self, req):
import email.utils
import mimetypes
- localfile = url2pathname(req.full_url, require_scheme=True)
+ localfile = url2pathname(req.full_url, require_scheme=True, resolve_host=True)
try:
stats = os.stat(localfile)
size = stats.st_size
@@ -1482,7 +1482,7 @@ class FileHandler(BaseHandler):
file_open = open_local_file
-def _is_local_authority(authority):
+def _is_local_authority(authority, resolve):
# Compare hostnames
if not authority or authority == 'localhost':
return True
@@ -1494,9 +1494,11 @@ def _is_local_authority(authority):
if authority == hostname:
return True
# Compare IP addresses
+ if not resolve:
+ return False
try:
address = socket.gethostbyname(authority)
- except (socket.gaierror, AttributeError):
+ except (socket.gaierror, AttributeError, UnicodeEncodeError):
return False
return address in FileHandler().get_names()
@@ -1641,13 +1643,16 @@ class DataHandler(BaseHandler):
return addinfourl(io.BytesIO(data), headers, url)
-# Code move from the old urllib module
+# Code moved from the old urllib module
-def url2pathname(url, *, require_scheme=False):
+def url2pathname(url, *, require_scheme=False, resolve_host=False):
"""Convert the given file URL to a local file system path.
The 'file:' scheme prefix must be omitted unless *require_scheme*
is set to true.
+
+ The URL authority may be resolved with gethostbyname() if
+ *resolve_host* is set to true.
"""
if require_scheme:
scheme, url = _splittype(url)
@@ -1655,7 +1660,7 @@ def url2pathname(url, *, require_scheme=False):
raise URLError("URL is missing a 'file:' scheme")
authority, url = _splithost(url)
if os.name == 'nt':
- if not _is_local_authority(authority):
+ if not _is_local_authority(authority, resolve_host):
# e.g. file://server/share/file.txt
url = '//' + authority + url
elif url[:3] == '///':
@@ -1669,7 +1674,7 @@ def url2pathname(url, *, require_scheme=False):
# Older URLs use a pipe after a drive letter
url = url[:1] + ':' + url[2:]
url = url.replace('/', '\\')
- elif not _is_local_authority(authority):
+ elif not _is_local_authority(authority, resolve_host):
raise URLError("file:// scheme is supported only on localhost")
encoding = sys.getfilesystemencoding()
errors = sys.getfilesystemencodeerrors()