Class: Fastbeans::Request

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

Constant Summary collapse

RESPONSE_READ_TIMEOUT =
120
OPTION_KEYS =
[:timeout]

Instance Attribute Summary collapse

Instance Method Summary collapse

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
  @options = {:timeout => RESPONSE_READ_TIMEOUT}.update(opts)
end

Instance Attribute Details

#connectionObject (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(@options[: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