headius-mongrel 1.1.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. data/CHANGELOG +21 -0
  2. data/COPYING +55 -0
  3. data/LICENSE +55 -0
  4. data/Manifest +69 -0
  5. data/README +74 -0
  6. data/Rakefile +202 -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 +353 -0
  32. data/ext/http11_java/org/jruby/mongrel/Http11Parser.java +572 -0
  33. data/lib/mongrel.rb +364 -0
  34. data/lib/mongrel/camping.rb +107 -0
  35. data/lib/mongrel/cgi.rb +181 -0
  36. data/lib/mongrel/command.rb +222 -0
  37. data/lib/mongrel/configurator.rb +388 -0
  38. data/lib/mongrel/const.rb +110 -0
  39. data/lib/mongrel/debug.rb +203 -0
  40. data/lib/mongrel/gems.rb +22 -0
  41. data/lib/mongrel/handlers.rb +468 -0
  42. data/lib/mongrel/header_out.rb +28 -0
  43. data/lib/mongrel/http_request.rb +155 -0
  44. data/lib/mongrel/http_response.rb +163 -0
  45. data/lib/mongrel/init.rb +10 -0
  46. data/lib/mongrel/mime_types.yml +616 -0
  47. data/lib/mongrel/rails.rb +192 -0
  48. data/lib/mongrel/stats.rb +89 -0
  49. data/lib/mongrel/tcphack.rb +18 -0
  50. data/lib/mongrel/uri_classifier.rb +76 -0
  51. data/mongrel-public_cert.pem +20 -0
  52. data/mongrel.gemspec +47 -0
  53. data/setup.rb +1585 -0
  54. data/test/mime.yaml +3 -0
  55. data/test/mongrel.conf +1 -0
  56. data/test/test_cgi_wrapper.rb +26 -0
  57. data/test/test_command.rb +86 -0
  58. data/test/test_conditional.rb +107 -0
  59. data/test/test_configurator.rb +88 -0
  60. data/test/test_debug.rb +25 -0
  61. data/test/test_handlers.rb +126 -0
  62. data/test/test_http11.rb +156 -0
  63. data/test/test_redirect_handler.rb +45 -0
  64. data/test/test_request_progress.rb +100 -0
  65. data/test/test_response.rb +127 -0
  66. data/test/test_stats.rb +35 -0
  67. data/test/test_uriclassifier.rb +261 -0
  68. data/test/test_ws.rb +115 -0
  69. data/test/testhelp.rb +79 -0
  70. data/tools/trickletest.rb +45 -0
  71. metadata +199 -0
