code: def unpack_url(
      link,  # type: Optional[Link]
      location,  # type: Optional[str]
      download_dir=None,  # type: Optional[str]
      only_download=False,  # type: bool
      session=None,  # type: Optional[PipSession]
      hashes=None,  # type: Optional[Hashes]
      progress_bar="on"  # type: str
  ):
      # type: (...) -> None
      
      # non-editable vcs urls
      if is_vcs_url(link):
          unpack_vcs_link(link, location)
  
      # file urls
      elif is_file_url(link):
          unpack_file_url(link, location, download_dir, hashes=hashes)
  
      # http urls
      else:
          if session is None:
              session = PipSession()
  
          unpack_http_url(
              link,
              location,
              download_dir,
              session,
              hashes=hashes,
              progress_bar=progress_bar
          )
      if only_download:
          write_delete_marker_file(location)
docs: Unpack link.
         If link is a VCS link:
           if only_download, export into download_dir and ignore location
            else unpack into location
         for other types of link:
           - unpack into location
           - if download_dir, copy the file into download_dir
           - if only_download, mark location for deletion
  
      :param hashes: A Hashes object, one of whose embedded hashes must match,
          or HashMismatch will be raised. If the Hashes is empty, no matches are
          required, and unhashable types of requirements (like VCS ones, which
          would ordinarily raise HashUnsupported) are allowed.