class Baidubce::Http::BaseHttpClient
Public Instance Methods
send_request(config, signer, http_method, path, params, headers, body, save_path=nil, use_backup_endpoint=false, &block)
click to toggle source
Send request to BCE services.
# File lib/baidubce/http/base_http_client.rb, line 35 def send_request(config, signer, http_method, path, params, headers, body, save_path=nil, use_backup_endpoint=false, &block) headers[USER_AGENT] = sprintf( 'bce-sdk-ruby/%s/%s/%s', VERSION, RUBY_VERSION, RUBY_PLATFORM ) should_get_new_date = headers.has_key?(BCE_DATE) ? false : true url, headers[HOST] = Utils.parse_url_host(config, use_backup_endpoint) url += Utils.url_encode_except_slash(path) query_str = Utils.get_canonical_querystring(params, false) url += "?#{query_str}" unless query_str.to_s.empty? logger.info("url: #{url}, params: #{params}") set_content_length_header(headers, body, &block) headers[STS_SECURITY_TOKEN] = config.credentials.security_token unless config.credentials.security_token.to_s.empty? retries_attempted = 0 while true headers[BCE_DATE] = Time.now.utc.iso8601 if should_get_new_date headers[AUTHORIZATION] = signer.sign(config.credentials, http_method, path, headers, params) logger.debug("Request headers: #{headers}") args = { method: http_method, url: url, headers: headers, payload: body, open_timeout: config.open_timeout_in_millis / 1000.0, read_timeout: config.read_timeout_in_millis / 1000.0 } args[:payload] = BufWriter.new(&block) if block_given? begin if save_path logger.debug("Response save file path: #{save_path}") resp_headers = {} File.open(save_path, 'w+') { |f| block = proc { |response| response.read_body { |chunk| f << chunk } resp_headers = response.to_hash resp_headers.each { |k, v| resp_headers[k]=v[0] } raise BceHttpException.new(response.code.to_i, resp_headers, '', 'get_object_to_file exception') if response.code.to_i > 300 } block_arg = { block_response: block } args.merge! block_arg RestClient::Request.new(args).execute return '', resp_headers } else resp = RestClient::Request.new(args).execute logger.debug("Response code: #{resp.code}") logger.debug("Response headers: #{resp.headers.to_s}") return resp.body, resp.headers end rescue SocketError => err if config.retry_policy.should_retry(SOCKET_ERROR_CODE, retries_attempted) delay_in_millis = config.retry_policy.get_delay_before_next_retry_in_millis(retries_attempted) sleep(delay_in_millis / 1000.0) else raise BceClientException.new("SocketError: #{err}") end rescue BceHttpException, RestClient::ExceptionWithResponse => err logger.debug("ExceptionWithResponse: #{err.http_code}, #{err.http_body}, #{err.http_headers}, #{err.message}") if config.retry_policy.should_retry(err.http_code, retries_attempted) delay_in_millis = config.retry_policy.get_delay_before_next_retry_in_millis(retries_attempted) sleep(delay_in_millis / 1000.0) else request_id = err.http_headers[:x_bce_request_id] if err.is_a?(BceHttpException) err.http_body = File.read(save_path) request_id = err.http_headers['x-bce-request-id'] end msg = err.http_body if err.http_body.empty? msg = "{\"code\":\"#{err.http_code}\",\"message\":\"#{err.message}\",\"requestId\":\"#{request_id}\"}" end raise BceServerException.new(err.http_code, msg) end end retries_attempted += 1 end end
set_content_length_header(headers, body, &block)
click to toggle source
# File lib/baidubce/http/base_http_client.rb, line 125 def set_content_length_header(headers, body, &block) unless block_given? if body.to_s.empty? # headers[CONTENT_LENGTH] = 0 headers.delete(CONTENT_LENGTH) elsif body.instance_of?(String) body = body.encode('UTF-8') if body.encoding.name != 'UTF-8' headers[CONTENT_LENGTH] = body.bytesize elsif body.instance_of?(File) headers[CONTENT_LENGTH] = body.size() else headers[CONTENT_LENGTH] = ObjectSpace.memsize_of(body) end end end