class Hessian2::Client

Attributes

host[R]
password[RW]
path[R]
port[R]
proxy[R]
scheme[R]
user[RW]

Public Class Methods

new(url, options = {}) click to toggle source
# File lib/hessian2/client.rb, line 9
def initialize(url, options = {})
  uri = URI.parse(url)
  @scheme, @host, @port, @path = uri.scheme, uri.host, uri.port, uri.path.empty? ? '/' : uri.path
  @path += "?#{uri.query}" if uri.query
  raise "Unsupported Hessian protocol: #{@scheme}" unless %w(http https).include?(@scheme)
  @async = options.delete(:async)
  @fiber_aware = options.delete(:fiber_aware)
  if @async || @fiber_aware
    begin
      require 'em-synchrony/em-http'
    rescue LoadError => error
      raise "Missing EM-Synchrony dependency: gem install em-synchrony em-http-request"
    end
  else
    require 'net/http'
  end
  @proxy = options
end

Public Instance Methods

method_missing(id, *args) click to toggle source
# File lib/hessian2/client.rb, line 29
def method_missing(id, *args)
  return invoke(id.id2name, args)
end

Private Instance Methods

invoke(method, args) click to toggle source
# File lib/hessian2/client.rb, line 35
def invoke(method, args)
  req_head = { 'Content-Type' => 'application/binary' }
  req_body = Hessian2.call(method, args)

  if @async
    EM::HttpRequest.new("#{@scheme}://#{@host}:#{@port}#{@path}").apost(body: req_body, head: req_head)
  elsif @fiber_aware
    http = EM::HttpRequest.new("#{@scheme}://#{@host}:#{@port}#{@path}").post(body: req_body, head: req_head)
    Hessian2.parse_rpc(http.response)
  else
    req = Net::HTTP::Post.new(@path, req_head)
    req.basic_auth @user, @password if @user
    conn = Net::HTTP.new(@host, @port, *@proxy.values_at(:host, :port, :user, :password))
    conn.use_ssl = true and conn.verify_mode = OpenSSL::SSL::VERIFY_NONE if @scheme == 'https'
    conn.start do |http|
      res = http.request(req, req_body)
      Hessian2.parse_rpc(res.body)
    end
  end
end