Class: Stacktor::Core::Request

Inherits:
Object
  • Object
show all
Defined in:
lib/stacktor/core/request.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opts) ⇒ Request

Returns a new instance of Request.



28
29
30
# File 'lib/stacktor/core/request.rb', line 28

def initialize(opts)
  @options = opts
end

Class Method Details

.connection_for(uri) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/stacktor/core/request.rb', line 9

def self.connection_for(uri)
  @connections ||= {}

  host = uri.host
  port = uri.port
  secure = uri.scheme == 'https'

  if @connections[ [host, port, secure] ].nil?
    c = Net::HTTP.new(host, port)
    c.use_ssl = secure
    c.verify_mode = OpenSSL::SSL::VERIFY_NONE
    c.start
    @connections[ [host, port, secure] ] = c
  else
    c = @connections[ [host, port, secure] ]
  end
  return c
end

Instance Method Details

#dataObject



45
46
47
# File 'lib/stacktor/core/request.rb', line 45

def data
  @options[:data]
end

#do_stream_response?Boolean

Returns:

  • (Boolean)


54
55
56
# File 'lib/stacktor/core/request.rb', line 54

def do_stream_response?
  !@options[:response_handler].nil?
end

#executeObject



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/stacktor/core/request.rb', line 63

def execute
  data = self.data
  uri = URI(self.url)
  conn = self.class.connection_for(uri)
  req_kls = Net::HTTP.const_get(self.method.capitalize)
  headers = self.headers
  resp_fn = @options[:response_handler]

  if self.method == "GET"
    uri.query = data.to_query unless data.nil?
    req = req_kls.new(uri.request_uri, headers)
  else
    data_reg = data_stream = nil
    if data.is_a?(Hash)
      data_reg = data.to_json
    elsif data.respond_to?(:read)
      data_stream = data
      headers['Content-Length'] = data.size.to_s
    else
      data_reg = data
    end
    req = req_kls.new(uri.path, headers)
    req.body_stream = data_stream unless data_stream.nil?
    req.body = data_reg unless data_reg.nil?
  end
  if resp_fn.nil?
    @resp = conn.request(req)
  else
    @resp = conn.request(req) do |r|
      r.read_body do |bytes|
        resp_fn.call(bytes)
      end
    end
  end
  return self.to_response_hash
end

#headersObject



42
43
44
# File 'lib/stacktor/core/request.rb', line 42

def headers
  @options[:headers]
end

#methodObject



39
40
41
# File 'lib/stacktor/core/request.rb', line 39

def method
  @options[:method]
end

#optionsObject



32
33
34
# File 'lib/stacktor/core/request.rb', line 32

def options
  @options
end

#responseObject



51
52
53
# File 'lib/stacktor/core/request.rb', line 51

def response
  @resp
end

#response=(resp) ⇒ Object



48
49
50
# File 'lib/stacktor/core/request.rb', line 48

def response=(resp)
  @resp = resp
end

#success?Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/stacktor/core/request.rb', line 58

def success?
  @resp && !@resp.code.match(/^20.$/).nil?
end

#to_response_hashObject



100
101
102
103
104
105
106
107
108
109
110
# File 'lib/stacktor/core/request.rb', line 100

def to_response_hash
  return nil if @resp.nil?
  success = self.success?
  ret = {success: success, code: @resp.code, request: self, response: @resp}
  if self.do_stream_response? && success
    ret[:body] = nil
  else
    ret[:body] = @resp.body
  end
  return ret
end

#urlObject



36
37
38
# File 'lib/stacktor/core/request.rb', line 36

def url
  @options[:url]
end