Skip to content

Commit e354b72

Browse files
committed
Move _get_http_response_filename to network.download
1 parent 762e4a0 commit e354b72

File tree

2 files changed

+31
-27
lines changed

2 files changed

+31
-27
lines changed

src/pip/_internal/network/download.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,19 @@
22
"""
33
import cgi
44
import logging
5+
import mimetypes
56
import os
67

78
from pip._vendor.requests.models import CONTENT_CHUNK_SIZE
89

910
from pip._internal.models.index import PyPI
1011
from pip._internal.network.cache import is_from_cache
1112
from pip._internal.network.utils import response_chunks
12-
from pip._internal.utils.misc import format_size, redact_auth_from_url
13+
from pip._internal.utils.misc import (
14+
format_size,
15+
redact_auth_from_url,
16+
splitext,
17+
)
1318
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
1419
from pip._internal.utils.ui import DownloadProgressProvider
1520

@@ -96,3 +101,27 @@ def parse_content_disposition(content_disposition, default_filename):
96101
# in case the filename contains ".." path parts.
97102
filename = sanitize_content_filename(filename)
98103
return filename or default_filename
104+
105+
106+
def _get_http_response_filename(resp, link):
107+
# type: (Response, Link) -> str
108+
"""Get an ideal filename from the given HTTP response, falling back to
109+
the link filename if not provided.
110+
"""
111+
filename = link.filename # fallback
112+
# Have a look at the Content-Disposition header for a better guess
113+
content_disposition = resp.headers.get('content-disposition')
114+
if content_disposition:
115+
filename = parse_content_disposition(content_disposition, filename)
116+
ext = splitext(filename)[1] # type: Optional[str]
117+
if not ext:
118+
ext = mimetypes.guess_extension(
119+
resp.headers.get('content-type', '')
120+
)
121+
if ext:
122+
filename += ext
123+
if not ext and link.url != resp.url:
124+
ext = os.path.splitext(resp.url)[1]
125+
if ext:
126+
filename += ext
127+
return filename

src/pip/_internal/operations/prepare.py

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@
2828
VcsHashUnsupported,
2929
)
3030
from pip._internal.network.download import (
31+
_get_http_response_filename,
3132
_prepare_download,
32-
parse_content_disposition,
3333
)
3434
from pip._internal.network.session import PipSession
3535
from pip._internal.utils.compat import expanduser
@@ -45,7 +45,6 @@
4545
normalize_path,
4646
path_to_display,
4747
rmtree,
48-
splitext,
4948
)
5049
from pip._internal.utils.temp_dir import TempDirectory
5150
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
@@ -307,30 +306,6 @@ def unpack_url(
307306
)
308307

309308

310-
def _get_http_response_filename(resp, link):
311-
# type: (Response, Link) -> str
312-
"""Get an ideal filename from the given HTTP response, falling back to
313-
the link filename if not provided.
314-
"""
315-
filename = link.filename # fallback
316-
# Have a look at the Content-Disposition header for a better guess
317-
content_disposition = resp.headers.get('content-disposition')
318-
if content_disposition:
319-
filename = parse_content_disposition(content_disposition, filename)
320-
ext = splitext(filename)[1] # type: Optional[str]
321-
if not ext:
322-
ext = mimetypes.guess_extension(
323-
resp.headers.get('content-type', '')
324-
)
325-
if ext:
326-
filename += ext
327-
if not ext and link.url != resp.url:
328-
ext = os.path.splitext(resp.url)[1]
329-
if ext:
330-
filename += ext
331-
return filename
332-
333-
334309
def _http_get_download(session, link):
335310
# type: (PipSession, Link) -> Response
336311
target_url = link.url.split('#', 1)[0]

0 commit comments

Comments
 (0)