@@ -494,6 +494,11 @@ class Distribution(NameVer):
494494 metadata = dict (help = "Extra data" ),
495495 )
496496
497+ credentials = attr .ib (
498+ type = dict ,
499+ default = None ,
500+ )
501+
497502 @property
498503 def package_url (self ):
499504 """
@@ -565,6 +570,7 @@ def download(
565570 fetch_and_save (
566571 path_or_url = self .path_or_url ,
567572 dest_dir = dest_dir ,
573+ credentials = self .credentials ,
568574 filename = self .filename ,
569575 as_text = False ,
570576 verbose = verbose ,
@@ -1387,6 +1393,8 @@ class PypiSimpleRepository:
13871393 repr = False ,
13881394 )
13891395
1396+ credentials = attr .ib (type = dict , default = None )
1397+
13901398 def _get_package_versions_map (
13911399 self ,
13921400 name ,
@@ -1483,6 +1491,7 @@ def fetch_links(
14831491 package_url = f"{ self .index_url } /{ normalized_name } "
14841492 text = CACHE .get (
14851493 path_or_url = package_url ,
1494+ credentials = self .credentials ,
14861495 as_text = True ,
14871496 force = not self .use_cached_index ,
14881497 verbose = verbose ,
@@ -1520,6 +1529,7 @@ def __attrs_post_init__(self):
15201529
15211530 def get (
15221531 self ,
1532+ credentials ,
15231533 path_or_url ,
15241534 as_text = True ,
15251535 force = False ,
@@ -1540,6 +1550,7 @@ def get(
15401550 print (f" FILE CACHE MISS: { path_or_url } " )
15411551 content = get_file_content (
15421552 path_or_url = path_or_url ,
1553+ credentials = credentials ,
15431554 as_text = as_text ,
15441555 verbose = verbose ,
15451556 echo_func = echo_func ,
@@ -1559,6 +1570,7 @@ def get(
15591570
15601571def get_file_content (
15611572 path_or_url ,
1573+ credentials ,
15621574 as_text = True ,
15631575 verbose = False ,
15641576 echo_func = None ,
@@ -1572,6 +1584,7 @@ def get_file_content(
15721584 print (f"Fetching: { path_or_url } " )
15731585 _headers , content = get_remote_file_content (
15741586 url = path_or_url ,
1587+ credentials = credentials ,
15751588 as_text = as_text ,
15761589 verbose = verbose ,
15771590 echo_func = echo_func ,
@@ -1606,6 +1619,7 @@ class RemoteNotFetchedException(Exception):
16061619
16071620def get_remote_file_content (
16081621 url ,
1622+ credentials ,
16091623 as_text = True ,
16101624 headers_only = False ,
16111625 headers = None ,
@@ -1631,7 +1645,20 @@ def get_remote_file_content(
16311645 echo_func = print
16321646 if verbose :
16331647 echo_func (f"DOWNLOADING: { url } " )
1634- with requests .get (url , allow_redirects = True , stream = True , headers = headers ) as response :
1648+
1649+ auth = None
1650+ if credentials :
1651+ auth = (credentials .get ("login" ), credentials .get ("password" ))
1652+
1653+ stream = requests .get (
1654+ url ,
1655+ allow_redirects = True ,
1656+ stream = True ,
1657+ headers = headers ,
1658+ auth = auth ,
1659+ )
1660+
1661+ with stream as response :
16351662 status = response .status_code
16361663 if status != requests .codes .ok : # NOQA
16371664 if status == 429 and _delay < 20 :
@@ -1640,6 +1667,7 @@ def get_remote_file_content(
16401667
16411668 return get_remote_file_content (
16421669 url ,
1670+ credentials = credentials ,
16431671 as_text = as_text ,
16441672 headers_only = headers_only ,
16451673 _delay = increased_delay ,
@@ -1658,6 +1686,7 @@ def fetch_and_save(
16581686 path_or_url ,
16591687 dest_dir ,
16601688 filename ,
1689+ credentials ,
16611690 as_text = True ,
16621691 verbose = False ,
16631692 echo_func = None ,
@@ -1670,6 +1699,7 @@ def fetch_and_save(
16701699 """
16711700 content = CACHE .get (
16721701 path_or_url = path_or_url ,
1702+ credentials = credentials ,
16731703 as_text = as_text ,
16741704 verbose = verbose ,
16751705 echo_func = echo_func ,
0 commit comments