Class: WEBrick::GenericServer
- Inherits:
-
Object
- Object
- WEBrick::GenericServer
- Defined in:
- lib/webrick/ssl.rb,
lib/webrick/server.rb
Instance Attribute Summary (collapse)
-
- (Object) config
readonly
Returns the value of attribute config.
-
- (Object) listeners
readonly
Returns the value of attribute listeners.
-
- (Object) logger
readonly
Returns the value of attribute logger.
-
- (Object) status
readonly
Returns the value of attribute status.
-
- (Object) tokens
readonly
Returns the value of attribute tokens.
Instance Method Summary (collapse)
- - (Object) [](key)
-
- (GenericServer) initialize(config = {}, default = Config::General)
constructor
A new instance of GenericServer.
- - (Object) listen(address, port)
- - (Object) run(sock)
- - (Object) setup_ssl_context(config)
- - (Object) shutdown
- - (Object) ssl_context
- - (Object) start(&block)
- - (Object) stop
Constructor Details
- (GenericServer) initialize(config = {}, default = Config::General)
A new instance of GenericServer
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/webrick/server.rb', line 43 def initialize(config={}, default=Config::General) @config = default.dup.update(config) @status = :Stop @config[:Logger] ||= Log::new @logger = @config[:Logger] @tokens = SizedQueue.new(@config[:MaxClients]) @config[:MaxClients].times{ @tokens.push(nil) } webrickv = WEBrick::VERSION rubyv = "#{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]" @logger.info("WEBrick #{webrickv}") @logger.info("ruby #{rubyv}") @listeners = [] unless @config[:DoNotListen] if @config[:Listen] warn(":Listen option is deprecated; use GenericServer#listen") end listen(@config[:BindAddress], @config[:Port]) if @config[:Port] == 0 @config[:Port] = @listeners[0].addr[1] end end end |
Instance Attribute Details
- (Object) config (readonly)
Returns the value of attribute config
41 42 43 |
# File 'lib/webrick/server.rb', line 41 def config @config end |
- (Object) listeners (readonly)
Returns the value of attribute listeners
41 42 43 |
# File 'lib/webrick/server.rb', line 41 def listeners @listeners end |
- (Object) logger (readonly)
Returns the value of attribute logger
41 42 43 |
# File 'lib/webrick/server.rb', line 41 def logger @logger end |
- (Object) status (readonly)
Returns the value of attribute status
41 42 43 |
# File 'lib/webrick/server.rb', line 41 def status @status end |
- (Object) tokens (readonly)
Returns the value of attribute tokens
41 42 43 |
# File 'lib/webrick/server.rb', line 41 def tokens @tokens end |
Instance Method Details
- (Object) [](key)
69 70 71 |
# File 'lib/webrick/server.rb', line 69 def [](key) @config[key] end |
- (Object) listen(address, port)
86 87 88 |
# File 'lib/webrick/ssl.rb', line 86 def listen(address, port) @listeners += Utils::create_listeners(address, port, @logger) end |
- (Object) run(sock)
149 150 151 |
# File 'lib/webrick/server.rb', line 149 def run(sock) @logger.fatal "run() must be provided by user." end |
- (Object) setup_ssl_context(config)
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/webrick/ssl.rb', line 102 def setup_ssl_context(config) unless config[:SSLCertificate] cn = config[:SSLCertName] comment = config[:SSLCertComment] cert, key = Utils::create_self_signed_cert(1024, cn, comment) config[:SSLCertificate] = cert config[:SSLPrivateKey] = key end ctx = OpenSSL::SSL::SSLContext.new ctx.key = config[:SSLPrivateKey] ctx.cert = config[:SSLCertificate] ctx.client_ca = config[:SSLClientCA] ctx.extra_chain_cert = config[:SSLExtraChainCert] ctx.ca_file = config[:SSLCACertificateFile] ctx.ca_path = config[:SSLCACertificatePath] ctx.cert_store = config[:SSLCertificateStore] ctx.verify_mode = config[:SSLVerifyClient] ctx.verify_depth = config[:SSLVerifyDepth] ctx.verify_callback = config[:SSLVerifyCallback] ctx.timeout = config[:SSLTimeout] ctx. = config[:SSLOptions] ctx end |
- (Object) shutdown
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
# File 'lib/webrick/server.rb', line 126 def shutdown stop @listeners.each{|s| if @logger.debug? addr = s.addr @logger.debug("close TCPSocket(#{addr[2]}, #{addr[1]})") end begin s.shutdown rescue Errno::ENOTCONN # when `Errno::ENOTCONN: Socket is not connected' on some platforms, # call #close instead of #shutdown. # (ignore @config[:ShutdownSocketWithoutClose]) s.close else unless @config[:ShutdownSocketWithoutClose] s.close end end } @listeners.clear end |
- (Object) ssl_context
82 83 84 |
# File 'lib/webrick/ssl.rb', line 82 def ssl_context @ssl_context ||= nil end |
- (Object) start(&block)
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/webrick/server.rb', line 77 def start(&block) raise ServerError, "already started." if @status != :Stop server_type = @config[:ServerType] || SimpleServer server_type.start{ @logger.info \ "#{self.class}#start: pid=#{$$} port=#{@config[:Port]}" call_callback(:StartCallback) thgroup = ThreadGroup.new @status = :Running while @status == :Running begin if svrs = IO.select(@listeners, nil, nil, 2.0) svrs[0].each{|svr| @tokens.pop # blocks while no token is there. if sock = accept_client(svr) sock.do_not_reverse_lookup = config[:DoNotReverseLookup] th = start_thread(sock, &block) th[:WEBrickThread] = true thgroup.add(th) else @tokens.push(nil) end } end rescue Errno::EBADF, IOError => ex # if the listening socket was closed in GenericServer#shutdown, # IO::select raise it. rescue Exception => ex msg = "#{ex.class}: #{ex.}\n\t#{ex.backtrace[0]}" @logger.error msg end end @logger.info "going to shutdown ..." thgroup.list.each{|th| th.join if th[:WEBrickThread] } call_callback(:StopCallback) @logger.info "#{self.class}#start done." @status = :Stop } end |
- (Object) stop
120 121 122 123 124 |
# File 'lib/webrick/server.rb', line 120 def stop if @status == :Running @status = :Shutdown end end |