21: def listen(args = {})
22: raise ArgumentError, ":protocols must be specified." if !args[:protocols] or args[:protocols].empty?
23: raise ArgumentError, ":address must be specified." unless args[:address]
24: raise ArgumentError, ":port must be specified." unless args[:port]
25:
26: @protocols = args[:protocols]
27: @xmlrpc_handlers = args[:xmlrpc_handlers]
28:
29: arguments = {:BindAddress => args[:address], :Port => args[:port]}
30: arguments.merge!(setup_logger)
31: arguments.merge!(setup_ssl)
32:
33: @server = WEBrick::HTTPServer.new(arguments)
34: @server.listeners.each { |l| l.start_immediately = false }
35:
36: setup_handlers
37:
38: @mutex.synchronize do
39: raise "WEBrick server is already listening" if @listening
40: @listening = true
41: @thread = Thread.new {
42: @server.start { |sock|
43: raise "Client disconnected before connection could be established" unless IO.select([sock],nil,nil,0.1)
44: sock.accept
45: @server.run(sock)
46: }
47: }
48: end
49: end