Class: Fastbeans::Request

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(connection) ⇒ Request

Returns a new instance of Request.



8
9
10
# File 'lib/fastbeans/request.rb', line 8

def initialize(connection)
  @connection = connection
end

Instance Attribute Details

#connectionObject (readonly)

Returns the value of attribute connection.



6
7
8
# File 'lib/fastbeans/request.rb', line 6

def connection
  @connection
end

Instance Method Details

#build_payload(call_data) ⇒ Object



16
17
18
19
20
21
22
23
24
# File 'lib/fastbeans/request.rb', line 16

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



36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/fastbeans/request.rb', line 36

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



31
32
33
34
# File 'lib/fastbeans/request.rb', line 31

def read_response(sock, call_data)
  raw_resp = MessagePack.load(sock)
  Fastbeans::Response.new(call_data, raw_resp)
end

#sign(call_data) ⇒ Object



12
13
14
# File 'lib/fastbeans/request.rb', line 12

def sign(call_data)
  Digest::MD5.hexdigest(call_data.inspect)
end

#write_payload(sock, payload) ⇒ Object



26
27
28
29
# File 'lib/fastbeans/request.rb', line 26

def write_payload(sock, payload)
  sock.write([payload.bytesize].pack('N'))
  sock.write(payload)
end