Class: Fastbeans::Request
- Inherits:
-
Object
- Object
- Fastbeans::Request
- Defined in:
- lib/fastbeans/request.rb
Constant Summary collapse
- RESPONSE_READ_TIMEOUT =
120- OPTION_KEYS =
[:timeout]
Instance Attribute Summary collapse
-
#connection ⇒ Object
readonly
Returns the value of attribute connection.
Instance Method Summary collapse
- #build_payload(call_data) ⇒ Object
-
#initialize(connection, opts = {}) ⇒ Request
constructor
A new instance of Request.
- #perform(call_data) ⇒ Object
- #read_response(sock, call_data) ⇒ Object
- #sign(call_data) ⇒ Object
- #write_payload(sock, payload) ⇒ Object
Constructor Details
#initialize(connection, opts = {}) ⇒ Request
Returns a new instance of Request.
12 13 14 15 |
# File 'lib/fastbeans/request.rb', line 12 def initialize(connection, opts = {}) @connection = connection = {:timeout => RESPONSE_READ_TIMEOUT}.update(opts) end |
Instance Attribute Details
#connection ⇒ Object (readonly)
Returns the value of attribute connection.
7 8 9 |
# File 'lib/fastbeans/request.rb', line 7 def connection @connection end |
Instance Method Details
#build_payload(call_data) ⇒ Object
21 22 23 24 25 26 27 28 29 |
# File 'lib/fastbeans/request.rb', line 21 def build_payload(call_data) signature = sign(call_data) signed_data = [signature, call_data] payload = MessagePack.pack(signed_data) if payload.respond_to?(:force_encoding) payload.force_encoding('BINARY') end [signature, payload] end |
#perform(call_data) ⇒ Object
46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/fastbeans/request.rb', line 46 def perform(call_data) connection.with_socket do |sock| signature, payload = build_payload(call_data) write_payload(sock, payload) resp = read_response(sock, call_data) if resp.error? or resp.signed_with?(signature) resp.payload else raise ResponseSignatureMismatch, "Received #{resp.signature} signature instead of expected #{signature} for #{call_data} call" end end end |
#read_response(sock, call_data) ⇒ Object
36 37 38 39 40 41 42 43 44 |
# File 'lib/fastbeans/request.rb', line 36 def read_response(sock, call_data) raw_resp = Timeout.timeout([:timeout], Fastbeans::ResponseReadTimeout) do MessagePack.load(sock) end Fastbeans::Response.new(call_data, raw_resp) rescue Fastbeans::ResponseReadTimeout @connection.disconnect! raise Fastbeans::ResponseReadTimeout, "Couldn't read response in #{@options[:timeout]} seconds" end |
#sign(call_data) ⇒ Object
17 18 19 |
# File 'lib/fastbeans/request.rb', line 17 def sign(call_data) Digest::MD5.hexdigest(call_data.inspect) end |
#write_payload(sock, payload) ⇒ Object
31 32 33 34 |
# File 'lib/fastbeans/request.rb', line 31 def write_payload(sock, payload) sock.write([payload.bytesize].pack('N')) sock.write(payload) end |