1
0
Fork 0
mirror of https://github.com/puma/puma.git synced 2022-11-09 13:48:40 -05:00

Final touches to get mongrel_rails working. Fixed URI registration bug. Small change to config tool.

git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@123 19e92222-5c0b-0410-8929-a290d50e31e9
This commit is contained in:
zedshaw 2006-03-26 23:57:11 +00:00
parent f2b53a3a4b
commit 4d9966ee00
6 changed files with 73 additions and 30 deletions

View file

@ -22,6 +22,7 @@ class Start < GemPlugin::Plugin "/commands"
['-c', '--chdir PATH', "Change to dir before starting (will be expanded)", :@cwd, Dir.pwd],
['-r', '--root PATH', "Set the document root (default 'public')", :@docroot, "public"],
['-B', '--debug', "Enable debugging mode", :@debug, false],
['-C', '--config PATH', "Use a config file", :@config_file, nil]
]
end
@ -36,18 +37,24 @@ class Start < GemPlugin::Plugin "/commands"
valid_dir? File.dirname(@pid_file), "Path to pid file not valid: #@pid_file"
valid_dir? @docroot, "Path to docroot not valid: #@docroot"
valid_exists? @mime_map, "MIME mapping file does not exist: #@mime_map" if @mime_map
valid_exists? @config_file, "Config file not there: #@config_file" if @config_file
return @valid
end
def run
# command line setting override config file settings
settings = { :host => @address, :port => @port, :cwd => @cwd,
:log_file => @log_file, :pid_file => @pid_file, :environment => @environment,
:docroot => @docroot, :mime_map => @mime_map, :daemon => @daemon,
:debug => @debug, :includes => ["mongrel"]
}
if @config_file
STDERR.puts "** Loading settings from #{@config_file} (command line options override)."
conf = YAML.load_file(@config_file)
settings = conf.merge(settings)
end
config = Mongrel::Rails::RailsConfigurator.new(settings) do
log "Starting Mongrel in #{settings[:environment]} mode at #{settings[:host]}:#{settings[:port]}"

9
examples/mongrel.conf Normal file
View file

@ -0,0 +1,9 @@
---
:environment: production
:daemon: "true"
:host: 0.0.0.0
:log_file: log/mongrel.log
:docroot: public
:debug: "false"
:port: 3000
:pid_file: log/mongrel.pid

View file

@ -5,7 +5,6 @@ require 'stringio'
require 'mongrel/cgi'
require 'mongrel/handlers'
require 'mongrel/command'
require 'timeout'
require 'mongrel/tcphack'
require 'yaml'
@ -256,11 +255,15 @@ module Mongrel
# Receives a block passing it the header and body for you to work with.
# When the block is finished it writes everything you've done to
# the socket in the proper order. This lets you intermix header and
# body content as needed.
def start(status=200)
# body content as needed. Handlers are able to modify pretty much
# any part of the request in the chain, and can stop further processing
# by simple passing "finalize=true" to the start method. By default
# all handlers run and then mongrel finalizes the request when they're
# all done.
def start(status=200, finalize=false)
@status = status.to_i
yield @header, @body
finished
finished if finalize
end
# Primarily used in exception handling to reset the response output in order to write
@ -268,7 +271,7 @@ module Mongrel
# sent the header or the body. This is pretty catastrophic actually.
def reset
if @body_sent
raise "You ahve already sent the request body."
raise "You have already sent the request body."
elsif @header_sent
raise "You have already sent the request headers."
else
@ -278,24 +281,30 @@ module Mongrel
end
def send_status
if not @status_sent
status = "HTTP/1.1 #{@status} #{HTTP_STATUS_CODES[@status]}\r\nContent-Length: #{@body.length}\r\nConnection: close\r\n"
@socket.write(status)
@status_sent = true
end
end
def send_header
if not @header_sent
@header.out.rewind
@socket.write(@header.out.read)
@socket.write("\r\n")
@header_sent = true
end
end
def send_body
if not @body_sent
@body.rewind
# connection: close is also added to ensure that the client does not pipeline.
@socket.write(@body.read)
@body_sent = true
end
end
# This takes whatever has been done to header and body and then writes it in the
# proper format to make an HTTP/1.1 response.
@ -306,7 +315,7 @@ module Mongrel
end
def done
@status_sent && @header_sent && @body_sent
(@status_sent and @header_sent and @body_sent)
end
end
@ -332,6 +341,7 @@ module Mongrel
class HttpServer
attr_reader :acceptor
attr_reader :workers
attr_reader :classifier
# Creates a working server on host:port (strange things happen if port isn't a Number).
# Use HttpServer::run to start the server and HttpServer.acceptor.join to
@ -387,6 +397,10 @@ module Mongrel
break if response.done
end
if not response.done
response.finished
end
else
client.write(Const::ERROR_404_RESPONSE)
end
@ -482,11 +496,14 @@ module Mongrel
def register(uri, handler)
script_name, path_info, handlers = @classifier.resolve(uri)
if not handlers or (path_info and path_info != "/" and path_info.length == 0)
# new uri that is just longer
if not handlers
@classifier.register(uri, [handler])
else
if path_info.length == 0 or (script_name == "/" and path_info == "/")
handlers << handler
else
@classifier.register(uri, [handler])
end
end
end
@ -745,9 +762,9 @@ module Mongrel
MongrelDbg.begin_trace :rails
MongrelDbg.begin_trace :files
uri "/", :handler => plugin("/handlers/requestlog::files")
uri "/", :handler => plugin("/handlers/requestlog::objects")
uri "/", :handler => plugin("/handlers/requestlog::params")
uri location, :handler => plugin("/handlers/requestlog::files")
uri location, :handler => plugin("/handlers/requestlog::objects")
uri location, :handler => plugin("/handlers/requestlog::params")
end