@@ -0,0 +1,192 @@
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 'mongrel'
8
+ require 'cgi'
9
+
10
+
11
+ module Mongrel
12
+ module Rails
13
+ # Implements a handler that can run Rails and serve files out of the
14
+ # Rails application's public directory. This lets you run your Rails
15
+ # application with Mongrel during development and testing, then use it
16
+ # also in production behind a server that's better at serving the
17
+ # static files.
18
+ #
19
+ # The RailsHandler takes a mime_map parameter which is a simple suffix=mimetype
20
+ # mapping that it should add to the list of valid mime types.
21
+ #
22
+ # It also supports page caching directly and will try to resolve a request
23
+ # in the following order:
24
+ #
25
+ # * If the requested exact PATH_INFO exists as a file then serve it.
26
+ # * If it exists at PATH_INFO+".html" exists then serve that.
27
+ # * Finally, construct a Mongrel::CGIWrapper and run Dispatcher.dispatch to have Rails go.
28
+ #
29
+ # This means that if you are using page caching it will actually work with Mongrel
30
+ # and you should see a decent speed boost (but not as fast as if you use a static
31
+ # server like Apache or Litespeed).
32
+ class RailsHandler < Mongrel::HttpHandler
33
+ attr_reader :files
34
+ attr_reader :guard
35
+ @@file_only_methods = ["GET","HEAD"]
36
+
37
+ def initialize(dir, mime_map = {})
38
+ @files = Mongrel::DirHandler.new(dir,false)
39
+ @guard = Mutex.new
40
+
41
+ # Register the requested MIME types
42
+ mime_map.each {|k,v| Mongrel::DirHandler::add_mime_type(k,v) }
43
+ end
44
+
45
+ # Attempts to resolve the request as follows:
46
+ #
47
+ # * If the requested exact PATH_INFO exists as a file then serve it.
48
+ # * If it exists at PATH_INFO+".html" exists then serve that.
49
+ # * Finally, construct a Mongrel::CGIWrapper and run Dispatcher.dispatch to have Rails go.
50
+ def process(request, response)
51
+ return if response.socket.closed?
52
+
53
+ path_info = request.params[Mongrel::Const::PATH_INFO]
54
+ rest_operator = request.params[Mongrel::Const::REQUEST_URI][/^#{Regexp.escape path_info}(;[^\?]+)/, 1].to_s
55
+ path_info.chomp!("/")
56
+
57
+ page_cached = path_info + rest_operator + ActionController::Base.page_cache_extension
58
+ get_or_head = @@file_only_methods.include? request.params[Mongrel::Const::REQUEST_METHOD]
59
+
60
+ if get_or_head and @files.can_serve(path_info)
61
+ # File exists as-is so serve it up
62
+ @files.process(request,response)
63
+ elsif get_or_head and @files.can_serve(page_cached)
64
+ # Possible cached page, serve it up
65
+ request.params[Mongrel::Const::PATH_INFO] = page_cached
66
+ @files.process(request,response)
67
+ else
68
+ begin
69
+ cgi = Mongrel::CGIWrapper.new(request, response)
70
+ cgi.handler = self
71
+ # We don't want the output to be really final until we're out of the lock
72
+ cgi.default_really_final = false
73
+
74
+ if ActionController::Base.allow_concurrency
75
+ _dispatch_unlocked(cgi, request, response)
76
+ else
77
+ @guard.synchronize { _dispatch_unlocked(cgi, request, response) }
78
+ end
79
+ # This finalizes the output using the proper HttpResponse way
80
+ cgi.out("text/html",true) {""}
81
+ rescue Errno::EPIPE
82
+ response.socket.close
83
+ rescue Object => rails_error
84
+ STDERR.puts "#{Time.now}: Error calling Dispatcher.dispatch #{rails_error.inspect}"
85
+ STDERR.puts rails_error.backtrace.join("\n")
86
+ end
87
+ end
88
+ end
89
+
90
+ # Does the internal reload for Rails. It might work for most cases, but
91
+ # sometimes you get exceptions. In that case just do a real restart.
92
+ def reload!
93
+ begin
94
+ @guard.synchronize {
95
+ $".replace $orig_dollar_quote
96
+ GC.start
97
+ Dispatcher.reset_application!
98
+ ActionController::Routing::Routes.reload
99
+ }
100
+ end
101
+ end
102
+
103
+ private
104
+
105
+ def _dispatch_unlocked(cgi, request, response)
106
+ @active_request_path = request.params[Mongrel::Const::PATH_INFO]
107
+ Dispatcher.dispatch(cgi, ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, response.body)
108
+ @active_request_path = nil
109
+ end
110
+ end
111
+
112
+ # Creates Rails specific configuration options for people to use
113
+ # instead of the base Configurator.
114
+ class RailsConfigurator < Mongrel::Configurator
115
+
116
+ # Creates a single rails handler and returns it so you
117
+ # can add it to a URI. You can actually attach it to
118
+ # as many URIs as you want, but this returns the
119
+ # same RailsHandler for each call.
120
+ #
121
+ # Requires the following options:
122
+ #
123
+ # * :docroot => The public dir to serve from.
124
+ # * :environment => Rails environment to use.
125
+ # * :cwd => The change to working directory
126
+ #
127
+ # And understands the following optional settings:
128
+ #
129
+ # * :mime => A map of mime types.
130
+ #
131
+ # Because of how Rails is designed you can only have
132
+ # one installed per Ruby interpreter (talk to them
133
+ # about thread safety). Because of this the first
134
+ # time you call this function it does all the config
135
+ # needed to get your Rails working. After that
136
+ # it returns the one handler you've configured.
137
+ # This lets you attach Rails to any URI(s) you want,
138
+ # but it still protects you from threads destroying
139
+ # your handler.
140
+ def rails(options={})
141
+
142
+ return @rails_handler if @rails_handler
143
+
144
+ ops = resolve_defaults(options)
145
+
146
+ # fix up some defaults
147
+ ops[:environment] ||= "development"
148
+ ops[:docroot] ||= "public"
149
+ ops[:mime] ||= {}
150
+
151
+ $orig_dollar_quote = $".clone
152
+ ENV['RAILS_ENV'] = ops[:environment]
153
+ env_location = "#{ops[:cwd]}/config/environment"
154
+ require env_location
155
+ require 'dispatcher'
156
+ require 'mongrel/rails'
157
+
158
+ ActionController::AbstractRequest.relative_url_root = ops[:prefix] if ops[:prefix]
159
+
160
+ @rails_handler = RailsHandler.new(ops[:docroot], ops[:mime])
161
+ end
162
+
163
+ # Reloads Rails. This isn't too reliable really, but it
164
+ # should work for most minimal reload purposes. The only reliable
165
+ # way to reload properly is to stop and then start the process.
166
+ def reload!
167
+ if not @rails_handler
168
+ raise "Rails was not configured. Read the docs for RailsConfigurator."
169
+ end
170
+
171
+ log "Reloading Rails..."
172
+ @rails_handler.reload!
173
+ log "Done reloading Rails."
174
+
175
+ end
176
+
177
+ # Takes the exact same configuration as Mongrel::Configurator (and actually calls that)
178
+ # but sets up the additional HUP handler to call reload!.
179
+ def setup_rails_signals(options={})
180
+ ops = resolve_defaults(options)
181
+ setup_signals(options)
182
+
183
+ if RUBY_PLATFORM !~ /mswin|mingw/
184
+ # rails reload
185
+ trap("HUP") { log "HUP signal received."; reload! }
186
+
187
+ log "Rails signals registered. HUP => reload (without restart). It might not work well."
188
+ end
189
+ end
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,89 @@
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
+ # A very simple little class for doing some basic fast statistics sampling.
8
+ # You feed it either samples of numeric data you want measured or you call
9
+ # Stats.tick to get it to add a time delta between the last time you called it.
10
+ # When you're done either call sum, sumsq, n, min, max, mean or sd to get
11
+ # the information. The other option is to just call dump and see everything.
12
+ #
13
+ # It does all of this very fast and doesn't take up any memory since the samples
14
+ # are not stored but instead all the values are calculated on the fly.
15
+ module Mongrel
16
+ class Stats
17
+ attr_reader :sum, :sumsq, :n, :min, :max
18
+
19
+ def initialize(name)
20
+ @name = name
21
+ reset
22
+ end
23
+
24
+ # Resets the internal counters so you can start sampling again.
25
+ def reset
26
+ @sum = 0.0
27
+ @sumsq = 0.0
28
+ @last_time = Time.new
29
+ @n = 0.0
30
+ @min = 0.0
31
+ @max = 0.0
32
+ end
33
+
34
+ # Adds a sampling to the calculations.
35
+ def sample(s)
36
+ @sum += s
37
+ @sumsq += s * s
38
+ if @n == 0
39
+ @min = @max = s
40
+ else
41
+ @min = s if @min > s
42
+ @max = s if @max < s
43
+ end
44
+ @n+=1
45
+ end
46
+
47
+ # Dump this Stats object with an optional additional message.
48
+ def dump(msg = "", out=STDERR)
49
+ out.puts "#{msg}: #{self.to_s}"
50
+ end
51
+
52
+ # Returns a common display (used by dump)
53
+ def to_s
54
+ "[#{@name}]: SUM=%0.4f, SUMSQ=%0.4f, N=%0.4f, MEAN=%0.4f, SD=%0.4f, MIN=%0.4f, MAX=%0.4f" % [@sum, @sumsq, @n, mean, sd, @min, @max]
55
+ end
56
+
57
+
58
+ # Calculates and returns the mean for the data passed so far.
59
+ def mean
60
+ @sum / @n
61
+ end
62
+
63
+ # Calculates the standard deviation of the data so far.
64
+ def sd
65
+ # (sqrt( ((s).sumsq - ( (s).sum * (s).sum / (s).n)) / ((s).n-1) ))
66
+ begin
67
+ return Math.sqrt( (@sumsq - ( @sum * @sum / @n)) / (@n-1) )
68
+ rescue Errno::EDOM
69
+ return 0.0
70
+ end
71
+ end
72
+
73
+
74
+ # Adds a time delta between now and the last time you called this. This
75
+ # will give you the average time between two activities.
76
+ #
77
+ # An example is:
78
+ #
79
+ # t = Stats.new("do_stuff")
80
+ # 10000.times { do_stuff(); t.tick }
81
+ # t.dump("time")
82
+ #
83
+ def tick
84
+ now = Time.now
85
+ sample(now - @last_time)
86
+ @last_time = now
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,18 @@
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
+
8
+ # A modification proposed by Sean Treadway that increases the default accept
9
+ # queue of TCPServer to 1024 so that it handles more concurrent requests.
10
+ class TCPServer
11
+ def initialize_with_backlog(*args)
12
+ initialize_without_backlog(*args)
13
+ listen(1024)
14
+ end
15
+
16
+ alias_method :initialize_without_backlog, :initialize
17
+ alias_method :initialize, :initialize_with_backlog
18
+ end
@@ -0,0 +1,76 @@
1
+
2
+ module Mongrel
3
+ class URIClassifier
4
+
5
+ class RegistrationError < RuntimeError
6
+ end
7
+ class UsageError < RuntimeError
8
+ end
9
+
10
+ attr_reader :handler_map
11
+
12
+ # Returns the URIs that have been registered with this classifier so far.
13
+ def uris
14
+ @handler_map.keys
15
+ end
16
+
17
+ def initialize
18
+ @handler_map = {}
19
+ @matcher = //
20
+ @root_handler = nil
21
+ end
22
+
23
+ # Register a handler object at a particular URI. The handler can be whatever
24
+ # you want, including an array. It's up to you what to do with it.
25
+ #
26
+ # Registering a handler is not necessarily threadsafe, so be careful if you go
27
+ # mucking around once the server is running.
28
+ def register(uri, handler)
29
+ raise RegistrationError, "#{uri.inspect} is already registered" if @handler_map[uri]
30
+ raise RegistrationError, "URI is empty" if !uri or uri.empty?
31
+ raise RegistrationError, "URI must begin with a \"#{Const::SLASH}\"" unless uri[0..0] == Const::SLASH
32
+ @handler_map[uri.dup] = handler
33
+ rebuild
34
+ end
35
+
36
+ # Unregister a particular URI and its handler.
37
+ def unregister(uri)
38
+ handler = @handler_map.delete(uri)
39
+ raise RegistrationError, "#{uri.inspect} was not registered" unless handler
40
+ rebuild
41
+ handler
42
+ end
43
+
44
+ # Resolve a request URI by finding the best partial match in the registered
45
+ # handler URIs.
46
+ def resolve(request_uri)
47
+ if @root_handler
48
+ # Optimization for the pathological case of only one handler on "/"; e.g. Rails
49
+ [Const::SLASH, request_uri, @root_handler]
50
+ elsif match = @matcher.match(request_uri)
51
+ uri = match.to_s
52
+ # A root mounted ("/") handler must resolve such that path info matches the original URI.
53
+ [uri, (uri == Const::SLASH ? request_uri : match.post_match), @handler_map[uri]]
54
+ else
55
+ [nil, nil, nil]
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def rebuild
62
+ if @handler_map.size == 1 and @handler_map[Const::SLASH]
63
+ @root_handler = @handler_map.values.first
64
+ else
65
+ @root_handler = nil
66
+ routes = @handler_map.keys.sort.sort_by do |uri|
67
+ -uri.length
68
+ end
69
+ @matcher = Regexp.new(routes.map do |uri|
70
+ Regexp.new('^' + Regexp.escape(uri))
71
+ end.join('|'))
72
+ end
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,20 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDUDCCAjigAwIBAgIBADANBgkqhkiG9w0BAQUFADBOMRwwGgYDVQQDDBNtb25n
3
+ cmVsLWRldmVsb3BtZW50MRkwFwYKCZImiZPyLGQBGRYJcnVieWZvcmdlMRMwEQYK
4
+ CZImiZPyLGQBGRYDb3JnMB4XDTA3MDkxNjEwMzI0OVoXDTA4MDkxNTEwMzI0OVow
5
+ TjEcMBoGA1UEAwwTbW9uZ3JlbC1kZXZlbG9wbWVudDEZMBcGCgmSJomT8ixkARkW
6
+ CXJ1Ynlmb3JnZTETMBEGCgmSJomT8ixkARkWA29yZzCCASIwDQYJKoZIhvcNAQEB
7
+ BQADggEPADCCAQoCggEBAMb9v3B01eOHk3FyypbQgKXzJplUE5P6dXoG+xpPm0Lv
8
+ P7BQmeMncOwqQ7zXpVQU+lTpXtQFTsOE3vL7KnhQFJKGvUAkbh24VFyopu1I0yqF
9
+ mGu4nRqNXGXVj8TvLSj4S1WpSRLAa0acLPNyKhGmoV9+crqQypSjM6XKjBeppifo
10
+ 4eBmWGjiJEYMIJBvJZPJ4rAVDDA8C6CM1m3gMBGNh8ELDhU8HI9AP3dMIkTI2Wx9
11
+ 9xkJwHdroAaS0IFFtYChrwee4FbCF1FHDgoTosMwa47DrLHg4hZ6ojaKwK5QVWEV
12
+ XGb6ju5UqpktnSWF2W+Lvl/K0tI42OH2CAhebT1gEVUCAwEAAaM5MDcwCQYDVR0T
13
+ BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFGHChyMSZ16u9WOzKhgJSQ9lqDc5
14
+ MA0GCSqGSIb3DQEBBQUAA4IBAQA/lfeN2WdB1xN+82tT7vNS4HOjRQw6MUh5yktu
15
+ GQjaGqm0UB+aX0Z9y0B0qpfv9rj7nmIvEGiwBmDepNWYCGuW15JyqpN7QVVnG2xS
16
+ Mrame7VqgjM7A+VGDD5In5LtWbM/CHAATvvFlQ5Ph13YE1EdnVbZ65c+KQv+5sFY
17
+ Q+zEop74d878uaC/SAHHXS46TiXneocaLSYw1CEZs/MAIy+9c4Q5ESbGpgnfg1Ad
18
+ 6lwl7k3hsNHO/+tZzx4HJtOXDI1yAl3+q6T9J0yI3z97EinwvAKhS1eyOI2Y5eeT
19
+ tbQaNYkU127B3l/VNpd8fQm3Jkl/PqCCmDBQjUszFrJEODug
20
+ -----END CERTIFICATE-----
@@ -0,0 +1,47 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{mongrel}
5
+ s.version = "1.1.6.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Zed A. Shaw"]
9
+ s.date = %q{2009-06-11}
10
+ s.default_executable = %q{mongrel_rails}
11
+ s.description = %q{A small fast HTTP library and server that runs Rails, Camping, Nitro and Iowa apps.}
12
+ s.email = %q{}
13
+ s.executables = ["mongrel_rails"]
14
+ s.extensions = ["ext/http11/extconf.rb"]
15
+ s.extra_rdoc_files = ["CHANGELOG", "COPYING", "lib/mongrel/camping.rb", "lib/mongrel/cgi.rb", "lib/mongrel/command.rb", "lib/mongrel/configurator.rb", "lib/mongrel/const.rb", "lib/mongrel/debug.rb", "lib/mongrel/gems.rb", "lib/mongrel/handlers.rb", "lib/mongrel/header_out.rb", "lib/mongrel/http_request.rb", "lib/mongrel/http_response.rb", "lib/mongrel/init.rb", "lib/mongrel/rails.rb", "lib/mongrel/stats.rb", "lib/mongrel/tcphack.rb", "lib/mongrel/uri_classifier.rb", "lib/mongrel.rb", "LICENSE", "README"]
16
+ s.files = ["bin/mongrel_rails", "CHANGELOG", "COPYING", "examples/builder.rb", "examples/camping/blog.rb", "examples/camping/README", "examples/camping/tepee.rb", "examples/httpd.conf", "examples/mime.yaml", "examples/mongrel.conf", "examples/mongrel_simple_ctrl.rb", "examples/mongrel_simple_service.rb", "examples/monitrc", "examples/random_thrash.rb", "examples/simpletest.rb", "examples/webrick_compare.rb", "ext/http11/ext_help.h", "ext/http11/extconf.rb", "ext/http11/http11.c", "ext/http11/http11_parser.c", "ext/http11/http11_parser.h", "ext/http11/http11_parser.java.rl", "ext/http11/http11_parser.rl", "ext/http11/http11_parser_common.rl", "ext/http11_java/Http11Service.java", "ext/http11_java/org/jruby/mongrel/Http11.java", "ext/http11_java/org/jruby/mongrel/Http11Parser.java", "lib/mongrel/camping.rb", "lib/mongrel/cgi.rb", "lib/mongrel/command.rb", "lib/mongrel/configurator.rb", "lib/mongrel/const.rb", "lib/mongrel/debug.rb", "lib/mongrel/gems.rb", "lib/mongrel/handlers.rb", "lib/mongrel/header_out.rb", "lib/mongrel/http_request.rb", "lib/mongrel/http_response.rb", "lib/mongrel/init.rb", "lib/mongrel/mime_types.yml", "lib/mongrel/rails.rb", "lib/mongrel/stats.rb", "lib/mongrel/tcphack.rb", "lib/mongrel/uri_classifier.rb", "lib/mongrel.rb", "LICENSE", "Manifest", "mongrel-public_cert.pem", "mongrel.gemspec", "README", "setup.rb", "test/mime.yaml", "test/mongrel.conf", "test/test_cgi_wrapper.rb", "test/test_command.rb", "test/test_conditional.rb", "test/test_configurator.rb", "test/test_debug.rb", "test/test_handlers.rb", "test/test_http11.rb", "test/test_redirect_handler.rb", "test/test_request_progress.rb", "test/test_response.rb", "test/test_stats.rb", "test/test_uriclassifier.rb", "test/test_ws.rb", "test/testhelp.rb", "TODO", "tools/trickletest.rb", "Rakefile"]
17
+ s.homepage = %q{http://mongrel.rubyforge.org}
18
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Mongrel", "--main", "README"]
19
+ s.require_paths = ["lib", "ext"]
20
+ s.required_ruby_version = Gem::Requirement.new(">= 1.8.4")
21
+ s.rubyforge_project = %q{mongrel}
22
+ s.rubygems_version = %q{1.3.3}
23
+ s.summary = %q{A small fast HTTP library and server that runs Rails, Camping, Nitro and Iowa apps.}
24
+ s.test_files = ["test/test_cgi_wrapper.rb", "test/test_command.rb", "test/test_conditional.rb", "test/test_configurator.rb", "test/test_debug.rb", "test/test_handlers.rb", "test/test_http11.rb", "test/test_redirect_handler.rb", "test/test_request_progress.rb", "test/test_response.rb", "test/test_stats.rb", "test/test_uriclassifier.rb", "test/test_ws.rb"]
25
+
26
+ if s.respond_to? :specification_version then
27
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
28
+ s.specification_version = 3
29
+
30
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
31
+ s.add_runtime_dependency(%q<gem_plugin>, [">= 0.2.3"])
32
+ s.add_runtime_dependency(%q<daemons>, [">= 1.0.3"])
33
+ s.add_runtime_dependency(%q<fastthread>, [">= 1.0.1"])
34
+ s.add_runtime_dependency(%q<cgi_multipart_eof_fix>, [">= 2.4"])
35
+ else
36
+ s.add_dependency(%q<gem_plugin>, [">= 0.2.3"])
37
+ s.add_dependency(%q<daemons>, [">= 1.0.3"])
38
+ s.add_dependency(%q<fastthread>, [">= 1.0.1"])
39
+ s.add_dependency(%q<cgi_multipart_eof_fix>, [">= 2.4"])
40
+ end
41
+ else
42
+ s.add_dependency(%q<gem_plugin>, [">= 0.2.3"])
43
+ s.add_dependency(%q<daemons>, [">= 1.0.3"])
44
+ s.add_dependency(%q<fastthread>, [">= 1.0.1"])
45
+ s.add_dependency(%q<cgi_multipart_eof_fix>, [">= 2.4"])
46
+ end
47
+ end