class QingStor::SDK::Request

Attributes

http_request[RW]
http_response[RW]
input[RW]
request_url[RW]

Public Class Methods

new(input) click to toggle source
# File lib/qingstor/sdk/request/request.rb, line 29
def initialize(input)
  self.input = Preprocessor.preprocess input
end

Public Instance Methods

build() click to toggle source
# File lib/qingstor/sdk/request/request.rb, line 72
def build
  params           = input[:request_params].map { |k, v| "#{k}=#{v}" }
  query_string     = params.join '&'
  if query_string && !query_string.empty?
    query_string = "#{input[:request_uri].include?('?') ? '&' : '?'}#{query_string}"
  end
  self.request_url = "#{input[:request_endpoint]}#{input[:request_uri]}#{query_string}"

  request      = new_http_request input[:request_method], request_url
  request.body = input[:request_body]
  input[:request_headers].each { |k, v| request[k.to_s] = v }

  self.http_request = request
end
send() click to toggle source
# File lib/qingstor/sdk/request/request.rb, line 33
def send
  check
  sign
  build

  retries = input[:config][:connection_retries]
  while
    begin
      Logger.info "Sending QingStor request: [#{input[:id]}] #{request_url}"
      self.http_response = input[:config].connection.request request_url, http_request
    rescue SocketError
      retries > 0 ? retries -= 1 : (raise NetworkError)
      sleep 1
      next
    end
    break
  end

  unpack
end
sign() click to toggle source
# File lib/qingstor/sdk/request/request.rb, line 54
def sign
  check
  if Signer.is_anonymous? input
    Logger.warn 'anonymous api call, skip sign'
    return
  end
  self.input = Signer.sign input
end
sign_query(timeout_seconds) click to toggle source
# File lib/qingstor/sdk/request/request.rb, line 63
def sign_query(timeout_seconds)
  check
  if Signer.is_anonymous? input
    Logger.warn 'anonymous api call, skip sign query'
    return
  end
  self.input = Signer.sign_query input, Time.now.to_i + timeout_seconds
end
unpack() click to toggle source
# File lib/qingstor/sdk/request/request.rb, line 87
def unpack
  output = {}
  output['status_code'] = http_response.code.to_i

  http_response.each_header { |k, v| output[k.tr('-', '_')] = v }
  if http_response['Content-Type'].include? 'application/json'
    unless http_response.body.nil?
      JSON.parse(http_response.body).each { |k, v| output[k] = v }
    end
  else
    output[:body] = http_response.body
  end

  display = {}
  output.each { |k, v| display[k] = v unless k.to_s == 'body' }
  Logger.info "Parse QingStor response: [#{input[:id]}] #{display}"
  output.deep_symbolize_keys!
end

Private Instance Methods

check() click to toggle source
# File lib/qingstor/sdk/request/request.rb, line 108
def check
  # ak and sk should be both set or not set
  if input[:config][:access_key_id].blank? && input[:config][:secret_access_key].present?
    raise SDKError, 'access key not provided'
  end
  if input[:config][:secret_access_key].blank? && input[:config][:access_key_id].present?
    raise SDKError, 'secret access key not provided'
  end
end
new_http_request(method, url) click to toggle source
# File lib/qingstor/sdk/request/request.rb, line 118
def new_http_request(method, url)
  case method
  when 'GET'
    Net::HTTP::Get.new url
  when 'POST'
    Net::HTTP::Post.new url
  when 'PUT'
    Net::HTTP::Put.new url
  when 'HEAD'
    Net::HTTP::Head.new url
  when 'DELETE'
    Net::HTTP::Delete.new url
  when 'OPTIONS'
    Net::HTTP::Options.new url
  else
    Logger.error "Request method \"#{method}\" not supported, fallback to GET``"
    Net::HTTP::Get.new url
  end
end