View file

@ -89,7 +89,6 @@ module Configure::Views
p { span { "Port:" }; input :name => "port", :value => "4000" }
p { span { "Environment:" }; input :name => "env", :value => "development" }
p { span { "Address:" }; input :name => "address", :value => "0.0.0.0" }
p { span { "Number Processors:" }; input :name => "num_procs", :value => "20" }
input :type => "submit", :value => "START"
end
end

View file

@ -21,7 +21,7 @@ class Sentinel < GemPlugin::Plugin "/handlers"
end
class MongrelDbgTest < Test::Unit::TestCase
class ConfiguratorTest < Test::Unit::TestCase
def test_base_handler_config
config = Mongrel::Configurator.new :host => "localhost" do
@ -30,24 +30,32 @@ class MongrelDbgTest < Test::Unit::TestCase
uri "/", :handler => plugin("/handlers/testplugin")
uri "/", :handler => plugin("/handlers/testplugin")
uri "/", :handler => Mongrel::DirHandler.new(".", load_mime_map("examples/mime.yaml"))
uri "/", :handler => plugin("/handlers/sentinel")
uri "/", :handler => plugin("/handlers/testplugin")
uri "/test", :handler => plugin("/handlers/testplugin")
uri "/test", :handler => plugin("/handlers/testplugin")
uri "/test", :handler => Mongrel::DirHandler.new(".", load_mime_map("examples/mime.yaml"))
uri "/test", :handler => plugin("/handlers/sentinel")
uri "/test", :handler => plugin("/handlers/testplugin")
run
end
end
config.listeners.each do |host,listener|
puts "Registered URIs: #{listener.classifier.uris.inspect}"
assert listener.classifier.uris.length == 2, "Wrong number of registered URIs"
assert listener.classifier.uris.include?("/"), "/ not registered"
assert listener.classifier.uris.include?("/test"), "/test not registered"
end
res = Net::HTTP.get(URI.parse('http://localhost:3111/test'))
assert res != nil, "Didn't get a response"
assert $test_plugin_fired == 2, "Test filter plugin didn't run twice."
assert $test_plugin_fired == 3, "Test filter plugin didn't run 3 times."
res = Net::HTTP.get(URI.parse('http://localhost:3111/'))
assert res != nil, "Didn't get a response"
assert $test_plugin_fired == 4, "Test filter plugin didn't run 4 times."
assert $test_plugin_fired == 6, "Test filter plugin didn't run 6 times."
config.stop

View file

@ -26,6 +26,8 @@ class ResponseTest < Test::Unit::TestCase
out.write("tested")
out.write("hello!")
end
resp.finished
assert io.length > 0, "output didn't have data"
end
@ -38,6 +40,7 @@ class ResponseTest < Test::Unit::TestCase
out.write("NOT FOUND")
end
resp.finished
assert io.length > 0, "output didn't have data"
end