class M2R::Connection

Connection for exchanging data with mongrel2

Attributes

request_socket[R]
response_socket[R]

Public Class Methods

new(request_socket, response_socket) click to toggle source

@param [ZMQ::Socket] request_socket socket for receiving requests

from Mongrel2

@param [ZMQ::Socket] response_socket socket for sending responses

to Mongrel2

@api public

# File lib/m2r/connection.rb, line 16
def initialize(request_socket, response_socket)
  @request_socket  = request_socket
  @response_socket = response_socket
end

Public Instance Methods

close() click to toggle source

Closes ZMQ sockets

@api public

# File lib/m2r/connection.rb, line 82
def close
  @request_socket.close
  @response_socket.close
end
connection() click to toggle source

For compatibility with {M2R::ConnectionFactory}

@return [Connection] self @api public

# File lib/m2r/connection.rb, line 25
def connection
  self
end
deliver(uuid, connection_ids, data, trial = 1) click to toggle source

Delivers data to multiple mongrel2 connections. Useful for streaming.

@param [String] uuid Mongrel2 instance uuid @param [Array<String>, String] connection_ids Mongrel2 connections ids @param [String] data Data that should be delivered to the connections @return [String] M2 response message

@api public

# File lib/m2r/connection.rb, line 64
def deliver(uuid, connection_ids, data, trial = 1)
  msg = "#{uuid} #{TNetstring.dump([*connection_ids].join(' '))} #{data}"
  ret = @response_socket.send_string(msg, ZMQ::NonBlocking)
  if ret < 0
    e = Error.new "Unable to deliver message: #{ZMQ::Util.error_string}"
    e.errno = ZMQ::Util.errno
    raise e
  end
  return msg
rescue Connection::Error => er
  raise if trial >= 3
  raise unless er.signal?
  deliver(uuid, connection_ids, data, trial + 1)
end
receive() click to toggle source

Returns Mongrel2 request

@note This is blocking call @return [String] M2 request message @api public

# File lib/m2r/connection.rb, line 34
def receive
  ret = @request_socket.recv_string(msg = "")
  if ret < 0
    e = Error.new "Unable to receive message: #{ZMQ::Util.error_string}"
    e.errno = ZMQ::Util.errno
    raise e
  end
  return msg
end
reply(request, response_or_string) click to toggle source

Sends response to Mongrel2 for given request

@param [Response, to_s] response_or_string Response

for the request. Anything convertable to [String]

@return [String] M2 response message @api public

# File lib/m2r/connection.rb, line 50
def reply(request, response_or_string)
  deliver(request.sender, request.conn_id, response_or_string.to_s)
  deliver(request.sender, request.conn_id, "") if close?(request, response_or_string)
end

Private Instance Methods

close?(request, response_or_string) click to toggle source
# File lib/m2r/connection.rb, line 89
def close?(request, response_or_string)
  if response_or_string.respond_to?(:close?)
    response_or_string.close?
  else
    request.close?
  end
end