class Pione::DRbPatch::RequestInvoker

Public Class Methods

new(server, client, request) click to toggle source
# File lib/pione/patch/drb-patch.rb, line 376
def initialize(server, client, request)
  @server = server
  @client = client
  @request = request
  check_insecure_method
end

Public Instance Methods

invoke() click to toggle source
# File lib/pione/patch/drb-patch.rb, line 383
def invoke
  # evaluate request
  succ, result = execute_request

  # send_reply with req_id
  begin
    @client.send_reply(@request.req_id, succ, result)
  rescue => e
    Log::Debug.system("it happened communication failure in sending reply(req_id: %s): %s" % [@request.req_id, e.message])
  end
end

Private Instance Methods

check_insecure_method() click to toggle source
# File lib/pione/patch/drb-patch.rb, line 408
def check_insecure_method
  @server.check_insecure_method(@request.obj, @request.msg_id)
end
eval_request() click to toggle source
# File lib/pione/patch/drb-patch.rb, line 412
def eval_request
  $SAFE < @server.safe_level ? safe_eval_request : unsafe_eval_request
end
execute_request() click to toggle source

perform without setup_message

# File lib/pione/patch/drb-patch.rb, line 398
def execute_request
  result = eval_request
  if @request.msg_id == :to_ary && result.class == Array
    result = DRbArray.new(result)
  end
  return true, result
rescue StandardError, ScriptError => e
  return false, e
end
safe_eval_request() click to toggle source

Execute the request within sandbox.

# File lib/pione/patch/drb-patch.rb, line 417
def safe_eval_request
  info = Thread.current['DRb']
  Thread.new do
    # import DRb info to the sandbox
    Thread.current['DRb'] = info

    # make sandbox
    $SAFE = @drb_server.safe_level

    # invoke request
    unsafe_request_invoke
  end.value
end
unsafe_eval_request() click to toggle source

Execute the request.

# File lib/pione/patch/drb-patch.rb, line 432
def unsafe_eval_request
  @request.eval
end