class TencentCloud::Common::AbstractClient
common client
def build_req(action, params, req, options = {})
def build_req(action, params, req, options = {}) if %w[HmacSHA1 HmacSHA256].include? @profile.sign_method build_req_with_v1_signature(action, params, req) elsif @profile.sign_method == 'TC3-HMAC-SHA256' || options['IsMultipart'] build_req_with_v3_signature(action, params, req, options) else raise TencentCloudSDKException.new('ClientError', 'Invalid signature method') end end
def build_req_with_v1_signature(action, params, req)
def build_req_with_v1_signature(action, params, req) params = AbstractModel.format_params(nil, params) params['Action'] = action params['RequestClient'] = "SDK_RUBY_#{@sdk_version}" params['Nonce'] = Random.rand(1..1 << 32) params['Timestamp'] = Time.now.to_i params['Version'] = @api_version params['Region'] = @region params['Token'] = @credential.token if @credential.token params['SecretId'] = @credential.secret_id params['SignatureMethod'] = @profile.sign_method params['Language'] = @profile.language params['Signature'] = Sign.sign_v1(@profile.http_profile.req_method, endpoint, req.uri, params, @credential.secret_key, @profile.sign_method) req.data = URI.encode_www_form(params) req.header['Content-Type'] = FORM_URLENCODED_CONTENT end
def build_req_with_v3_signature(action, params, req, options = {})
def build_req_with_v3_signature(action, params, req, options = {}) content_type = req.method == 'GET' ? FORM_URLENCODED_CONTENT : JSON_CONTENT content_type = MULTIPART_CONTENT if options['IsMultipart'] timestamp = Time.now.to_i req.header['Content-Type'] = content_type req.header['Host'] = endpoint req.header['X-TC-Action'] = action req.header['X-TC-Timestamp'] = timestamp req.header['X-TC-Version'] = @api_version req.header['X-TC-Region'] = @region req.header['X-TC-Language'] = @profile.language req.header['X-TC-Token'] = @credential.token if @credential.token req.header['X-TC-Content-SHA256'] = 'UNSIGNED-PAYLOAD' if @profile.unsigned_payload req.header['X-TC-TraceId'] = SecureRandom.uuid if req.method == 'GET' params = AbstractModel.format_params(nil, params) req.data = URI.encode_www_form(params) canonical_querystring = req.data payload = '' else case content_type when JSON_CONTENT req.data = JSON.generate(params, { 'ascii_only' => true, 'space' => ' ' }) when MULTIPART_CONTENT binparas = options['binparas'] || [] boundary = SecureRandom.hex req.header['Content-Type'] += '; boundary=' + boundary body = '' params.each do |k, v| body += "--#{boundary}\r\n" body += "Content-Disposition: form-data; name=\"#{k}\"" if binparas.include? k body += "; filename=\"File\"\r\n" else body += "\r\n" if v.is_a?(Array) || v.is_a?(Hash) v = JSON.generate(v, { 'ascii_only' => true, 'space' => ' ' }) body += "Content-Type: application/json\r\n" end end body += "\r\n#{v}\r\n" end body += "--#{boundary}--\r\n" unless body.empty? req.data = body # req.is_multipart = options['IsMultipart'] else raise TencentCloudSDKException.new('ContentTypeError', "Unsupported content type: #{content_type}") end payload = req.data canonical_querystring = '' end payload = 'UNSIGNED-PAYLOAD' if @profile.unsigned_payload hashed_payload = Digest::SHA256.hexdigest(payload) authorization = Sign.sign_v3(content_type, endpoint, @profile.http_profile.req_method, req.uri, canonical_querystring, hashed_payload, req.header['X-TC-Timestamp'], @credential.secret_id, @credential.secret_key) req.header['Authorization'] = authorization end
def endpoint
def endpoint @profile.http_profile.endpoint || @endpoint end
def initialize(credential, region, api_version, api_endpoint, sdk_version, profile = nil)
def initialize(credential, region, api_version, api_endpoint, sdk_version, profile = nil) raise TencentCloudSDKException.new('InvalidCredential', 'Credential is None or invalid') unless credential @credential = credential @region = region @api_version = api_version @endpoint = api_endpoint @sdk_version = sdk_version @profile = profile || ClientProfile.new @request = ApiRequset.new(@profile.http_profile.scheme, endpoint, nil, @profile.http_profile.req_timeout, @profile.http_profile.proxy) end
def send_request(action, params, options = {})
def send_request(action, params, options = {}) request_data = BaseRequest.new(@profile.http_profile.scheme, endpoint, @profile.http_profile.req_method, REQUEST_PATH) build_req(action, params, request_data, options) logger.debug("Request: [\n#{request_data.to_s}]") if @profile.debug resp = @request.send_request(request_data) logger.debug("Response: [\n#{resp.to_s}]") if @profile.debug raise TencentCloudSDKException.new('ServerNetworkError', resp.data) if resp.code != '200' resp.data end