Class: Fastbeans::Request

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

Constant Summary collapse

RESPONSE_READ_TIMEOUT =
120

Instance Attribute Summary collapse

Instance Method Summary collapse

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

#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



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