def send_request(self, method, bucket, cos_path, **kwargs): """ 发送http请求 :param method: :param bucket: :param cos_path: :param args: :return: """ url = self._build_url(bucket, cos_path) logger.debug("sending request, method: %s, bucket: %s, cos_path: %s" % (method, bucket, cos_path)) try: if method == 'POST': http_resp = self._http_session.post(url, verify=False, **kwargs) else: http_resp = self._http_session.get(url, verify=False, **kwargs) status_code = http_resp.status_code if status_code < 500: return http_resp.json() else: logger.warning("request failed, response message: %s" % http_resp.text) err_detail = 'url:%s, status_code:%d' % (url, status_code) return CosErr.get_err_msg(CosErr.NETWORK_ERROR, err_detail) except Exception as e: logger.exception("request failed, return SERVER_ERROR") err_detail = 'url:%s, exception:%s traceback:%s' % (url, str(e), format_exc()) return CosErr.get_err_msg(CosErr.SERVER_ERROR, err_detail)
def _check_params(self, request): if not self._cred.check_params_valid(): return CosErr.get_err_msg(CosErr.PARAMS_ERROR, self._cred.get_err_tips()) if not request.check_params_valid(): return CosErr.get_err_msg(CosErr.PARAMS_ERROR, request.get_err_tips()) return None
def _check_params(self, request): """检查用户输入参数, 检查通过返回None, 否则返回一个代表错误原因的dict :param request: :return: """ if not self._cred.check_params_valid(): return CosErr.get_err_msg(CosErr.PARAMS_ERROR, self._cred.get_err_tips()) if not request.check_params_valid(): return CosErr.get_err_msg(CosErr.PARAMS_ERROR, request.get_err_tips()) return None
def send_request(self, method, bucket, cos_path, **args): url = self._build_url(bucket, cos_path) http_resp = {} try: if method == 'POST': http_resp = self._http_session.post(url, verify=False, **args) else: http_resp = self._http_session.get(url, verify=False, **args) status_code = http_resp.status_code if (status_code == 200 or status_code == 400): return http_resp.json() else: err_detail = 'url:%s, status_code:%d' % (url, status_code) return CosErr.get_err_msg(CosErr.NETWORK_ERROR, err_detail) except Exception as e: err_detail = 'url:%s, exception:%s' % (url, repr(e)) return CosErr.get_err_msg(CosErr.SERVER_ERROR, err_detail)
def upload_single_file(self, request): """ 单文件上传 :param request: :return: """ assert isinstance(request, UploadFileRequest) check_params_ret = self._check_params(request) if check_params_ret is not None: return check_params_ret local_path = request.get_local_path() file_size = os.path.getsize(local_path) # 判断文件是否超过单文件最大上限, 如果超过则返回错误 # 并提示用户使用别的接口 if file_size > self.max_single_file: return CosErr.get_err_msg(CosErr.NETWORK_ERROR, 'file is too big, please use upload_file interface') auth = cos_auth.Auth(self._cred) bucket = request.get_bucket_name() cos_path = request.get_cos_path() expired = int(time.time()) + self._expired_period sign = auth.sign_more(bucket, cos_path, expired) http_header = dict() http_header['Authorization'] = sign http_header['User-Agent'] = self._config.get_user_agent() with open(local_path, 'rb') as f: file_content = f.read() http_body = dict() http_body['op'] = 'upload' http_body['filecontent'] = file_content http_body['sha'] = FileOp._sha1_content(file_content) http_body['biz_attr'] = request.get_biz_attr() http_body['insertOnly'] = str(request.get_insert_only()) timeout = self._config.get_timeout() ret = self.send_request('POST', bucket, cos_path, headers=http_header, files=http_body, timeout=timeout) if request.get_insert_only() != 0: return ret if ret[u'code'] == 0: return ret # try to delete object, and re-post request del_request = DelFileRequest(bucket_name=request.get_bucket_name(), cos_path=request.get_cos_path()) ret = self.del_file(del_request) if ret[u'code'] == 0: return self.send_request('POST', bucket, cos_path, headers=http_header, files=http_body, timeout=timeout) else: return ret
def upload_single_file_from_buffer(self, request): """ 单文件上传 :param request: :return: """ assert isinstance(request, UploadFileFromBufferRequest) check_params_ret = self._check_params(request) if check_params_ret is not None: return check_params_ret data = request.get_data() file_size = len(data) # 判断文件是否超过单文件最大上限, 如果超过则返回错误 # 并提示用户使用别的接口 if file_size > self.max_single_file: return CosErr.get_err_msg( CosErr.NETWORK_ERROR, 'file is too big, please use upload_file interface') auth = cos_auth.Auth(self._cred) bucket = request.get_bucket_name() cos_path = request.get_cos_path() expired = int(time.time()) + self._expired_period sign = auth.sign_more(bucket, cos_path, expired) http_header = dict() http_header['Authorization'] = sign http_header['User-Agent'] = self._config.get_user_agent() file_content = data http_body = dict() http_body['op'] = 'upload' http_body['filecontent'] = file_content http_body['sha'] = FileOp._sha1_content(file_content) http_body['biz_attr'] = request.get_biz_attr() http_body['insertOnly'] = str(request.get_insert_only()) timeout = self._config.get_timeout() ret = self.send_request('POST', bucket, cos_path, headers=http_header, files=http_body, timeout=timeout) return ret