Class: XMLRPC::WEBrickServlet

Inherits:
BasicServer show all
Defined in:
lib/xmlrpc/server.rb,
lib/xmlrpc/server.rb

Overview

Implements a servlet for use with WEBrick, a pure Ruby (HTTP) server framework.

require "webrick"
require "xmlrpc/server"

s = XMLRPC::WEBrickServlet.new
s.add_handler("michael.add") do |a,b|
  a + b
end

s.add_handler("michael.div") do |a,b|
  if b == 0
    raise XMLRPC::FaultException.new(1, "division by zero")
  else
    a / b
  end
end

s.set_default_handler do |name, *args|
  raise XMLRPC::FaultException.new(-99, "Method #{name} missing" +
                                   " or wrong number of parameters!")
end

httpserver = WEBrick::HTTPServer.new(:Port => 8080)
httpserver.mount("/RPC2", s)
trap("HUP") { httpserver.shutdown }   # use 1 instead of "HUP" on Windows
httpserver.start

Direct Known Subclasses

Server

Constant Summary

Constants inherited from BasicServer

BasicServer::ERR_MC_EXPECTED_STRUCT, BasicServer::ERR_MC_MISSING_METHNAME, BasicServer::ERR_MC_MISSING_PARAMS, BasicServer::ERR_MC_RECURSIVE_CALL, BasicServer::ERR_MC_WRONG_PARAM, BasicServer::ERR_MC_WRONG_PARAM_PARAMS, BasicServer::ERR_METHOD_MISSING, BasicServer::ERR_UNCAUGHT_EXCEPTION

Instance Method Summary collapse

Methods inherited from BasicServer

#add_handler, #add_introspection, #add_multicall, #get_default_handler, #get_service_hook, #process, #set_default_handler, #set_service_hook

Methods included from ParseContentType

#parse_content_type

Methods included from ParserWriterChooseMixin

#set_parser, #set_writer

Constructor Details

#initialize(*a) ⇒ WEBrickServlet

Returns a new instance of WEBrickServlet.



601
602
603
604
605
# File 'lib/xmlrpc/server.rb', line 601

def initialize(*a)
  super
  require "webrick/httpstatus"
  @valid_ip = nil
end

Instance Method Details

#get_instance(config, *options) ⇒ Object



612
613
614
615
# File 'lib/xmlrpc/server.rb', line 612

def get_instance(config, *options)
  # TODO: set config & options
  self
end

#get_valid_ipObject

Return the valid IP addresses that are allowed to connect to the server.

See also, XMLRPC::Server#set_valid_ip



631
632
633
# File 'lib/xmlrpc/server.rb', line 631

def get_valid_ip
  @valid_ip
end

#require_path_info?Boolean

Deprecated from WEBrick/1.2.2, but does not break anything.

Returns:

  • (Boolean)


608
609
610
# File 'lib/xmlrpc/server.rb', line 608

def require_path_info?
  false
end

#service(request, response) ⇒ Object

Raises:

  • (WEBrick::HTTPStatus::LengthRequired)


635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
# File 'lib/xmlrpc/server.rb', line 635

def service(request, response)

  if @valid_ip
    raise WEBrick::HTTPStatus::Forbidden unless @valid_ip.any? { |ip| request.peeraddr[3] =~ ip }
  end

  if request.request_method != "POST"
    raise WEBrick::HTTPStatus::MethodNotAllowed,
          "unsupported method `#{request.request_method}'."
  end

  if parse_content_type(request['Content-type']).first != "text/xml"
    raise WEBrick::HTTPStatus::BadRequest
  end

  length = (request['Content-length'] || 0).to_i

  raise WEBrick::HTTPStatus::LengthRequired unless length > 0

  data = request.body

  if data.nil? or data.bytesize != length
    raise WEBrick::HTTPStatus::BadRequest
  end

  resp = process(data)
  if resp.nil? or resp.bytesize <= 0
    raise WEBrick::HTTPStatus::InternalServerError
  end

  response.status = 200
  response['Content-Length'] = resp.bytesize
  response['Content-Type']   = "text/xml; charset=utf-8"
  response.body = resp
end

#set_valid_ip(*ip_addr) ⇒ Object

Specifies the valid IP addresses that are allowed to connect to the server.

Each IP is either a String or a Regexp.



620
621
622
623
624
625
626
# File 'lib/xmlrpc/server.rb', line 620

def set_valid_ip(*ip_addr)
  if ip_addr.size == 1 and ip_addr[0].nil?
    @valid_ip = nil
  else
    @valid_ip = ip_addr
  end
end