class M2R::Handler

Basic handler, scaffold for your own Handler. Overwrite hook methods to define behavior. After calling listen the Handler will block waiting for request from connection generated by {M2R::Handler#connection_factory}, process them and send reponses back.

@api public @abstract Subclass and override method hooks to implement your own Handler

Attributes

connection[RW]

@return [Connection] used for receiving requests and sending responses

Public Class Methods

new(connection_factory, parser) click to toggle source

@param [ConnectionFactory, Connection, connection] connection_factory

Factory for generating connections

@param [#parse] parser

Parser of M2 requests
# File lib/m2r/handler.rb, line 21
def initialize(connection_factory, parser)
  @connection = connection_factory.connection
  @parser     = parser
end

Public Instance Methods

listen() click to toggle source

Start processing request

# File lib/m2r/handler.rb, line 27
def listen
  catch(:stop) do
    loop { one_loop }
  end
  @connection.close
end
stop() click to toggle source

Schedule stop after processing request

# File lib/m2r/handler.rb, line 35
def stop
  @stop = true
end

Protected Instance Methods

after_all(request, response) click to toggle source

Callback after request is processed that is executed even when execption occured. Useful for releasing resources (closing files etc) @api public @!visibility public @note `response` might be nil depending on when exception occured. @note In case of error this callback is called before on_error @param [Request] request Request object @param [Response, String, to_s, nil] response Response that was sent to

Mongrel2 instance
# File lib/m2r/handler.rb, line 115
def after_all(request, response)
end
after_process(request, response) click to toggle source

Callback after process_request is done @api public @!visibility public @param [Request] request Request object @param [Response, String, to_s] response Response that should be sent to

Mongrel2 instance
# File lib/m2r/handler.rb, line 92
def after_process(request, response)
  return response
end
after_reply(request, response) click to toggle source

Callback after sending the response back @api public @!visibility public @param [Request] request Request object @param [Response, String, to_s] response Response that was sent to

Mongrel2 instance
# File lib/m2r/handler.rb, line 102
def after_reply(request, response)
end
on_disconnect(request) click to toggle source

Callback executed when response could not be delivered by Mongrel2 because client already disconnected. @api public @!visibility public @param [Request] request Request object

# File lib/m2r/handler.rb, line 69
def on_disconnect(request)
end
on_error(request, response, error) click to toggle source

Callback when exception occured @api public @!visibility public @note `request` and/or `response` might be nil depending on when error occured @param [Request, nil] request Request object @param [Response, String, to_s, nil] response Response that might have been sent to

Mongrel2 instance

@param [StandardError] error

# File lib/m2r/handler.rb, line 126
def on_error(request, response, error)
end
on_interrupted() click to toggle source

Callback when ZMQ interrupted by signal @api public @!visibility public

# File lib/m2r/handler.rb, line 132
def on_interrupted
end
on_request(request) click to toggle source

Callback when a request is received @api public @!visibility public @param [Request] request Request object

# File lib/m2r/handler.rb, line 51
def on_request(request)
end
on_upload_done(request) click to toggle source

Callback when async-upload finished @api public @!visibility public @param [Request] request Request object

# File lib/m2r/handler.rb, line 83
def on_upload_done(request)
end
on_upload_start(request) click to toggle source

Callback when async-upload started @api public @!visibility public @param [Request] request Request object

# File lib/m2r/handler.rb, line 76
def on_upload_start(request)
end
on_wait() click to toggle source

Callback executed when waiting for a request @api public @!visibility public

# File lib/m2r/handler.rb, line 44
def on_wait()
end
process(request) click to toggle source

Override to return a response @api public @!visibility public @param [Request] request Request object @return [Response, String, to_s] Response that should be sent to

Mongrel2 instance
# File lib/m2r/handler.rb, line 60
def process(request)
  raise NotImplementedError
end

Private Instance Methods

next_request() click to toggle source
# File lib/m2r/handler.rb, line 137
def next_request
  @parser.parse @connection.receive
end
one_loop() click to toggle source
# File lib/m2r/handler.rb, line 141
def one_loop
  on_wait
  throw :stop if stop?
  response = request_lifecycle(request = next_request)
rescue => error
  return on_interrupted if Connection::Error === error && error.signal?
  on_error(request, response, error)
end
request_lifecycle(request) click to toggle source
# File lib/m2r/handler.rb, line 150
def request_lifecycle(request)
  on_request(request)

  return on_disconnect(request)   if request.disconnect?
  return on_upload_start(request) if request.upload_start?
  on_upload_done(request)         if request.upload_done?

  response = process(request)
  response = after_process(request, response)

  @connection.reply(request, response)

  after_reply(request, response)
  return response
ensure
  after_all(request, response)
end
stop?() click to toggle source
# File lib/m2r/handler.rb, line 168
def stop?
  @stop
end