Class: QingStor::SDK::Request

Inherits:
Object
  • Object
show all
Defined in:
lib/qingstor/sdk/request/request.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(input) ⇒ Request

Returns a new instance of Request.



29
30
31
# File 'lib/qingstor/sdk/request/request.rb', line 29

def initialize(input)
  self.input = Preprocessor.preprocess input
end

Instance Attribute Details

#http_requestObject

Returns the value of attribute http_request.



27
28
29
# File 'lib/qingstor/sdk/request/request.rb', line 27

def http_request
  @http_request
end

#http_responseObject

Returns the value of attribute http_response.



27
28
29
# File 'lib/qingstor/sdk/request/request.rb', line 27

def http_response
  @http_response
end

#inputObject

Returns the value of attribute input.



27
28
29
# File 'lib/qingstor/sdk/request/request.rb', line 27

def input
  @input
end

#request_urlObject

Returns the value of attribute request_url.



27
28
29
# File 'lib/qingstor/sdk/request/request.rb', line 27

def request_url
  @request_url
end

Instance Method Details

#buildObject



72
73
74
75
76
77
78
79
80
81
82
83
84
85
# 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

#sendObject



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 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

#signObject



54
55
56
57
58
59
60
61
# 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) ⇒ Object



63
64
65
66
67
68
69
70
# 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

#unpackObject



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# 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