2424from django .utils .timezone import localtime
2525from requests .adapters import HTTPAdapter
2626from requests .auth import HTTPBasicAuth
27- from six .moves .urllib_parse import urljoin
2827
2928from bkstorages .exceptions import DownloadFailedError , ObjectAlreadyExists , RequestError , UploadFailedError
3029from bkstorages .utils import clean_name , get_available_overwrite_name , get_setting , safe_join , setting
@@ -92,7 +91,7 @@ def upload_fileobj(self, fh, key: str, allow_overwrite: bool = True, **kwargs):
9291 :param bool allow_overwrite: 是否覆盖已存在文件
9392 """
9493 client = self .get_client ()
95- url = urljoin (self .endpoint_url , f'/ generic/{ self .project } /{ self .bucket } /{ key } ' )
94+ url = safe_join (self .endpoint_url , f'generic/{ self .project } /{ self .bucket } /{ key } ' )
9695 src = getattr (fh , "name" , "<memory>" )
9796 headers = {"X-BKREPO-OVERWRITE" : str (allow_overwrite )}
9897
@@ -127,7 +126,7 @@ def download_fileobj(self, key: str, fh, *args, **kwargs):
127126 :param IO fh: 文件句柄
128127 """
129128 client = self .get_client ()
130- url = urljoin (self .endpoint_url , f'/ generic/{ self .project } /{ self .bucket } /{ key } ' )
129+ url = safe_join (self .endpoint_url , f'generic/{ self .project } /{ self .bucket } /{ key } ' )
131130 dest = getattr (fh , "name" , "<memory>" )
132131 try :
133132 resp = client .get (url , stream = True , timeout = TIMEOUT_THRESHOLD )
@@ -156,14 +155,14 @@ def delete_file(self, key: str, *args, **kwargs):
156155 :param str key: 文件完整路径
157156 """
158157 client = self .get_client ()
159- url = urljoin (self .endpoint_url , f'/ generic/{ self .project } /{ self .bucket } /{ key } ' )
158+ url = safe_join (self .endpoint_url , f'generic/{ self .project } /{ self .bucket } /{ key } ' )
160159 resp = client .delete (url , timeout = TIMEOUT_THRESHOLD )
161160 self ._validate_resp (resp )
162161
163162 def get_file_metadata (self , key : str , * args , ** kwargs ) -> Dict :
164163 """具体返回值请看 bk-repo 的文档."""
165164 client = self .get_client ()
166- url = urljoin (self .endpoint_url , f'/ generic/{ self .project } /{ self .bucket } /{ key } ' )
165+ url = safe_join (self .endpoint_url , f'generic/{ self .project } /{ self .bucket } /{ key } ' )
167166 resp = client .head (url , timeout = TIMEOUT_THRESHOLD )
168167 if resp .status_code == 200 :
169168 return dict (resp .headers )
@@ -178,7 +177,7 @@ def build_download_url(self, key: str, force_download: bool = False) -> str:
178177 while key .startswith ("/" ):
179178 key = key [1 :]
180179 download = "true" if force_download else "false"
181- url = urljoin (self .endpoint_url , f'/ generic/{ self .project } /{ self .bucket } /{ key } ?download={ download } ' )
180+ url = safe_join (self .endpoint_url , f'generic/{ self .project } /{ self .bucket } /{ key } ?download={ download } ' )
182181 return url
183182
184183 def generate_presigned_url (self , key : str , expires_in : int , token_type : str = "DOWNLOAD" , * args , ** kwargs ) -> str :
@@ -189,7 +188,7 @@ def generate_presigned_url(self, key: str, expires_in: int, token_type: str = "D
189188 :param str token_type: token类型。UPLOAD:允许上传, DOWNLOAD: 允许下载, ALL: 同时允许上传和下载。
190189 """
191190 client = self .get_client ()
192- url = urljoin (self .endpoint_url , '/ generic/temporary/url/create' )
191+ url = safe_join (self .endpoint_url , 'generic/temporary/url/create' )
193192
194193 resp = client .post (
195194 url ,
@@ -210,7 +209,7 @@ def generate_presigned_url(self, key: str, expires_in: int, token_type: str = "D
210209 if str (e .code ) != '250102' :
211210 raise
212211 logger .warning ("BKREPO中不存在该文件, 避免报错仅拼接 url " )
213- return urljoin (self .endpoint_url , f'/ generic/temporary/token/download/{ self .project } /{ self .bucket } /{ key } ' )
212+ return safe_join (self .endpoint_url , f'generic/temporary/token/download/{ self .project } /{ self .bucket } /{ key } ' )
214213
215214 def list_dir (self , key_prefix : str ) -> Tuple [List , List ]:
216215 """
@@ -234,7 +233,7 @@ def __list_dir(self, key_prefix: str, cur_page: int = 1) -> Tuple[List, List, bo
234233 """
235234 directories , files = [], []
236235 client = self .get_client ()
237- url = urljoin (self .endpoint_url , f"/ repository/api/node/page/{ self .project } /{ self .bucket } /{ key_prefix } " )
236+ url = safe_join (self .endpoint_url , f"repository/api/node/page/{ self .project } /{ self .bucket } /{ key_prefix } " )
238237 # NOTE: 按分页查询 bkrepo 的文件数, 1000 是一个经验值, 设置仅可能大的数值是避免发送太多次请求到 bk-repo
239238 params = {"pageSize" : 1000 , "pageNumber" : cur_page , "includeFolder" : True }
240239 resp = client .get (url , params = params , timeout = TIMEOUT_THRESHOLD )
@@ -250,7 +249,7 @@ def __list_dir(self, key_prefix: str, cur_page: int = 1) -> Tuple[List, List, bo
250249 def get_bucket_metadata (self ) -> Dict :
251250 """查询仓库信息"""
252251 client = self .get_client ()
253- url = urljoin (self .endpoint_url , f"/ repository/api/repo/info/{ self .project } /{ self .bucket } /GENERIC" )
252+ url = safe_join (self .endpoint_url , f"repository/api/repo/info/{ self .project } /{ self .bucket } /GENERIC" )
254253 resp = client .get (url )
255254 data = self ._validate_resp (resp )
256255 return data
0 commit comments