Class: Fastbeans::Request
- Inherits:
-
Object
- Object
- Fastbeans::Request
- Defined in:
- lib/fastbeans/request.rb
Constant Summary collapse
- RESPONSE_READ_TIMEOUT =
120
Instance Attribute Summary collapse
-
#connection ⇒ Object
readonly
Returns the value of attribute connection.
Instance Method Summary collapse
- #build_payload(call_data) ⇒ Object
-
#initialize(connection) ⇒ 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) ⇒ Request
Returns a new instance of Request.
11 12 13 |
# File 'lib/fastbeans/request.rb', line 11 def initialize(connection) @connection = connection 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
19 20 21 22 23 24 25 26 27 |
# File 'lib/fastbeans/request.rb', line 19 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
44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/fastbeans/request.rb', line 44 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
34 35 36 37 38 39 40 41 42 |
# File 'lib/fastbeans/request.rb', line 34 def read_response(sock, call_data) raw_resp = Timeout.timeout(RESPONSE_READ_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 #{RESPONSE_READ_TIMEOUT} seconds" end |
#sign(call_data) ⇒ Object
15 16 17 |
# File 'lib/fastbeans/request.rb', line 15 def sign(call_data) Digest::MD5.hexdigest(call_data.inspect) end |
#write_payload(sock, payload) ⇒ Object
29 30 31 32 |
# File 'lib/fastbeans/request.rb', line 29 def write_payload(sock, payload) sock.write([payload.bytesize].pack('N')) sock.write(payload) end |