mongrel 1.1.2-java

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of mongrel might be problematic. Click here for more details.

Files changed (73) hide show
  1. data.tar.gz.sig +1 -0
  2. data/CHANGELOG +12 -0
  3. data/COPYING +55 -0
  4. data/LICENSE +55 -0
  5. data/Manifest +69 -0
  6. data/README +74 -0
  7. data/TODO +5 -0
  8. data/bin/mongrel_rails +283 -0
  9. data/examples/builder.rb +29 -0
  10. data/examples/camping/README +3 -0
  11. data/examples/camping/blog.rb +294 -0
  12. data/examples/camping/tepee.rb +149 -0
  13. data/examples/httpd.conf +474 -0
  14. data/examples/mime.yaml +3 -0
  15. data/examples/mongrel.conf +9 -0
  16. data/examples/mongrel_simple_ctrl.rb +92 -0
  17. data/examples/mongrel_simple_service.rb +116 -0
  18. data/examples/monitrc +57 -0
  19. data/examples/random_thrash.rb +19 -0
  20. data/examples/simpletest.rb +52 -0
  21. data/examples/webrick_compare.rb +20 -0
  22. data/ext/http11/ext_help.h +14 -0
  23. data/ext/http11/extconf.rb +6 -0
  24. data/ext/http11/http11.c +402 -0
  25. data/ext/http11/http11_parser.c +1221 -0
  26. data/ext/http11/http11_parser.h +49 -0
  27. data/ext/http11/http11_parser.java.rl +170 -0
  28. data/ext/http11/http11_parser.rl +152 -0
  29. data/ext/http11/http11_parser_common.rl +54 -0
  30. data/ext/http11_java/Http11Service.java +13 -0
  31. data/ext/http11_java/org/jruby/mongrel/Http11.java +266 -0
  32. data/ext/http11_java/org/jruby/mongrel/Http11Parser.java +572 -0
  33. data/lib/http11.jar +0 -0
  34. data/lib/mongrel.rb +355 -0
  35. data/lib/mongrel/camping.rb +107 -0
  36. data/lib/mongrel/cgi.rb +181 -0
  37. data/lib/mongrel/command.rb +222 -0
  38. data/lib/mongrel/configurator.rb +388 -0
  39. data/lib/mongrel/const.rb +110 -0
  40. data/lib/mongrel/debug.rb +203 -0
  41. data/lib/mongrel/gems.rb +22 -0
  42. data/lib/mongrel/handlers.rb +468 -0
  43. data/lib/mongrel/header_out.rb +28 -0
  44. data/lib/mongrel/http_request.rb +155 -0
  45. data/lib/mongrel/http_response.rb +163 -0
  46. data/lib/mongrel/init.rb +10 -0
  47. data/lib/mongrel/mime_types.yml +616 -0
  48. data/lib/mongrel/rails.rb +185 -0
  49. data/lib/mongrel/stats.rb +89 -0
  50. data/lib/mongrel/tcphack.rb +18 -0
  51. data/lib/mongrel/uri_classifier.rb +76 -0
  52. data/mongrel-public_cert.pem +20 -0
  53. data/mongrel.gemspec +263 -0
  54. data/setup.rb +1585 -0
  55. data/test/mime.yaml +3 -0
  56. data/test/mongrel.conf +1 -0
  57. data/test/test_cgi_wrapper.rb +26 -0
  58. data/test/test_command.rb +86 -0
  59. data/test/test_conditional.rb +107 -0
  60. data/test/test_configurator.rb +87 -0
  61. data/test/test_debug.rb +25 -0
  62. data/test/test_handlers.rb +103 -0
  63. data/test/test_http11.rb +156 -0
  64. data/test/test_redirect_handler.rb +44 -0
  65. data/test/test_request_progress.rb +99 -0
  66. data/test/test_response.rb +127 -0
  67. data/test/test_stats.rb +35 -0
  68. data/test/test_uriclassifier.rb +261 -0
  69. data/test/test_ws.rb +115 -0
  70. data/test/testhelp.rb +66 -0
  71. data/tools/trickletest.rb +45 -0
  72. metadata +186 -0
  73. metadata.gz.sig +4 -0
