Skip to content

Commit

Permalink
Extract rackup code + tests into separate gem.
Browse files Browse the repository at this point in the history
  • Loading branch information
ioquatix committed Aug 3, 2022
1 parent 75fff85 commit 5153e96
Show file tree
Hide file tree
Showing 31 changed files with 9 additions and 1,908 deletions.
5 changes: 0 additions & 5 deletions bin/rackup

This file was deleted.

82 changes: 9 additions & 73 deletions lib/rack/handler.rb
Expand Up @@ -2,86 +2,22 @@

module Rack
# *Handlers* connect web servers with Rack.
#
# Rack includes Handlers for WEBrick and CGI.
#
# Handlers usually are activated by calling <tt>MyHandler.run(myapp)</tt>.
# A second optional hash can be passed to include server-specific
# configuration.
module Handler
@handlers = {}

def self.get(server)
return unless server
server = server.to_s

unless @handlers.include? server
load_error = try_require('rack/handler', server)
end

if klass = @handlers[server]
const_get(klass)
else
const_get(server, false)
end

rescue NameError => name_error
raise load_error || name_error
end

# Select first available Rack handler given an `Array` of server names.
# Raises `LoadError` if no handler was found.
#
# > pick ['puma', 'webrick']
# => Rack::Handler::WEBrick
def self.pick(server_names)
server_names = Array(server_names)
server_names.each do |server_name|
begin
return get(server_name.to_s)
rescue LoadError, NameError
end
# Register a named handler class.
def self.register(name, klass)
if klass.is_a?(String)
warn "Calling Rack::Handler.register with a string is deprecated, use the class/module itself.", uplevel: 1

klass = self.const_get(klass, false)
end

raise LoadError, "Couldn't find handler for: #{server_names.join(', ')}."
end

RACK_HANDLER = 'RACK_HANDLER'

SERVER_NAMES = %w(puma falcon webrick).freeze
private_constant :SERVER_NAMES

def self.default
if rack_handler = ENV[RACK_HANDLER]
self.get(rack_handler)
else
pick SERVER_NAMES
end
end

# Transforms server-name constants to their canonical form as filenames,
# then tries to require them but silences the LoadError if not found
#
# Naming convention:
#
# Foo # => 'foo'
# FooBar # => 'foo_bar.rb'
# FooBAR # => 'foobar.rb'
# FOObar # => 'foobar.rb'
# FOOBAR # => 'foobar.rb'
# FooBarBaz # => 'foo_bar_baz.rb'
def self.try_require(prefix, const_name)
file = const_name.gsub(/^[A-Z]+/) { |pre| pre.downcase }.
gsub(/[A-Z]+[^A-Z]/, '_\&').downcase

require(::File.join(prefix, file))
nil
rescue LoadError => error
error
@handlers[name] = klass
end

def self.register(server, klass)
@handlers[server.to_s] = klass.to_s
def self.[](name)
@handlers[name]
end
end
end
56 changes: 0 additions & 56 deletions lib/rack/handler/cgi.rb

This file was deleted.

128 changes: 0 additions & 128 deletions lib/rack/handler/webrick.rb

This file was deleted.

76 changes: 0 additions & 76 deletions lib/rack/lobster.rb

This file was deleted.

0 comments on commit 5153e96

Please sign in to comment.