mongrel 0.3.12 → 0.3.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +1 -1
- data/bin/mongrel_rails +12 -6
- data/doc/rdoc/classes/Class.src/M000001.html +10 -10
- data/doc/rdoc/classes/Class.src/M000002.html +46 -46
- data/doc/rdoc/classes/Class.src/M000003.html +7 -7
- data/doc/rdoc/classes/Class.src/M000004.html +6 -6
- data/doc/rdoc/classes/IO.src/M000005.html +5 -5
- data/doc/rdoc/classes/IO.src/M000006.html +5 -5
- data/doc/rdoc/classes/Kernel.src/M000025.html +5 -5
- data/doc/rdoc/classes/Kernel.src/M000026.html +11 -11
- data/doc/rdoc/classes/Mongrel.html +1 -0
- data/doc/rdoc/classes/Mongrel/Command/Base.src/M000030.html +1 -1
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000099.html +10 -10
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000100.html +9 -9
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000101.html +4 -4
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000102.html +18 -18
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000103.html +5 -5
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000104.html +16 -16
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000105.html +19 -19
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000106.html +4 -4
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000107.html +10 -11
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000108.html +5 -5
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000109.html +8 -8
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000110.html +7 -7
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000111.html +4 -4
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000112.html +14 -13
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000113.html +5 -33
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000114.html +33 -5
- data/doc/rdoc/classes/Mongrel/Configurator.src/M000115.html +18 -0
- data/doc/rdoc/classes/Mongrel/Const.html +11 -1
- data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000116.html +5 -5
- data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000117.html +18 -0
- data/doc/rdoc/classes/Mongrel/HeaderOut.html +0 -185
- data/doc/rdoc/classes/Mongrel/HeaderOut.src/M000072.html +4 -4
- data/doc/rdoc/classes/Mongrel/HeaderOut.src/M000073.html +4 -4
- data/doc/rdoc/classes/Mongrel/HttpParser.src/M000054.html +3 -1
- data/doc/rdoc/classes/Mongrel/{StopServer.html → HttpParserError.html} +5 -11
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000118.html +15 -7
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000119.html +7 -7
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000120.html +7 -19
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000121.html +32 -0
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000075.html +12 -12
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000076.html +6 -6
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000077.html +11 -11
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000078.html +8 -8
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000079.html +8 -8
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000080.html +9 -9
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000081.html +4 -4
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000082.html +6 -6
- data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000083.html +4 -4
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000064.html +10 -10
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000065.html +51 -50
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000066.html +10 -10
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000067.html +45 -45
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000068.html +14 -14
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000069.html +4 -4
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000070.html +8 -8
- data/doc/rdoc/classes/Mongrel/HttpServer.src/M000071.html +4 -4
- data/doc/rdoc/classes/ObjectTracker.src/M000019.html +20 -22
- data/doc/rdoc/classes/RequestLog/Access.src/M000122.html +19 -0
- data/doc/rdoc/classes/RequestLog/Files.src/{M000121.html → M000123.html} +5 -5
- data/doc/rdoc/classes/RequestLog/Objects.src/{M000122.html → M000124.html} +5 -5
- data/doc/rdoc/classes/RequestLog/Params.src/{M000123.html → M000125.html} +5 -5
- data/doc/rdoc/classes/Stats.html +1 -1
- data/doc/rdoc/classes/Stats.src/M000012.html +2 -2
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/ext/http11/http11_c.html +1 -1
- data/doc/rdoc/files/lib/mongrel/command_rb.html +1 -1
- data/doc/rdoc/files/lib/mongrel/debug_rb.html +1 -1
- data/doc/rdoc/files/lib/mongrel/handlers_rb.html +1 -1
- data/doc/rdoc/files/lib/mongrel/stats_rb.html +1 -1
- data/doc/rdoc/files/lib/mongrel_rb.html +1 -1
- data/examples/random_thrash.rb +19 -0
- data/ext/http11/http11.c +57 -12
- data/ext/http11/http11_parser.c +58 -52
- data/lib/mongrel.rb +37 -10
- data/lib/mongrel/command.rb +1 -1
- data/lib/mongrel/debug.rb +39 -125
- data/lib/mongrel/handlers.rb +2 -2
- data/lib/mongrel/rails.rb +2 -1
- data/lib/mongrel/stats.rb +2 -2
- data/test/test_configurator.rb +2 -2
- data/test/test_debug.rb +2 -4
- data/test/test_http11.rb +76 -7
- data/test/test_stats.rb +6 -4
- data/test/test_uriclassifier.rb +0 -14
- metadata +12 -24
- data/doc/rdoc/classes/Mongrel/CGIWrapper.html +0 -383
- data/doc/rdoc/classes/Mongrel/Configurator.html +0 -563
- data/doc/rdoc/classes/Mongrel/Error404Handler.html +0 -171
- data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000115.html +0 -18
- data/doc/rdoc/classes/Mongrel/HttpHandler.html +0 -152
- data/doc/rdoc/classes/Mongrel/HttpRequest.html +0 -222
- data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000117.html +0 -28
- data/doc/rdoc/classes/Mongrel/HttpResponse.html +0 -371
- data/doc/rdoc/classes/Mongrel/URIClassifier.html +0 -301
- data/doc/rdoc/classes/RequestLog.html +0 -113
- data/doc/rdoc/classes/RequestLog/Files.html +0 -144
- data/doc/rdoc/classes/RequestLog/Objects.html +0 -144
- data/doc/rdoc/classes/RequestLog/Params.html +0 -144
- data/doc/rdoc/fr_class_index.html +0 -60
- data/doc/rdoc/fr_file_index.html +0 -40
- data/doc/rdoc/fr_method_index.html +0 -149
- data/doc/rdoc/index.html +0 -24
- data/lib/http11.bundle +0 -0
data/lib/mongrel/command.rb
CHANGED
data/lib/mongrel/debug.rb
CHANGED
|
@@ -43,7 +43,6 @@ end
|
|
|
43
43
|
|
|
44
44
|
module ObjectTracker
|
|
45
45
|
@active_objects = nil
|
|
46
|
-
@live_object_tracking = true
|
|
47
46
|
|
|
48
47
|
def ObjectTracker.configure
|
|
49
48
|
@active_objects = Set.new
|
|
@@ -53,45 +52,32 @@ module ObjectTracker
|
|
|
53
52
|
end
|
|
54
53
|
end
|
|
55
54
|
|
|
56
|
-
|
|
57
|
-
def ObjectTracker.start
|
|
58
|
-
@live_object_tracking = true
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def ObjectTracker.stop
|
|
62
|
-
@live_object_tracking = false
|
|
63
|
-
end
|
|
64
|
-
|
|
65
55
|
def ObjectTracker.sample
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
if MongrelDbg::tracing? :objects
|
|
87
|
-
top_20 = counts.sort{|a,b| b[1] <=> a[1]}[0..20]
|
|
88
|
-
MongrelDbg::trace(:objects,"TOP 20: #{top_20.inspect}")
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
@active_objects = live_objects + new_objects
|
|
92
|
-
|
|
93
|
-
[@active_objects, top_20]
|
|
56
|
+
ospace = Set.new
|
|
57
|
+
counts = {}
|
|
58
|
+
|
|
59
|
+
# Strings can't be tracked easily and are so numerous that they drown out all else
|
|
60
|
+
# so we just ignore them in the counts.
|
|
61
|
+
ObjectSpace.each_object do |obj|
|
|
62
|
+
ospace << obj.object_id
|
|
63
|
+
counts[obj.class] ||= 0
|
|
64
|
+
counts[obj.class] += 1
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
dead_objects = @active_objects - ospace
|
|
68
|
+
new_objects = ospace - @active_objects
|
|
69
|
+
live_objects = ospace & @active_objects
|
|
70
|
+
|
|
71
|
+
MongrelDbg::trace(:objects, "COUNTS: #{dead_objects.length},#{new_objects.length},#{live_objects.length}")
|
|
72
|
+
|
|
73
|
+
if MongrelDbg::tracing? :objects
|
|
74
|
+
top_20 = counts.sort{|a,b| b[1] <=> a[1]}[0..20]
|
|
75
|
+
MongrelDbg::trace(:objects,"TOP 20: #{top_20.inspect}")
|
|
94
76
|
end
|
|
77
|
+
|
|
78
|
+
@active_objects = live_objects + new_objects
|
|
79
|
+
|
|
80
|
+
[@active_objects, top_20]
|
|
95
81
|
end
|
|
96
82
|
|
|
97
83
|
end
|
|
@@ -123,102 +109,31 @@ module Kernel
|
|
|
123
109
|
end
|
|
124
110
|
|
|
125
111
|
def log_open_files
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
open_counts[args] += 1
|
|
131
|
-
end
|
|
132
|
-
MongrelDbg::trace(:files, open_counts.to_yaml)
|
|
112
|
+
open_counts = {}
|
|
113
|
+
$open_files.each do |f,args|
|
|
114
|
+
open_counts[args] ||= 0
|
|
115
|
+
open_counts[args] += 1
|
|
133
116
|
end
|
|
117
|
+
MongrelDbg::trace(:files, open_counts.to_yaml)
|
|
134
118
|
end
|
|
135
119
|
end
|
|
136
120
|
|
|
137
121
|
|
|
138
122
|
|
|
139
|
-
|
|
140
|
-
alias_method :orig_new, :new
|
|
141
|
-
|
|
142
|
-
@@count = 0
|
|
143
|
-
@@stopit = false
|
|
144
|
-
@@class_caller_count = Hash.new{|hash,key| hash[key] = Hash.new(0)}
|
|
145
|
-
|
|
146
|
-
def new(*arg,&blk)
|
|
147
|
-
unless @@stopit
|
|
148
|
-
@@stopit = true
|
|
149
|
-
@@count += 1
|
|
150
|
-
@@class_caller_count[self][caller.join("\n\t")] += 1
|
|
151
|
-
@@stopit = false
|
|
152
|
-
end
|
|
153
|
-
orig_new(*arg,&blk)
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
def Class.report_object_creations(out=$stderr, more_than=20)
|
|
158
|
-
Class.stopit do
|
|
159
|
-
out.puts "Number of objects created = #{@@count}"
|
|
160
|
-
|
|
161
|
-
total = Hash.new(0)
|
|
162
|
-
|
|
163
|
-
@@class_caller_count.each_key do |klass|
|
|
164
|
-
caller_count = @@class_caller_count[klass]
|
|
165
|
-
caller_count.each_value do |count|
|
|
166
|
-
total[klass] += count
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
klass_list = total.keys.sort{|klass_a, klass_b|
|
|
171
|
-
a = total[klass_a]
|
|
172
|
-
b = total[klass_b]
|
|
173
|
-
if a != b
|
|
174
|
-
-1* (a <=> b)
|
|
175
|
-
else
|
|
176
|
-
klass_a.to_s <=> klass_b.to_s
|
|
177
|
-
end
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
below_count = 0
|
|
181
|
-
|
|
182
|
-
klass_list.each do |klass|
|
|
183
|
-
below_calls = 0
|
|
184
|
-
if total[klass] > more_than
|
|
185
|
-
out.puts "#{total[klass]}\t#{klass} objects created."
|
|
186
|
-
caller_count = @@class_caller_count[ klass]
|
|
187
|
-
caller_count.keys.sort_by{|call| -1*caller_count[call]}.each do |call|
|
|
188
|
-
if caller_count[call] > more_than
|
|
189
|
-
out.puts "\t** #{caller_count[call]} #{klass} objects AT:"
|
|
190
|
-
out.puts "\t#{call}\n\n"
|
|
191
|
-
else
|
|
192
|
-
below_calls += 1
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
out.puts "\t#{below_calls} more objects had calls less that #{more_than} limit.\n\n" if below_calls > 0
|
|
196
|
-
else
|
|
197
|
-
below_count += 1
|
|
198
|
-
end
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
out.puts "\t** #{below_count} More objects were created but the count was below the #{more_than} limit." if below_count > 0
|
|
202
|
-
end
|
|
203
|
-
end
|
|
123
|
+
module RequestLog
|
|
204
124
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
125
|
+
# Just logs whatever requests it gets to STDERR (which ends up in the mongrel
|
|
126
|
+
# log when daemonized).
|
|
127
|
+
class Access < GemPlugin::Plugin "/handlers"
|
|
128
|
+
include Mongrel::HttpHandlerPlugin
|
|
129
|
+
|
|
130
|
+
def process(request,response)
|
|
131
|
+
p = request.params
|
|
132
|
+
STDERR.puts "#{p['REMOTE_ADDR']} - [#{Mongrel::HttpServer.httpdate(Time.now)}] \"#{p['REQUEST_METHOD']} #{p["REQUEST_URI"]} HTTP/1.1\""
|
|
209
133
|
end
|
|
210
134
|
end
|
|
135
|
+
|
|
211
136
|
|
|
212
|
-
def Class.stopit
|
|
213
|
-
@@stopit = true
|
|
214
|
-
yield
|
|
215
|
-
@@stopit = false
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
module RequestLog
|
|
222
137
|
class Files < GemPlugin::Plugin "/handlers"
|
|
223
138
|
include Mongrel::HttpHandlerPlugin
|
|
224
139
|
|
|
@@ -253,7 +168,6 @@ end
|
|
|
253
168
|
|
|
254
169
|
|
|
255
170
|
END {
|
|
256
|
-
open("log/mongrel_debug/object_tracking.log", "w") {|f| Class.report_object_creations(f) }
|
|
257
171
|
MongrelDbg::trace(:files, "FILES OPEN AT EXIT")
|
|
258
172
|
log_open_files
|
|
259
173
|
}
|
data/lib/mongrel/handlers.rb
CHANGED
|
@@ -169,7 +169,7 @@ module Mongrel
|
|
|
169
169
|
ext = req[dot_at .. -1]
|
|
170
170
|
if MIME_TYPES[ext]
|
|
171
171
|
stat = File.stat(req)
|
|
172
|
-
response.header[Const::CONTENT_TYPE] = MIME_TYPES[ext]
|
|
172
|
+
response.header[Const::CONTENT_TYPE] = MIME_TYPES[ext] || "text"
|
|
173
173
|
# TODO: Confirm this works for rfc 1123
|
|
174
174
|
response.header[Const::LAST_MODIFIED] = HttpServer.httpdate(stat.mtime)
|
|
175
175
|
# TODO that this is a valid way to calculate an etag
|
|
@@ -187,7 +187,7 @@ module Mongrel
|
|
|
187
187
|
else
|
|
188
188
|
File.open(req, "rb") { |f| response.socket.write(f.read) }
|
|
189
189
|
end
|
|
190
|
-
|
|
190
|
+
rescue EOFError,Errno::ECONNRESET,Errno::EPIPE,Errno::EINVAL
|
|
191
191
|
# ignore these since it means the client closed off early
|
|
192
192
|
end
|
|
193
193
|
else
|
data/lib/mongrel/rails.rb
CHANGED
|
@@ -132,7 +132,8 @@ module Mongrel
|
|
|
132
132
|
|
|
133
133
|
$orig_dollar_quote = $".clone
|
|
134
134
|
ENV['RAILS_ENV'] = ops[:environment]
|
|
135
|
-
|
|
135
|
+
env_location = "#{ops[:cwd]}/config/environment"
|
|
136
|
+
require env_location
|
|
136
137
|
require 'dispatcher'
|
|
137
138
|
require 'mongrel/rails'
|
|
138
139
|
|
data/lib/mongrel/stats.rb
CHANGED
|
@@ -38,8 +38,8 @@ class Stats
|
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
# Dump this Stats object with an optional additional message.
|
|
41
|
-
def dump(msg = "")
|
|
42
|
-
|
|
41
|
+
def dump(msg = "", out=STDERR)
|
|
42
|
+
out.puts "[#{@name}] #{msg} : SUM=#@sum, SUMSQ=#@sumsq, N=#@n, MEAN=#{mean}, SD=#{sd}, MIN=#@min, MAX=#@max"
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
# Calculates and returns the mean for the data passed so far.
|
data/test/test_configurator.rb
CHANGED
|
@@ -29,12 +29,12 @@ class ConfiguratorTest < Test::Unit::TestCase
|
|
|
29
29
|
# 2 in front should run, but the sentinel shouldn't since dirhandler processes the request
|
|
30
30
|
uri "/", :handler => plugin("/handlers/testplugin")
|
|
31
31
|
uri "/", :handler => plugin("/handlers/testplugin")
|
|
32
|
-
uri "/", :handler => Mongrel::DirHandler.new("."
|
|
32
|
+
uri "/", :handler => Mongrel::DirHandler.new(".")
|
|
33
33
|
uri "/", :handler => plugin("/handlers/testplugin")
|
|
34
34
|
|
|
35
35
|
uri "/test", :handler => plugin("/handlers/testplugin")
|
|
36
36
|
uri "/test", :handler => plugin("/handlers/testplugin")
|
|
37
|
-
uri "/test", :handler => Mongrel::DirHandler.new("."
|
|
37
|
+
uri "/test", :handler => Mongrel::DirHandler.new(".")
|
|
38
38
|
uri "/test", :handler => plugin("/handlers/testplugin")
|
|
39
39
|
run
|
|
40
40
|
end
|
data/test/test_debug.rb
CHANGED
|
@@ -15,6 +15,8 @@ class MongrelDbgTest < Test::Unit::TestCase
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
def test_tracing_to_log
|
|
18
|
+
out = StringIO.new
|
|
19
|
+
|
|
18
20
|
MongrelDbg::begin_trace(:rails)
|
|
19
21
|
MongrelDbg::trace(:rails, "Good stuff")
|
|
20
22
|
MongrelDbg::end_trace(:rails)
|
|
@@ -22,10 +24,6 @@ class MongrelDbgTest < Test::Unit::TestCase
|
|
|
22
24
|
assert File.exist?("log/mongrel_debug"), "Didn't make logging directory"
|
|
23
25
|
assert File.exist?("log/mongrel_debug/rails.log"), "Didn't make the rails.log file"
|
|
24
26
|
assert File.size("log/mongrel_debug/rails.log") > 0, "Didn't write anything to the log."
|
|
25
|
-
|
|
26
|
-
Class.report_object_creations
|
|
27
|
-
Class.reset_object_creations
|
|
28
|
-
Class.report_object_creations
|
|
29
27
|
end
|
|
30
28
|
|
|
31
29
|
end
|
data/test/test_http11.rb
CHANGED
|
@@ -2,6 +2,7 @@ require 'test/unit'
|
|
|
2
2
|
require 'http11'
|
|
3
3
|
require 'mongrel'
|
|
4
4
|
require 'benchmark'
|
|
5
|
+
require 'digest/sha1'
|
|
5
6
|
|
|
6
7
|
include Mongrel
|
|
7
8
|
|
|
@@ -38,17 +39,85 @@ class HttpParserTest < Test::Unit::TestCase
|
|
|
38
39
|
assert parser.error?, "Parser SHOULD have error"
|
|
39
40
|
end
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
# lame random garbage maker
|
|
43
|
+
def rand_data(min, max, readable=true)
|
|
44
|
+
count = min + ((rand(max)+1) *10).to_i
|
|
45
|
+
res = count.to_s + "/"
|
|
46
|
+
|
|
47
|
+
if readable
|
|
48
|
+
res << Digest::SHA1.hexdigest(rand(count * 1000).to_s) * (count / 40)
|
|
49
|
+
else
|
|
50
|
+
res << Digest::SHA1.digest(rand(count * 1000).to_s) * (count / 20)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
return res
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_horrible_queries
|
|
58
|
+
parser = HttpParser.new
|
|
59
|
+
|
|
60
|
+
# first verify that large random get requests fail
|
|
61
|
+
100.times do |c|
|
|
62
|
+
get = "GET /#{rand_data(1024, 1024+(c*1024))} HTTP/1.1\r\n"
|
|
63
|
+
assert_raises Mongrel::HttpParserError do
|
|
64
|
+
parser.execute({}, get)
|
|
65
|
+
parser.reset
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# then that large header names are caught
|
|
70
|
+
100.times do |c|
|
|
71
|
+
get = "GET /#{rand_data(10,120)} HTTP/1.1\r\nX-#{rand_data(1024, 1024+(c*1024))}: Test\r\n\r\n"
|
|
72
|
+
assert_raises Mongrel::HttpParserError do
|
|
73
|
+
parser.execute({}, get)
|
|
74
|
+
parser.reset
|
|
75
|
+
end
|
|
76
|
+
end
|
|
44
77
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
78
|
+
# then that large mangled field values are caught
|
|
79
|
+
100.times do |c|
|
|
80
|
+
get = "GET /#{rand_data(10,120)} HTTP/1.1\r\nX-Test: #{rand_data(1024, 1024+(c*1024), false)}\r\n\r\n"
|
|
81
|
+
assert_raises Mongrel::HttpParserError do
|
|
82
|
+
parser.execute({}, get)
|
|
83
|
+
parser.reset
|
|
48
84
|
end
|
|
49
|
-
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# then large headers are rejected too
|
|
88
|
+
get = "GET /#{rand_data(10,120)} HTTP/1.1\r\n"
|
|
89
|
+
get << "X-Test: test\r\n" * (80 * 1024)
|
|
90
|
+
assert_raises Mongrel::HttpParserError do
|
|
91
|
+
parser.execute({}, get)
|
|
92
|
+
parser.reset
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# finally just that random garbage gets blocked all the time
|
|
96
|
+
10.times do |c|
|
|
97
|
+
get = "GET #{rand_data(1024, 1024+(c*1024), false)} #{rand_data(1024, 1024+(c*1024), false)}\r\n\r\n"
|
|
98
|
+
assert_raises Mongrel::HttpParserError do
|
|
99
|
+
parser.execute({}, get)
|
|
100
|
+
parser.reset
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
50
104
|
end
|
|
51
105
|
|
|
52
106
|
|
|
107
|
+
|
|
108
|
+
def test_query_parse
|
|
109
|
+
res = HttpRequest.query_parse("zed=1&frank=2")
|
|
110
|
+
assert res["zed"], "didn't get the request right"
|
|
111
|
+
assert res["frank"], "no frank"
|
|
112
|
+
assert_equal "1", res["zed"], "wrong result"
|
|
113
|
+
assert_equal "2", res["frank"], "wrong result"
|
|
114
|
+
|
|
115
|
+
res = HttpRequest.query_parse("zed=1&zed=2&zed=3&frank=11;zed=45")
|
|
116
|
+
assert res["zed"], "didn't get the request right"
|
|
117
|
+
assert res["frank"], "no frank"
|
|
118
|
+
assert_equal 4,res["zed"].length, "wrong number for zed"
|
|
119
|
+
assert_equal "11",res["frank"], "wrong number for frank"
|
|
120
|
+
end
|
|
121
|
+
|
|
53
122
|
end
|
|
54
123
|
|
data/test/test_stats.rb
CHANGED
|
@@ -4,13 +4,15 @@ require 'mongrel/stats'
|
|
|
4
4
|
class StatsTest < Test::Unit::TestCase
|
|
5
5
|
|
|
6
6
|
def test_sampling_speed
|
|
7
|
+
out = StringIO.new
|
|
8
|
+
|
|
7
9
|
s = Stats.new("test")
|
|
8
10
|
t = Stats.new("time")
|
|
9
11
|
|
|
10
12
|
10000.times { s.sample(rand(20)); t.tick }
|
|
11
13
|
|
|
12
|
-
s.dump("FIRST")
|
|
13
|
-
t.dump("FIRST")
|
|
14
|
+
s.dump("FIRST", out)
|
|
15
|
+
t.dump("FIRST", out)
|
|
14
16
|
|
|
15
17
|
old_mean = s.mean
|
|
16
18
|
old_sd = s.sd
|
|
@@ -19,8 +21,8 @@ class StatsTest < Test::Unit::TestCase
|
|
|
19
21
|
t.reset
|
|
20
22
|
10000.times { s.sample(rand(20)); t.tick }
|
|
21
23
|
|
|
22
|
-
s.dump("SECOND")
|
|
23
|
-
t.dump("SECOND")
|
|
24
|
+
s.dump("SECOND", out)
|
|
25
|
+
t.dump("SECOND", out)
|
|
24
26
|
assert_not_equal old_mean, s.mean
|
|
25
27
|
assert_not_equal old_mean, s.sd
|
|
26
28
|
end
|
data/test/test_uriclassifier.rb
CHANGED
|
@@ -91,20 +91,6 @@ class URIClassifierTest < Test::Unit::TestCase
|
|
|
91
91
|
end
|
|
92
92
|
|
|
93
93
|
|
|
94
|
-
def test_performance
|
|
95
|
-
count = 8500
|
|
96
|
-
u = URIClassifier.new
|
|
97
|
-
u.register("stuff",1)
|
|
98
|
-
|
|
99
|
-
res = Benchmark.measure { count.times { u.resolve("stuff") } }
|
|
100
|
-
|
|
101
|
-
reg_unreg = Benchmark.measure { count.times { u.register("other",1); u.unregister("other"); } }
|
|
102
|
-
|
|
103
|
-
puts "\nRESOLVE(#{count}): #{res}"
|
|
104
|
-
puts "REG_UNREG(#{count}): #{reg_unreg}"
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
|
|
108
94
|
def test_uri_branching
|
|
109
95
|
u = URIClassifier.new
|
|
110
96
|
u.register("/test", 1)
|
metadata
CHANGED
|
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
|
3
3
|
specification_version: 1
|
|
4
4
|
name: mongrel
|
|
5
5
|
version: !ruby/object:Gem::Version
|
|
6
|
-
version: 0.3.12
|
|
7
|
-
date: 2006-
|
|
6
|
+
version: 0.3.12.1
|
|
7
|
+
date: 2006-04-04 00:00:00 -04:00
|
|
8
8
|
summary: A small fast HTTP library and server that runs Rails, Camping, and Nitro apps.
|
|
9
9
|
require_paths:
|
|
10
10
|
- lib
|
|
@@ -38,10 +38,6 @@ files:
|
|
|
38
38
|
- doc/rdoc/classes
|
|
39
39
|
- doc/rdoc/created.rid
|
|
40
40
|
- doc/rdoc/files
|
|
41
|
-
- doc/rdoc/fr_class_index.html
|
|
42
|
-
- doc/rdoc/fr_file_index.html
|
|
43
|
-
- doc/rdoc/fr_method_index.html
|
|
44
|
-
- doc/rdoc/index.html
|
|
45
41
|
- doc/rdoc/rdoc-style.css
|
|
46
42
|
- doc/rdoc/classes/Class.html
|
|
47
43
|
- doc/rdoc/classes/Class.src
|
|
@@ -56,7 +52,6 @@ files:
|
|
|
56
52
|
- doc/rdoc/classes/ObjectTracker.html
|
|
57
53
|
- doc/rdoc/classes/ObjectTracker.src
|
|
58
54
|
- doc/rdoc/classes/RequestLog
|
|
59
|
-
- doc/rdoc/classes/RequestLog.html
|
|
60
55
|
- doc/rdoc/classes/Stats.html
|
|
61
56
|
- doc/rdoc/classes/Stats.src
|
|
62
57
|
- doc/rdoc/classes/TCPServer.html
|
|
@@ -72,35 +67,28 @@ files:
|
|
|
72
67
|
- doc/rdoc/classes/Mongrel/Camping
|
|
73
68
|
- doc/rdoc/classes/Mongrel/Camping.html
|
|
74
69
|
- doc/rdoc/classes/Mongrel/Camping.src
|
|
75
|
-
- doc/rdoc/classes/Mongrel/CGIWrapper.html
|
|
76
70
|
- doc/rdoc/classes/Mongrel/CGIWrapper.src
|
|
77
71
|
- doc/rdoc/classes/Mongrel/Command
|
|
78
72
|
- doc/rdoc/classes/Mongrel/Command.html
|
|
79
|
-
- doc/rdoc/classes/Mongrel/Configurator.html
|
|
80
73
|
- doc/rdoc/classes/Mongrel/Configurator.src
|
|
81
74
|
- doc/rdoc/classes/Mongrel/Const.html
|
|
82
75
|
- doc/rdoc/classes/Mongrel/DirHandler.html
|
|
83
76
|
- doc/rdoc/classes/Mongrel/DirHandler.src
|
|
84
|
-
- doc/rdoc/classes/Mongrel/Error404Handler.html
|
|
85
77
|
- doc/rdoc/classes/Mongrel/Error404Handler.src
|
|
86
78
|
- doc/rdoc/classes/Mongrel/HeaderOut.html
|
|
87
79
|
- doc/rdoc/classes/Mongrel/HeaderOut.src
|
|
88
|
-
- doc/rdoc/classes/Mongrel/HttpHandler.html
|
|
89
80
|
- doc/rdoc/classes/Mongrel/HttpHandler.src
|
|
90
81
|
- doc/rdoc/classes/Mongrel/HttpHandlerPlugin.html
|
|
91
82
|
- doc/rdoc/classes/Mongrel/HttpHandlerPlugin.src
|
|
92
83
|
- doc/rdoc/classes/Mongrel/HttpParser.html
|
|
93
84
|
- doc/rdoc/classes/Mongrel/HttpParser.src
|
|
94
|
-
- doc/rdoc/classes/Mongrel/
|
|
85
|
+
- doc/rdoc/classes/Mongrel/HttpParserError.html
|
|
95
86
|
- doc/rdoc/classes/Mongrel/HttpRequest.src
|
|
96
|
-
- doc/rdoc/classes/Mongrel/HttpResponse.html
|
|
97
87
|
- doc/rdoc/classes/Mongrel/HttpResponse.src
|
|
98
88
|
- doc/rdoc/classes/Mongrel/HttpServer.html
|
|
99
89
|
- doc/rdoc/classes/Mongrel/HttpServer.src
|
|
100
90
|
- doc/rdoc/classes/Mongrel/Rails
|
|
101
91
|
- doc/rdoc/classes/Mongrel/Rails.html
|
|
102
|
-
- doc/rdoc/classes/Mongrel/StopServer.html
|
|
103
|
-
- doc/rdoc/classes/Mongrel/URIClassifier.html
|
|
104
92
|
- doc/rdoc/classes/Mongrel/URIClassifier.src
|
|
105
93
|
- doc/rdoc/classes/Mongrel/Camping/CampingHandler.html
|
|
106
94
|
- doc/rdoc/classes/Mongrel/Camping/CampingHandler.src
|
|
@@ -149,14 +137,15 @@ files:
|
|
|
149
137
|
- doc/rdoc/classes/Mongrel/Configurator.src/M000112.html
|
|
150
138
|
- doc/rdoc/classes/Mongrel/Configurator.src/M000113.html
|
|
151
139
|
- doc/rdoc/classes/Mongrel/Configurator.src/M000114.html
|
|
140
|
+
- doc/rdoc/classes/Mongrel/Configurator.src/M000115.html
|
|
152
141
|
- doc/rdoc/classes/Mongrel/DirHandler.src/M000058.html
|
|
153
142
|
- doc/rdoc/classes/Mongrel/DirHandler.src/M000059.html
|
|
154
143
|
- doc/rdoc/classes/Mongrel/DirHandler.src/M000060.html
|
|
155
144
|
- doc/rdoc/classes/Mongrel/DirHandler.src/M000061.html
|
|
156
145
|
- doc/rdoc/classes/Mongrel/DirHandler.src/M000062.html
|
|
157
146
|
- doc/rdoc/classes/Mongrel/DirHandler.src/M000063.html
|
|
158
|
-
- doc/rdoc/classes/Mongrel/Error404Handler.src/M000115.html
|
|
159
147
|
- doc/rdoc/classes/Mongrel/Error404Handler.src/M000116.html
|
|
148
|
+
- doc/rdoc/classes/Mongrel/Error404Handler.src/M000117.html
|
|
160
149
|
- doc/rdoc/classes/Mongrel/HeaderOut.src/M000072.html
|
|
161
150
|
- doc/rdoc/classes/Mongrel/HeaderOut.src/M000073.html
|
|
162
151
|
- doc/rdoc/classes/Mongrel/HttpHandler.src/M000074.html
|
|
@@ -169,10 +158,10 @@ files:
|
|
|
169
158
|
- doc/rdoc/classes/Mongrel/HttpParser.src/M000055.html
|
|
170
159
|
- doc/rdoc/classes/Mongrel/HttpParser.src/M000056.html
|
|
171
160
|
- doc/rdoc/classes/Mongrel/HttpParser.src/M000057.html
|
|
172
|
-
- doc/rdoc/classes/Mongrel/HttpRequest.src/M000117.html
|
|
173
161
|
- doc/rdoc/classes/Mongrel/HttpRequest.src/M000118.html
|
|
174
162
|
- doc/rdoc/classes/Mongrel/HttpRequest.src/M000119.html
|
|
175
163
|
- doc/rdoc/classes/Mongrel/HttpRequest.src/M000120.html
|
|
164
|
+
- doc/rdoc/classes/Mongrel/HttpRequest.src/M000121.html
|
|
176
165
|
- doc/rdoc/classes/Mongrel/HttpResponse.src/M000075.html
|
|
177
166
|
- doc/rdoc/classes/Mongrel/HttpResponse.src/M000076.html
|
|
178
167
|
- doc/rdoc/classes/Mongrel/HttpResponse.src/M000077.html
|
|
@@ -215,15 +204,14 @@ files:
|
|
|
215
204
|
- doc/rdoc/classes/ObjectTracker.src/M000017.html
|
|
216
205
|
- doc/rdoc/classes/ObjectTracker.src/M000018.html
|
|
217
206
|
- doc/rdoc/classes/ObjectTracker.src/M000019.html
|
|
218
|
-
- doc/rdoc/classes/RequestLog/
|
|
207
|
+
- doc/rdoc/classes/RequestLog/Access.src
|
|
219
208
|
- doc/rdoc/classes/RequestLog/Files.src
|
|
220
|
-
- doc/rdoc/classes/RequestLog/Objects.html
|
|
221
209
|
- doc/rdoc/classes/RequestLog/Objects.src
|
|
222
|
-
- doc/rdoc/classes/RequestLog/Params.html
|
|
223
210
|
- doc/rdoc/classes/RequestLog/Params.src
|
|
224
|
-
- doc/rdoc/classes/RequestLog/
|
|
225
|
-
- doc/rdoc/classes/RequestLog/
|
|
226
|
-
- doc/rdoc/classes/RequestLog/
|
|
211
|
+
- doc/rdoc/classes/RequestLog/Access.src/M000122.html
|
|
212
|
+
- doc/rdoc/classes/RequestLog/Files.src/M000123.html
|
|
213
|
+
- doc/rdoc/classes/RequestLog/Objects.src/M000124.html
|
|
214
|
+
- doc/rdoc/classes/RequestLog/Params.src/M000125.html
|
|
227
215
|
- doc/rdoc/classes/Stats.src/M000009.html
|
|
228
216
|
- doc/rdoc/classes/Stats.src/M000010.html
|
|
229
217
|
- doc/rdoc/classes/Stats.src/M000011.html
|
|
@@ -257,7 +245,6 @@ files:
|
|
|
257
245
|
- test/test_stats.rb
|
|
258
246
|
- test/test_uriclassifier.rb
|
|
259
247
|
- test/test_ws.rb
|
|
260
|
-
- lib/http11.bundle
|
|
261
248
|
- lib/mongrel
|
|
262
249
|
- lib/mongrel.rb
|
|
263
250
|
- lib/mongrel/camping.rb
|
|
@@ -285,6 +272,7 @@ files:
|
|
|
285
272
|
- examples/builder.rb
|
|
286
273
|
- examples/mongrel_simple_ctrl.rb
|
|
287
274
|
- examples/mongrel_simple_service.rb
|
|
275
|
+
- examples/random_thrash.rb
|
|
288
276
|
- examples/simpletest.rb
|
|
289
277
|
- examples/webrick_compare.rb
|
|
290
278
|
- examples/camping/blog.rb
|