mongrel 1.1.3 → 1.1.4
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.tar.gz.sig +0 -0
- data/CHANGELOG +2 -0
- data/ext/http11/http11.c +1 -1
- data/ext/http11_java/org/jruby/mongrel/Http11.java +1 -1
- data/lib/mongrel.rb +2 -2
- data/lib/mongrel/const.rb +1 -1
- data/lib/mongrel/handlers.rb +6 -10
- data/mongrel.gemspec +6 -41
- data/test/test_handlers.rb +23 -3
- data/test/test_ws.rb +1 -1
- metadata +2 -2
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGELOG
CHANGED
data/ext/http11/http11.c
CHANGED
@@ -384,7 +384,7 @@ void Init_http11()
|
|
384
384
|
DEF_GLOBAL(server_protocol, "SERVER_PROTOCOL");
|
385
385
|
DEF_GLOBAL(server_protocol_value, "HTTP/1.1");
|
386
386
|
DEF_GLOBAL(http_host, "HTTP_HOST");
|
387
|
-
DEF_GLOBAL(mongrel_version, "Mongrel 1.1.
|
387
|
+
DEF_GLOBAL(mongrel_version, "Mongrel 1.1.4"); /* XXX Why is this defined here? */
|
388
388
|
DEF_GLOBAL(server_software, "SERVER_SOFTWARE");
|
389
389
|
DEF_GLOBAL(port_80, "80");
|
390
390
|
|
@@ -215,7 +215,7 @@ public class Http11 extends RubyObject {
|
|
215
215
|
|
216
216
|
req.setInstanceVariable("@http_body", RubyString.newString(runtime, new ByteList(hp.parser.buffer, at, length)));
|
217
217
|
req.aset(runtime.newString("SERVER_PROTOCOL"),runtime.newString("HTTP/1.1"));
|
218
|
-
req.aset(runtime.newString("SERVER_SOFTWARE"),runtime.newString("Mongrel 1.1.
|
218
|
+
req.aset(runtime.newString("SERVER_SOFTWARE"),runtime.newString("Mongrel 1.1.4"));
|
219
219
|
}
|
220
220
|
};
|
221
221
|
|
data/lib/mongrel.rb
CHANGED
@@ -96,7 +96,7 @@ module Mongrel
|
|
96
96
|
@host = host
|
97
97
|
@port = port
|
98
98
|
@workers = ThreadGroup.new
|
99
|
-
@throttle = throttle
|
99
|
+
@throttle = throttle / 100.0
|
100
100
|
@num_processors = num_processors
|
101
101
|
@timeout = timeout
|
102
102
|
end
|
@@ -286,7 +286,7 @@ module Mongrel
|
|
286
286
|
thread[:started_on] = Time.now
|
287
287
|
@workers.add(thread)
|
288
288
|
|
289
|
-
sleep @throttle
|
289
|
+
sleep @throttle if @throttle > 0
|
290
290
|
end
|
291
291
|
rescue StopServer
|
292
292
|
break
|
data/lib/mongrel/const.rb
CHANGED
data/lib/mongrel/handlers.rb
CHANGED
@@ -8,7 +8,6 @@ require 'mongrel/stats'
|
|
8
8
|
require 'zlib'
|
9
9
|
require 'yaml'
|
10
10
|
|
11
|
-
|
12
11
|
module Mongrel
|
13
12
|
|
14
13
|
# You implement your application handler with this. It's very light giving
|
@@ -102,7 +101,8 @@ module Mongrel
|
|
102
101
|
#
|
103
102
|
# If you pass nil as the root path, it will not check any locations or
|
104
103
|
# expand any paths. This lets you serve files from multiple drives
|
105
|
-
# on win32.
|
104
|
+
# on win32. It should probably not be used in a public-facing way
|
105
|
+
# without additional checks.
|
106
106
|
#
|
107
107
|
# The default content type is "text/plain; charset=ISO-8859-1" but you
|
108
108
|
# can change it anything you want using the DirHandler.default_content_type
|
@@ -120,7 +120,7 @@ module Mongrel
|
|
120
120
|
# You give it the path to the directory root and and optional listing_allowed and index_html
|
121
121
|
def initialize(path, listing_allowed=true, index_html="index.html")
|
122
122
|
@path = File.expand_path(path) if path
|
123
|
-
@listing_allowed=listing_allowed
|
123
|
+
@listing_allowed = listing_allowed
|
124
124
|
@index_html = index_html
|
125
125
|
@default_content_type = "application/octet-stream".freeze
|
126
126
|
end
|
@@ -132,12 +132,8 @@ module Mongrel
|
|
132
132
|
# Add the drive letter or root path
|
133
133
|
req_path = File.join(@path, req_path) if @path
|
134
134
|
req_path = File.expand_path req_path
|
135
|
-
|
136
|
-
|
137
|
-
# the serving of arbitrary files (and good programmer Rule #1 Says: If
|
138
|
-
# you don't understand something, it's not because I'm stupid, it's
|
139
|
-
# because you are).
|
140
|
-
if req_path.index(@path) == 0 and File.exist? req_path
|
135
|
+
|
136
|
+
if File.exist? req_path and (!@path or req_path.index(@path) == 0)
|
141
137
|
# It exists and it's in the right location
|
142
138
|
if File.directory? req_path
|
143
139
|
# The request is for a directory
|
@@ -157,7 +153,7 @@ module Mongrel
|
|
157
153
|
return req_path
|
158
154
|
end
|
159
155
|
else
|
160
|
-
# does not exist or isn't in the right spot
|
156
|
+
# does not exist or isn't in the right spot
|
161
157
|
return nil
|
162
158
|
end
|
163
159
|
end
|
data/mongrel.gemspec
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
|
2
|
-
# Gem::Specification for Mongrel-1.1.
|
2
|
+
# Gem::Specification for Mongrel-1.1.4
|
3
3
|
# Originally generated by Echoe
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = %q{mongrel}
|
7
|
-
s.version = "1.1.
|
7
|
+
s.version = "1.1.4"
|
8
8
|
|
9
9
|
s.specification_version = 2 if s.respond_to? :specification_version=
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.authors = ["Zed A. Shaw"]
|
13
|
-
s.date = %q{2008-
|
13
|
+
s.date = %q{2008-02-29}
|
14
14
|
s.default_executable = %q{mongrel_rails}
|
15
15
|
s.description = %q{A small fast HTTP library and server that runs Rails, Camping, Nitro and Iowa apps.}
|
16
16
|
s.email = %q{}
|
@@ -42,9 +42,10 @@ end
|
|
42
42
|
# e = Echoe.new("mongrel") do |p|
|
43
43
|
# p.summary = "A small fast HTTP library and server that runs Rails, Camping, Nitro and Iowa apps."
|
44
44
|
# p.author ="Zed A. Shaw"
|
45
|
-
# p.clean_pattern = ['ext/http11/*.{bundle,so,o,obj,pdb,lib,def,exp}', 'lib/*.{bundle,so,o,obj,pdb,lib,def,exp}', 'ext/http11/Makefile', 'pkg', 'lib/*.bundle', '*.gem', 'site/output', '.config', 'lib/http11.jar', 'ext/http11_java/classes', 'coverage']
|
45
|
+
# p.clean_pattern = ['ext/http11/*.{bundle,so,o,obj,pdb,lib,def,exp}', 'lib/*.{bundle,so,o,obj,pdb,lib,def,exp}', 'ext/http11/Makefile', 'pkg', 'lib/*.bundle', '*.gem', 'site/output', '.config', 'lib/http11.jar', 'ext/http11_java/classes', 'coverage', 'doc']
|
46
46
|
# p.url = "http://mongrel.rubyforge.org"
|
47
47
|
# p.rdoc_pattern = ['README', 'LICENSE', 'CHANGELOG', 'COPYING', 'lib/**/*.rb', 'doc/**/*.rdoc']
|
48
|
+
# p.docs_host = 'mongrel.cloudbur.st:/home/eweaver/www/mongrel/htdocs/web'
|
48
49
|
# p.ignore_pattern = /^(pkg|site|projects|doc|log)|CVS|\.log/
|
49
50
|
# p.ruby_version = '>=1.8.4'
|
50
51
|
# p.dependencies = ['gem_plugin >=0.2.3']
|
@@ -225,44 +226,8 @@ end
|
|
225
226
|
# #### Site upload tasks
|
226
227
|
#
|
227
228
|
# namespace :site do
|
228
|
-
#
|
229
|
-
# desc "Package and upload .gem files and .tgz files for Mongrel and all subprojects to http://mongrel.rubyforge.org/releases/"
|
230
|
-
# task :source => [:package_all] do
|
231
|
-
# rm_rf "pkg/gems"
|
232
|
-
# rm_rf "pkg/tars"
|
233
|
-
# mkdir_p "pkg/gems"
|
234
|
-
# mkdir_p "pkg/tars"
|
235
|
-
#
|
236
|
-
# FileList["**/*.gem"].each { |gem| mv gem, "pkg/gems" }
|
237
|
-
# FileList["**/*.tgz"].each {|tgz| mv tgz, "pkg/tars" }
|
238
|
-
#
|
239
|
-
# sh "rm -rf pkg/mongrel*"
|
240
|
-
# sh "gem generate_index -d pkg"
|
241
|
-
# sh "scp -r CHANGELOG pkg/* rubyforge.org:/var/www/gforge-projects/mongrel/releases/"
|
242
|
-
# sh "svn log -v > SVN_LOG"
|
243
|
-
# sh "scp -r SVN_LOG pkg/* rubyforge.org:/var/www/gforge-projects/mongrel/releases/"
|
244
|
-
# rm "SVN_LOG"
|
245
|
-
# end
|
246
|
-
#
|
247
|
-
# desc "Upload the website"
|
248
|
-
# task :web do
|
249
|
-
# # Requires the 'webgem' gem
|
250
|
-
# sh "cd site; webgen; webgen; curl 'http://feed43.com/mongrel.xml' > output/rss.xml; rsync -azv --no-perms --no-times output/* rubyforge.org:/var/www/gforge-projects/mongrel/"
|
251
|
-
# puts "\nMake sure to re-run the site update 6 hours later if you updated the news. This delay is required for Feed43 to pick up the site changes."
|
252
|
-
# end
|
253
|
-
#
|
254
|
-
# desc "Upload the rdocs"
|
255
|
-
# task :rdoc => [:doc] do
|
256
|
-
# sh "rsync -azv --no-perms --no-times doc/* rubyforge.org:/var/www/gforge-projects/mongrel/rdoc/"
|
257
|
-
# sh "cd projects/gem_plugin; rake site:rdoc"
|
258
|
-
# end
|
259
|
-
#
|
260
229
|
# desc "Upload the coverage report"
|
261
230
|
# task :coverage => [:rcov] do
|
262
|
-
# sh "rsync -azv --no-perms --no-times test/coverage/*
|
231
|
+
# sh "rsync -azv --no-perms --no-times test/coverage/* mongrel.cloudbur.st:/home/eweaver/www/mongrel/htdocs/web/coverage" rescue nil
|
263
232
|
# end
|
264
|
-
#
|
265
|
-
# desc "Upload the website, the rdocs, and the coverage report"
|
266
|
-
# task :all => [:clean, :web, :rdoc, :coverage]
|
267
|
-
#
|
268
233
|
# end
|
data/test/test_handlers.rb
CHANGED
@@ -49,11 +49,17 @@ class HandlersTest < Test::Unit::TestCase
|
|
49
49
|
uri "/relative", :handler => Mongrel::DirHandler.new(nil, listing_allowed=false, index_html="none")
|
50
50
|
end
|
51
51
|
end
|
52
|
+
|
53
|
+
File.open("/tmp/testfile", 'w') do
|
54
|
+
# Do nothing
|
55
|
+
end
|
56
|
+
|
52
57
|
@config.run
|
53
58
|
end
|
54
59
|
|
55
60
|
def teardown
|
56
61
|
@config.stop(false, true)
|
62
|
+
File.delete "/tmp/testfile"
|
57
63
|
end
|
58
64
|
|
59
65
|
def test_more_web_server
|
@@ -66,14 +72,28 @@ class HandlersTest < Test::Unit::TestCase
|
|
66
72
|
"http://localhost:9998/files_nodir/rdoc/",
|
67
73
|
"http://localhost:9998/status",
|
68
74
|
])
|
69
|
-
|
70
|
-
# XXX This can't possibly have good coverage.
|
71
75
|
check_status res, String
|
72
76
|
end
|
77
|
+
|
78
|
+
def test_nil_dirhandler
|
79
|
+
# Camping uses this internally
|
80
|
+
handler = Mongrel::DirHandler.new(nil, false)
|
81
|
+
assert handler.can_serve("/tmp/testfile")
|
82
|
+
# Not a bug! A nil @file parameter is the only circumstance under which
|
83
|
+
# we are allowed to serve any existing file
|
84
|
+
assert handler.can_serve("../../../../../../../../../../tmp/testfile")
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_non_nil_dirhandler_is_not_vulnerable_to_path_traversal
|
88
|
+
# The famous security bug of Mongrel 1.1.2
|
89
|
+
handler = Mongrel::DirHandler.new("/doc", false)
|
90
|
+
assert_nil handler.can_serve("/tmp/testfile")
|
91
|
+
assert_nil handler.can_serve("../../../../../../../../../../tmp/testfile")
|
92
|
+
end
|
73
93
|
|
74
94
|
def test_deflate
|
75
95
|
Net::HTTP.start("localhost", 9998) do |h|
|
76
|
-
#
|
96
|
+
# Test that no accept-encoding returns a non-deflated response
|
77
97
|
req = h.get("/dumb")
|
78
98
|
assert(
|
79
99
|
!req['Content-Encoding'] ||
|
data/test/test_ws.rb
CHANGED
@@ -94,7 +94,7 @@ class WebServerTest < Test::Unit::TestCase
|
|
94
94
|
|
95
95
|
def test_num_processors_overload
|
96
96
|
redirect_test_io do
|
97
|
-
assert_raises Errno::ECONNRESET, Errno::EPIPE, Errno::ECONNABORTED, Errno::EINVAL do
|
97
|
+
assert_raises Errno::ECONNRESET, Errno::EPIPE, Errno::ECONNABORTED, Errno::EINVAL, IOError do
|
98
98
|
tests = [
|
99
99
|
Thread.new { do_test(@valid_request, 1) },
|
100
100
|
Thread.new { do_test(@valid_request, 10) },
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongrel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zed A. Shaw
|
@@ -52,7 +52,7 @@ cert_chain:
|
|
52
52
|
ALN3mi/9z0Mf1YroliUgF0v5Yw==
|
53
53
|
-----END CERTIFICATE-----
|
54
54
|
|
55
|
-
date: 2008-
|
55
|
+
date: 2008-02-29 00:00:00 -05:00
|
56
56
|
default_executable:
|
57
57
|
dependencies:
|
58
58
|
- !ruby/object:Gem::Dependency
|
metadata.gz.sig
CHANGED
Binary file
|