@@ -0,0 +1,3 @@
1
+ ---
2
+ .jpeg: image/jpeg
3
+ .png: image/test
@@ -0,0 +1 @@
1
+ uri "/fromconf", :handler => Mongrel::Error404Handler.new("test")
@@ -0,0 +1,26 @@
1
+
2
+ require 'test/testhelp'
3
+
4
+ class MockHttpRequest
5
+ attr_reader :body
6
+
7
+ def params
8
+ return { 'REQUEST_METHOD' => 'GET'}
9
+ end
10
+ end
11
+
12
+ class CGIWrapperTest < Test::Unit::TestCase
13
+
14
+ def test_set_cookies_output_cookies
15
+ request = MockHttpRequest.new
16
+ response = nil # not needed for this test
17
+ output_headers = {}
18
+
19
+ cgi = Mongrel::CGIWrapper.new(request, response)
20
+ session = CGI::Session.new(cgi, 'database_manager' => CGI::Session::MemoryStore)
21
+ cgi.send_cookies(output_headers)
22
+
23
+ assert(output_headers.has_key?("Set-Cookie"))
24
+ assert_equal("_session_id="+session.session_id+"; path=", output_headers["Set-Cookie"])
25
+ end
26
+ end
@@ -0,0 +1,86 @@
1
+ # Copyright (c) 2005 Zed A. Shaw
2
+ # You can redistribute it and/or modify it under the same terms as Ruby.
3
+ #
4
+ # Additional work donated by contributors. See http://mongrel.rubyforge.org/attributions.html
5
+ # for more information.
6
+
7
+ require 'test/testhelp'
8
+
9
+ class TestCommand < GemPlugin::Plugin "/commands"
10
+ include Mongrel::Command::Base
11
+
12
+ def configure
13
+ options [
14
+ ["-e", "--environment ENV", "Rails environment to run as", :@environment, ENV['RAILS_ENV'] || "development"],
15
+ ['', '--user USER', "User to run as", :@user, nil],
16
+ ["-d", "--daemonize", "Whether to run in the background or not", :@daemon, false],
17
+ ["-x", "--test", "Used to let the test run failures", :@test, false],
18
+ ]
19
+ end
20
+
21
+ def validate
22
+ valid_dir? ".", "Can't validate current directory."
23
+ valid_exists? "Rakefile", "Rakefile not there, test is invalid."
24
+ if @test
25
+ valid_exist? "BADFILE", "Yeah, badfile"
26
+ valid_file? "BADFILE", "Not even a file"
27
+ valid_dir? "BADDIR", "No dir here"
28
+ valid? false, "Total failure"
29
+ end
30
+
31
+ return @valid
32
+ end
33
+
34
+
35
+ def run
36
+ $test_command_ran = true
37
+ end
38
+ end
39
+
40
+ class CommandTest < Test::Unit::TestCase
41
+
42
+ def setup
43
+ $test_command_ran = false
44
+ end
45
+
46
+ def teardown
47
+ end
48
+
49
+ def run_cmd(args)
50
+ Mongrel::Command::Registry.instance.run args
51
+ end
52
+
53
+ def test_run_command
54
+ redirect_test_io do
55
+ run_cmd ["testcommand"]
56
+ assert $test_command_ran, "command didn't run"
57
+ end
58
+ end
59
+
60
+ def test_command_error
61
+ redirect_test_io do
62
+ run_cmd ["crapcommand"]
63
+ end
64
+ end
65
+
66
+ def test_command_listing
67
+ redirect_test_io do
68
+ run_cmd ["help"]
69
+ end
70
+ end
71
+
72
+ def test_options
73
+ redirect_test_io do
74
+ run_cmd ["testcommand","-h"]
75
+ run_cmd ["testcommand","--help"]
76
+ run_cmd ["testcommand","-e","test","-d","--user"]
77
+ end
78
+ end
79
+
80
+ def test_version
81
+ redirect_test_io do
82
+ run_cmd ["testcommand", "--version"]
83
+ end
84
+ end
85
+
86
+ end
@@ -0,0 +1,107 @@
1
+ # Copyright (c) 2005 Zed A. Shaw
2
+ # You can redistribute it and/or modify it under the same terms as Ruby.
3
+ #
4
+ # Additional work donated by contributors. See http://mongrel.rubyforge.org/attributions.html
5
+ # for more information.
6
+
7
+ require 'test/testhelp'
8
+
9
+ include Mongrel
10
+
11
+ class ConditionalResponseTest < Test::Unit::TestCase
12
+ def setup
13
+ @server = HttpServer.new('127.0.0.1', 3501)
14
+ @server.register('/', Mongrel::DirHandler.new('.'))
15
+ @server.run
16
+
17
+ @http = Net::HTTP.new(@server.host, @server.port)
18
+
19
+ # get the ETag and Last-Modified headers
20
+ @path = '/README'
21
+ res = @http.start { |http| http.get(@path) }
22
+ assert_not_nil @etag = res['ETag']
23
+ assert_not_nil @last_modified = res['Last-Modified']
24
+ assert_not_nil @content_length = res['Content-Length']
25
+ end
26
+
27
+ def teardown
28
+ @server.stop(true)
29
+ end
30
+
31
+ # status should be 304 Not Modified when If-None-Match is the matching ETag
32
+ def test_not_modified_via_if_none_match
33
+ assert_status_for_get_and_head Net::HTTPNotModified, 'If-None-Match' => @etag
34
+ end
35
+
36
+ # status should be 304 Not Modified when If-Modified-Since is the matching Last-Modified date
37
+ def test_not_modified_via_if_modified_since
38
+ assert_status_for_get_and_head Net::HTTPNotModified, 'If-Modified-Since' => @last_modified
39
+ end
40
+
41
+ # status should be 304 Not Modified when If-None-Match is the matching ETag
42
+ # and If-Modified-Since is the matching Last-Modified date
43
+ def test_not_modified_via_if_none_match_and_if_modified_since
44
+ assert_status_for_get_and_head Net::HTTPNotModified, 'If-None-Match' => @etag, 'If-Modified-Since' => @last_modified
45
+ end
46
+
47
+ # status should be 200 OK when If-None-Match is invalid
48
+ def test_invalid_if_none_match
49
+ assert_status_for_get_and_head Net::HTTPOK, 'If-None-Match' => 'invalid'
50
+ assert_status_for_get_and_head Net::HTTPOK, 'If-None-Match' => 'invalid', 'If-Modified-Since' => @last_modified
51
+ end
52
+
53
+ # status should be 200 OK when If-Modified-Since is invalid
54
+ def test_invalid_if_modified_since
55
+ assert_status_for_get_and_head Net::HTTPOK, 'If-Modified-Since' => 'invalid'
56
+ assert_status_for_get_and_head Net::HTTPOK, 'If-None-Match' => @etag, 'If-Modified-Since' => 'invalid'
57
+ end
58
+
59
+ # status should be 304 Not Modified when If-Modified-Since is greater than the Last-Modified header, but less than the system time
60
+ def test_if_modified_since_greater_than_last_modified
61
+ sleep 2
62
+ last_modified_plus_1 = (Time.httpdate(@last_modified) + 1).httpdate
63
+ assert_status_for_get_and_head Net::HTTPNotModified, 'If-Modified-Since' => last_modified_plus_1
64
+ assert_status_for_get_and_head Net::HTTPNotModified, 'If-None-Match' => @etag, 'If-Modified-Since' => last_modified_plus_1
65
+ end
66
+
67
+ # status should be 200 OK when If-Modified-Since is less than the Last-Modified header
68
+ def test_if_modified_since_less_than_last_modified
69
+ last_modified_minus_1 = (Time.httpdate(@last_modified) - 1).httpdate
70
+ assert_status_for_get_and_head Net::HTTPOK, 'If-Modified-Since' => last_modified_minus_1
71
+ assert_status_for_get_and_head Net::HTTPOK, 'If-None-Match' => @etag, 'If-Modified-Since' => last_modified_minus_1
72
+ end
73
+
74
+ # status should be 200 OK when If-Modified-Since is a date in the future
75
+ def test_future_if_modified_since
76
+ the_future = Time.at(2**31-1).httpdate
77
+ assert_status_for_get_and_head Net::HTTPOK, 'If-Modified-Since' => the_future
78
+ assert_status_for_get_and_head Net::HTTPOK, 'If-None-Match' => @etag, 'If-Modified-Since' => the_future
79
+ end
80
+
81
+ # status should be 200 OK when If-None-Match is a wildcard
82
+ def test_wildcard_match
83
+ assert_status_for_get_and_head Net::HTTPOK, 'If-None-Match' => '*'
84
+ assert_status_for_get_and_head Net::HTTPOK, 'If-None-Match' => '*', 'If-Modified-Since' => @last_modified
85
+ end
86
+
87
+ private
88
+
89
+ # assert the response status is correct for GET and HEAD
90
+ def assert_status_for_get_and_head(response_class, headers = {})
91
+ %w{ get head }.each do |method|
92
+ res = @http.send(method, @path, headers)
93
+ assert_kind_of response_class, res
94
+ assert_equal @etag, res['ETag']
95
+ case response_class.to_s
96
+ when 'Net::HTTPNotModified' then
97
+ assert_nil res['Last-Modified']
98
+ assert_nil res['Content-Length']
99
+ when 'Net::HTTPOK' then
100
+ assert_equal @last_modified, res['Last-Modified']
101
+ assert_equal @content_length, res['Content-Length']
102
+ else
103
+ fail "Incorrect response class: #{response_class}"
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,87 @@
1
+ # Copyright (c) 2005 Zed A. Shaw
2
+ # You can redistribute it and/or modify it under the same terms as Ruby.
3
+ #
4
+ # Additional work donated by contributors. See http://mongrel.rubyforge.org/attributions.html
5
+ # for more information.
6
+
7
+ require 'test/testhelp'
8
+
9
+ $test_plugin_fired = 0
10
+
11
+ class TestPlugin < GemPlugin::Plugin "/handlers"
12
+ include Mongrel::HttpHandlerPlugin
13
+
14
+ def process(request, response)
15
+ $test_plugin_fired += 1
16
+ end
17
+ end
18
+
19
+
20
+ class Sentinel < GemPlugin::Plugin "/handlers"
21
+ include Mongrel::HttpHandlerPlugin
22
+
23
+ def process(request, response)
24
+ raise "This Sentinel plugin shouldn't run."
25
+ end
26
+ end
27
+
28
+
29
+ class ConfiguratorTest < Test::Unit::TestCase
30
+
31
+ def test_base_handler_config
32
+ @config = nil
33
+
34
+ redirect_test_io do
35
+ @config = Mongrel::Configurator.new :host => "localhost" do
36
+ listener :port => 4501 do
37
+ # 2 in front should run, but the sentinel shouldn't since dirhandler processes the request
38
+ uri "/", :handler => plugin("/handlers/testplugin")
39
+ uri "/", :handler => plugin("/handlers/testplugin")
40
+ uri "/", :handler => Mongrel::DirHandler.new(".")
41
+ uri "/", :handler => plugin("/handlers/testplugin")
42
+
43
+ uri "/test", :handler => plugin("/handlers/testplugin")
44
+ uri "/test", :handler => plugin("/handlers/testplugin")
45
+ uri "/test", :handler => Mongrel::DirHandler.new(".")
46
+ uri "/test", :handler => plugin("/handlers/testplugin")
47
+
48
+ debug "/"
49
+ setup_signals
50
+
51
+ run_config(File.dirname(__FILE__) + "/../test/mongrel.conf")
52
+ load_mime_map(File.dirname(__FILE__) + "/../test/mime.yaml")
53
+
54
+ run
55
+ end
56
+ end
57
+ end
58
+
59
+ # pp @config.listeners.values.first.classifier.routes
60
+
61
+ @config.listeners.each do |host,listener|
62
+ assert listener.classifier.uris.length == 3, "Wrong number of registered URIs"
63
+ assert listener.classifier.uris.include?("/"), "/ not registered"
64
+ assert listener.classifier.uris.include?("/test"), "/test not registered"
65
+ end
66
+
67
+ res = Net::HTTP.get(URI.parse('http://localhost:4501/test'))
68
+ assert res != nil, "Didn't get a response"
69
+ assert $test_plugin_fired == 3, "Test filter plugin didn't run 3 times."
70
+
71
+ redirect_test_io do
72
+ res = Net::HTTP.get(URI.parse('http://localhost:4501/'))
73
+
74
+ assert res != nil, "Didn't get a response"
75
+ assert $test_plugin_fired == 6, "Test filter plugin didn't run 6 times."
76
+ end
77
+
78
+ redirect_test_io do
79
+ @config.stop(false, true)
80
+ end
81
+
82
+ assert_raise Errno::EBADF, Errno::ECONNREFUSED do
83
+ res = Net::HTTP.get(URI.parse("http://localhost:4501/"))
84
+ end
85
+ end
86
+
87
+ end
@@ -0,0 +1,25 @@
1
+ # Copyright (c) 2005 Zed A. Shaw
2
+ # You can redistribute it and/or modify it under the same terms as Ruby.
3
+ #
4
+ # Additional work donated by contributors. See http://mongrel.rubyforge.org/attributions.html
5
+ # for more information.
6
+
7
+ require 'test/testhelp'
8
+ require 'mongrel/debug'
9
+
10
+ class MongrelDbgTest < Test::Unit::TestCase
11
+
12
+ def test_tracing_to_log
13
+ FileUtils.rm_rf "log/mongrel_debug"
14
+
15
+ MongrelDbg::configure
16
+ out = StringIO.new
17
+
18
+ MongrelDbg::begin_trace(:rails)
19
+ MongrelDbg::trace(:rails, "Good stuff")
20
+ MongrelDbg::end_trace(:rails)
21
+
22
+ assert File.exist?("log/mongrel_debug"), "Didn't make logging directory"
23
+ end
24
+
25
+ end
@@ -0,0 +1,103 @@
1
+ # Copyright (c) 2005 Zed A. Shaw
2
+ # You can redistribute it and/or modify it under the same terms as Ruby.
3
+ #
4
+ # Additional work donated by contributors. See http://mongrel.rubyforge.org/attributions.html
5
+ # for more information.
6
+
7
+ require 'test/testhelp'
8
+
9
+ class SimpleHandler < Mongrel::HttpHandler
10
+ def process(request, response)
11
+ response.start do |head,out|
12
+ head["Content-Type"] = "text/html"
13
+ results = "<html><body>Your request:<br /><pre>#{request.params.to_yaml}</pre><a href=\"/files\">View the files.</a></body></html>"
14
+ out << results
15
+ end
16
+ end
17
+ end
18
+
19
+ class DumbHandler < Mongrel::HttpHandler
20
+ def process(request, response)
21
+ response.start do |head,out|
22
+ head["Content-Type"] = "text/html"
23
+ out.write("test")
24
+ end
25
+ end
26
+ end
27
+
28
+ def check_status(results, expecting)
29
+ results.each do |res|
30
+ assert(res.kind_of?(expecting), "Didn't get #{expecting}, got: #{res.class}")
31
+ end
32
+ end
33
+
34
+ class HandlersTest < Test::Unit::TestCase
35
+
36
+ def setup
37
+ stats = Mongrel::StatisticsFilter.new(:sample_rate => 1)
38
+
39
+ @config = Mongrel::Configurator.new :host => '127.0.0.1', :port => 9998 do
40
+ listener do
41
+ uri "/", :handler => SimpleHandler.new
42
+ uri "/", :handler => stats
43
+ uri "/404", :handler => Mongrel::Error404Handler.new("Not found")
44
+ uri "/dumb", :handler => Mongrel::DeflateFilter.new
45
+ uri "/dumb", :handler => DumbHandler.new, :in_front => true
46
+ uri "/files", :handler => Mongrel::DirHandler.new("doc")
47
+ uri "/files_nodir", :handler => Mongrel::DirHandler.new("doc", listing_allowed=false, index_html="none")
48
+ uri "/status", :handler => Mongrel::StatusHandler.new(:stats_filter => stats)
49
+ uri "/relative", :handler => Mongrel::DirHandler.new(nil, listing_allowed=false, index_html="none")
50
+ end
51
+ end
52
+ @config.run
53
+ end
54
+
55
+ def teardown
56
+ @config.stop(false, true)
57
+ end
58
+
59
+ def test_more_web_server
60
+ res = hit([ "http://localhost:9998/test",
61
+ "http://localhost:9998/dumb",
62
+ "http://localhost:9998/404",
63
+ "http://localhost:9998/files/rdoc/index.html",
64
+ "http://localhost:9998/files/rdoc/nothere.html",
65
+ "http://localhost:9998/files/rdoc/",
66
+ "http://localhost:9998/files_nodir/rdoc/",
67
+ "http://localhost:9998/status",
68
+ ])
69
+
70
+ # XXX This can't possibly have good coverage.
71
+ check_status res, String
72
+ end
73
+
74
+ def test_deflate
75
+ Net::HTTP.start("localhost", 9998) do |h|
76
+ # test that no accept-encoding returns a non-deflated response
77
+ req = h.get("/dumb")
78
+ assert(
79
+ !req['Content-Encoding'] ||
80
+ !req['Content-Encoding'].include?('deflate'))
81
+ assert_equal "test", req.body
82
+
83
+ req = h.get("/dumb", {"Accept-Encoding" => "deflate"})
84
+ # -MAX_WBITS stops zlib from looking for a zlib header
85
+ inflater = Zlib::Inflate.new(-Zlib::MAX_WBITS)
86
+ assert req['Content-Encoding'].include?('deflate')
87
+ assert_equal "test", inflater.inflate(req.body)
88
+ end
89
+ end
90
+
91
+ # TODO: find out why this fails on win32 but nowhere else
92
+ #def test_posting_fails_dirhandler
93
+ # req = Net::HTTP::Post.new("http://localhost:9998/files/rdoc/")
94
+ # req.set_form_data({'from'=>'2005-01-01', 'to'=>'2005-03-31'}, ';')
95
+ # res = hit [["http://localhost:9998/files/rdoc/",req]]
96
+ # check_status res, Net::HTTPNotFound
97
+ #end
98
+
99
+ def test_unregister
100
+ @config.listeners["127.0.0.1:9998"].unregister("/")
101
+ end
102
+ end
103
+