class Protobuf::Rpc::Middleware::ExceptionHandler

Attributes

app[R]

Public Class Methods

new(app) click to toggle source
# File lib/protobuf/rpc/middleware/exception_handler.rb, line 9
def initialize(app)
  @app = app
end

Public Instance Methods

_call(env) click to toggle source
# File lib/protobuf/rpc/middleware/exception_handler.rb, line 17
def _call(env)
  app.call(env)
rescue => exception
  log_exception(exception)

  # Rescue exceptions, re-wrap them as generic Protobuf errors,
  # and encode them
  env.response = wrap_exception(exception)
  env.encoded_response = wrap_and_encode_with_server(env.response, env)
  env
end
call(env) click to toggle source
# File lib/protobuf/rpc/middleware/exception_handler.rb, line 13
def call(env)
  dup._call(env)
end

Private Instance Methods

wrap_and_encode_with_server(response, env) click to toggle source

If the response is a PbError, it won’t have the server merged into the response proto. We should add it here since exception handler is always at the bottom of the middleware stack. Without this, the server hostname in the client rpc log will not be set.

# File lib/protobuf/rpc/middleware/exception_handler.rb, line 41
def wrap_and_encode_with_server(response, env)
  if response.is_a?(PbError)
    response.encode(:server => env.server)
  else
    response.encode
  end
end
wrap_exception(exception) click to toggle source

Wrap exceptions in a generic Protobuf errors unless they already are

# File lib/protobuf/rpc/middleware/exception_handler.rb, line 33
def wrap_exception(exception)
  exception = RpcFailed.new(exception.message) unless exception.is_a?(PbError)
  exception
end