@@ -211,27 +211,28 @@ def get_docker_image_platform(docker_reference):
211211 )
212212
213213
214- def fetch_docker_image (docker_reference , to = None ):
214+ def fetch_docker_image (download_url , to = None ):
215215 """
216- Fetch a docker image from the provided Docker image `docker_reference`
217- docker:// reference URL. Return a `download` object.
216+ Fetch a docker image from the provided Docker image `download_url`,
217+ using the "docker://reference" URL syntax.
218+ Return a `Download` object.
218219
219220 Docker references are documented here:
220221 https://github.com/containers/skopeo/blob/0faf16017/docs/skopeo.1.md#image-names
221222 """
222223 whitelist = r"^docker://[a-zA-Z0-9_.:/@-]+$"
223- if not re .match (whitelist , docker_reference ):
224+ if not re .match (whitelist , download_url ):
224225 raise ValueError ("Invalid Docker reference." )
225226
226- name = python_safe_name ( docker_reference .replace ("docker://" , "" ) )
227- filename = f"{ name } .tar"
227+ reference = download_url .replace ("docker://" , "" )
228+ filename = f"{ python_safe_name ( reference ) } .tar"
228229 download_directory = to or tempfile .mkdtemp ()
229230 output_file = Path (download_directory , filename )
230231 target = f"docker-archive:{ output_file } "
231232 skopeo_executable = _get_skopeo_location ()
232233
233234 platform_args = []
234- if platform := get_docker_image_platform (docker_reference ):
235+ if platform := get_docker_image_platform (download_url ):
235236 os , arch , variant = platform
236237 if os :
237238 platform_args .append (f"--override-os={ os } " )
@@ -245,7 +246,7 @@ def fetch_docker_image(docker_reference, to=None):
245246 "copy" ,
246247 "--insecure-policy" ,
247248 * platform_args ,
248- docker_reference ,
249+ download_url ,
249250 target ,
250251 )
251252 logger .info (f"Fetching image with: { cmd_args } " )
@@ -255,7 +256,7 @@ def fetch_docker_image(docker_reference, to=None):
255256 checksums = multi_checksums (output_file , ("md5" , "sha1" ))
256257
257258 return Download (
258- uri = docker_reference ,
259+ uri = download_url ,
259260 directory = download_directory ,
260261 filename = filename ,
261262 path = output_file ,
@@ -265,16 +266,30 @@ def fetch_docker_image(docker_reference, to=None):
265266 )
266267
267268
268- def _get_fetcher (url ):
269- """Return the fetcher function based on the provided `url`."""
270- if url .startswith ("docker://" ):
271- return fetch_docker_image
272- return fetch_http
269+ SCHEME_TO_FETCHER_MAPPING = {
270+ "http" : fetch_http ,
271+ "https" : fetch_http ,
272+ "docker" : fetch_docker_image ,
273+ }
274+
275+
276+ def get_fetcher (url ):
277+ """Return the fetcher function based on the provided `url` scheme."""
278+ # Not using `urlparse(url).scheme` for the scheme as it converts to lower case.
279+ scheme = url .split ("://" )[0 ]
280+
281+ if fetcher := SCHEME_TO_FETCHER_MAPPING .get (scheme ):
282+ return fetcher
283+
284+ error_msg = f"URL scheme '{ scheme } ' is not supported."
285+ if scheme .lower () in SCHEME_TO_FETCHER_MAPPING :
286+ error_msg += f" Did you mean: '{ scheme .lower ()} '?"
287+ raise ValueError (error_msg )
273288
274289
275290def fetch_url (url ):
276291 """Fetch provided `url` and returns the result as a `Download` object."""
277- fetcher = _get_fetcher (url )
292+ fetcher = get_fetcher (url )
278293 logger .info (f'Fetching "{ url } " using { fetcher .__name__ } ' )
279294 downloaded = fetcher (url )
280295 return downloaded
0 commit comments