forked from darkhelmet/rack-mongrel2
/
connection.rb
48 lines (41 loc) · 1.07 KB
/
connection.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
require 'zmq'
require 'mongrel2/request'
require 'mongrel2/response'
module Mongrel2
class Connection
CTX = ZMQ::Context.new(1)
def initialize(uuid, sub, pub)
@uuid, @sub, @pub = uuid, sub, pub
# Connect to receive requests
@reqs = CTX.socket(ZMQ::PULL)
@reqs.connect(sub)
@reqs.setsockopt(ZMQ::LINGER, 0)
# Connect to send responses
@resp = CTX.socket(ZMQ::PUB)
@resp.connect(pub)
@resp.setsockopt(ZMQ::IDENTITY, uuid)
@resp.setsockopt(ZMQ::LINGER, 0)
end
def recv
msg = nil
ready_sockets = ZMQ.select([@reqs], nil, nil, 30)
if !ready_sockets.nil?
ready_sockets[0].each do | socket |
msg = socket.recv(ZMQ::NOBLOCK)
msg = Request.parse(msg) unless msg.nil?
end
end
msg
end
def reply(req, body, status = 200, headers = {})
resp = Response.new(@resp)
resp.send_http(req, body, status, headers)
resp.close(req) if req.close?
end
def close
@resp.close
@reqs.close
CTX.close
end
end
end