mongrel2 0.9.2 → 0.10.0
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 +169 -18
- data/History.rdoc +21 -0
- data/Manifest.txt +2 -0
- data/README.rdoc +0 -1
- data/Rakefile +8 -5
- data/bin/m2sh.rb +105 -38
- data/data/mongrel2/bootstrap.html +1 -1
- data/data/mongrel2/config.sql +7 -7
- data/examples/config.rb +10 -5
- data/lib/mongrel2.rb +2 -2
- data/lib/mongrel2/config.rb +26 -1
- data/lib/mongrel2/config/dsl.rb +22 -22
- data/lib/mongrel2/config/filter.rb +24 -0
- data/lib/mongrel2/config/server.rb +47 -1
- data/lib/mongrel2/constants.rb +3 -0
- data/lib/mongrel2/httpresponse.rb +8 -8
- data/lib/mongrel2/response.rb +2 -1
- data/lib/mongrel2/table.rb +4 -0
- data/spec/mongrel2/config/dsl_spec.rb +27 -0
- data/spec/mongrel2/config/filter_spec.rb +30 -0
- data/spec/mongrel2/config/route_spec.rb +1 -1
- data/spec/mongrel2/config/server_spec.rb +25 -0
- data/spec/mongrel2/config_spec.rb +9 -0
- metadata +63 -28
- metadata.gz.sig +0 -0
@@ -21,7 +21,7 @@
|
|
21
21
|
|
22
22
|
<footer>
|
23
23
|
<p>Copyright © 2011 Michael Granger <<a href="mailto:ged@FaerieMUD.org">ged@FaerieMUD.org</a>>.</p>
|
24
|
-
<p><tt>$Id$</tt></p>
|
24
|
+
<p><tt>$Id: bootstrap.html,v 032124c021b5 2011/09/18 20:01:52 ged $</tt></p>
|
25
25
|
</footer>
|
26
26
|
</body>
|
27
27
|
</html>
|
data/data/mongrel2/config.sql
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
begin transaction;
|
2
|
-
|
3
1
|
DROP TABLE IF EXISTS server;
|
4
2
|
DROP TABLE IF EXISTS host;
|
5
3
|
DROP TABLE IF EXISTS handler;
|
@@ -9,6 +7,7 @@ DROP TABLE IF EXISTS statistic;
|
|
9
7
|
DROP TABLE IF EXISTS mimetype;
|
10
8
|
DROP TABLE IF EXISTS setting;
|
11
9
|
DROP TABLE IF EXISTS directory;
|
10
|
+
DROP TABLE IF EXISTS filter;
|
12
11
|
|
13
12
|
CREATE TABLE server (id INTEGER PRIMARY KEY,
|
14
13
|
uuid TEXT,
|
@@ -53,14 +52,12 @@ CREATE TABLE route (id INTEGER PRIMARY KEY,
|
|
53
52
|
target_id INTEGER,
|
54
53
|
target_type TEXT);
|
55
54
|
|
56
|
-
|
57
55
|
CREATE TABLE setting (id INTEGER PRIMARY KEY, key TEXT, value TEXT);
|
58
56
|
|
59
|
-
|
60
57
|
CREATE TABLE statistic (id SERIAL,
|
61
58
|
other_type TEXT,
|
62
59
|
other_id INTEGER,
|
63
|
-
name
|
60
|
+
name TEXT,
|
64
61
|
sum REAL,
|
65
62
|
sumsq REAL,
|
66
63
|
n INTEGER,
|
@@ -70,9 +67,13 @@ CREATE TABLE statistic (id SERIAL,
|
|
70
67
|
sd REAL,
|
71
68
|
primary key (other_type, other_id, name));
|
72
69
|
|
73
|
-
|
74
70
|
CREATE TABLE mimetype (id INTEGER PRIMARY KEY, mimetype TEXT, extension TEXT);
|
75
71
|
|
72
|
+
CREATE TABLE filter (id INTEGER PRIMARY KEY,
|
73
|
+
server_id INTEGER,
|
74
|
+
name TEXT,
|
75
|
+
settings TEXT);
|
76
|
+
|
76
77
|
CREATE TABLE IF NOT EXISTS log(id INTEGER PRIMARY KEY,
|
77
78
|
who TEXT,
|
78
79
|
what TEXT,
|
@@ -81,4 +82,3 @@ CREATE TABLE IF NOT EXISTS log(id INTEGER PRIMARY KEY,
|
|
81
82
|
how TEXT,
|
82
83
|
why TEXT);
|
83
84
|
|
84
|
-
commit;
|
data/examples/config.rb
CHANGED
@@ -28,7 +28,7 @@ server '34D8E57C-3E91-4F24-9BBE-0B53C1827CB4' do
|
|
28
28
|
|
29
29
|
access_log "/logs/access.log"
|
30
30
|
error_log "/logs/error.log"
|
31
|
-
chroot "
|
31
|
+
chroot "/var/mongrel2"
|
32
32
|
pid_file "/run/mongrel2.pid"
|
33
33
|
default_host "localhost"
|
34
34
|
name "main"
|
@@ -41,14 +41,19 @@ server '34D8E57C-3E91-4F24-9BBE-0B53C1827CB4' do
|
|
41
41
|
route '/source', directory( 'examples/', 'README.txt', 'text/plain' )
|
42
42
|
|
43
43
|
# Handlers
|
44
|
-
|
45
|
-
|
44
|
+
route '/hello', handler( 'tcp://127.0.0.1:9999', 'helloworld-handler' )
|
45
|
+
route '/dump', handler( 'tcp://127.0.0.1:9997', 'request-dumper' )
|
46
46
|
|
47
47
|
end
|
48
48
|
|
49
|
+
filter "/usr/local/lib/mongrel2/filters/null.so",
|
50
|
+
extensions: ["*.html", "*.txt"],
|
51
|
+
min_size: 1000
|
52
|
+
|
49
53
|
end
|
50
54
|
|
51
|
-
setting "zeromq.threads",
|
55
|
+
setting "zeromq.threads", 1
|
52
56
|
|
53
57
|
mkdir_p 'run'
|
54
|
-
mkdir_p 'logs'
|
58
|
+
mkdir_p 'logs'
|
59
|
+
|
data/lib/mongrel2.rb
CHANGED
@@ -14,10 +14,10 @@ module Mongrel2
|
|
14
14
|
abort "\n\n>>> Mongrel2 requires Ruby 1.9.2 or later. <<<\n\n" if RUBY_VERSION < '1.9.2'
|
15
15
|
|
16
16
|
# Library version constant
|
17
|
-
VERSION = '0.
|
17
|
+
VERSION = '0.10.0'
|
18
18
|
|
19
19
|
# Version-control revision constant
|
20
|
-
REVISION = %q$Revision:
|
20
|
+
REVISION = %q$Revision: b3ed6f931afa $
|
21
21
|
|
22
22
|
|
23
23
|
require 'mongrel2/logging'
|
data/lib/mongrel2/config.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
|
+
require 'yajl'
|
4
|
+
require 'yaml'
|
3
5
|
require 'pathname'
|
4
6
|
require 'uri'
|
7
|
+
require 'tnetstring'
|
5
8
|
|
6
9
|
require 'sequel'
|
7
10
|
|
@@ -45,6 +48,9 @@ module Mongrel2
|
|
45
48
|
|
46
49
|
plugin :validation_helpers
|
47
50
|
plugin :subclasses
|
51
|
+
plugin :json_serializer
|
52
|
+
plugin :serialization
|
53
|
+
|
48
54
|
|
49
55
|
# Configuration defaults
|
50
56
|
DEFAULTS = {
|
@@ -73,6 +79,12 @@ module Mongrel2
|
|
73
79
|
end
|
74
80
|
|
75
81
|
|
82
|
+
# Register custom serializer/deserializer type
|
83
|
+
Sequel::Plugins::Serialization.register_format( :tnetstring,
|
84
|
+
TNetstring.method( :dump ),
|
85
|
+
lambda {|raw| TNetstring.parse( raw ).first} )
|
86
|
+
|
87
|
+
|
76
88
|
### Return a bound Method object to the Sequel constructor of choice for the
|
77
89
|
### config DB. This is used to choose either 'amalgalite' or 'sqlite3', preferring
|
78
90
|
### the former.
|
@@ -124,6 +136,18 @@ module Mongrel2
|
|
124
136
|
end
|
125
137
|
|
126
138
|
|
139
|
+
### Return a Hash of current settings from the config database. The keys are converted to
|
140
|
+
### Symbols.
|
141
|
+
def self::settings
|
142
|
+
setting_hash = Mongrel2::Config::Setting.to_hash( :key, :value )
|
143
|
+
setting_hash.keys.each do |k|
|
144
|
+
setting_hash[ k.to_sym ] = setting_hash.delete( k )
|
145
|
+
end
|
146
|
+
|
147
|
+
return setting_hash
|
148
|
+
end
|
149
|
+
|
150
|
+
|
127
151
|
### Return the contents of the configuration schema SQL file.
|
128
152
|
def self::load_config_schema
|
129
153
|
return CONFIG_SQL.read
|
@@ -182,7 +206,7 @@ module Mongrel2
|
|
182
206
|
def self::Config( source )
|
183
207
|
unless Sequel::Model::ANONYMOUS_MODEL_CLASSES.key?( source )
|
184
208
|
anonclass = nil
|
185
|
-
|
209
|
+
if source.is_a?( Sequel::Database )
|
186
210
|
anonclass = Class.new( Mongrel2::Config )
|
187
211
|
anonclass.db = source
|
188
212
|
else
|
@@ -196,6 +220,7 @@ module Mongrel2
|
|
196
220
|
end
|
197
221
|
|
198
222
|
require 'mongrel2/config/directory'
|
223
|
+
require 'mongrel2/config/filter'
|
199
224
|
require 'mongrel2/config/handler'
|
200
225
|
require 'mongrel2/config/host'
|
201
226
|
require 'mongrel2/config/proxy'
|
data/lib/mongrel2/config/dsl.rb
CHANGED
@@ -9,7 +9,7 @@ require 'mongrel2/config' unless defined?( Mongrel2::Config )
|
|
9
9
|
#
|
10
10
|
# This is the mongrel2.org config re-expressed in the Ruby DSL:
|
11
11
|
#
|
12
|
-
# # the server to run them all
|
12
|
+
# # the server to run them all
|
13
13
|
# server '2f62bd5-9e59-49cd-993c-3b6013c28f05' do
|
14
14
|
#
|
15
15
|
# access_log "/logs/access.log"
|
@@ -20,29 +20,29 @@ require 'mongrel2/config' unless defined?( Mongrel2::Config )
|
|
20
20
|
# name "main"
|
21
21
|
# port 6767
|
22
22
|
#
|
23
|
-
# # your main host
|
23
|
+
# # your main host
|
24
24
|
# host "mongrel2.org" do
|
25
25
|
#
|
26
|
-
# # a sample of doing some handlers
|
26
|
+
# # a sample of doing some handlers
|
27
27
|
# route '@chat', handler(
|
28
|
-
# 'tcp://127.0.0.1:9999',
|
29
|
-
# '54c6755b-9628-40a4-9a2d-cc82a816345e',
|
28
|
+
# 'tcp://127.0.0.1:9999',
|
29
|
+
# '54c6755b-9628-40a4-9a2d-cc82a816345e',
|
30
30
|
# 'tcp://127.0.0.1:9998'
|
31
|
-
# )
|
31
|
+
# )
|
32
32
|
#
|
33
33
|
# route '/handlertest', handler(
|
34
|
-
# 'tcp://127.0.0.1:9997',
|
35
|
-
# '34f9ceee-cd52-4b7f-b197-88bf2f0ec378',
|
34
|
+
# 'tcp://127.0.0.1:9997',
|
35
|
+
# '34f9ceee-cd52-4b7f-b197-88bf2f0ec378',
|
36
36
|
# 'tcp://127.0.0.1:9996'
|
37
|
-
# )
|
37
|
+
# )
|
38
38
|
#
|
39
|
-
# # a sample proxy route
|
40
|
-
# web_app_proxy = proxy( '127.0.0.1', 8080 )
|
39
|
+
# # a sample proxy route
|
40
|
+
# web_app_proxy = proxy( '127.0.0.1', 8080 )
|
41
41
|
#
|
42
42
|
# route '/chat/', web_app_proxy
|
43
43
|
# route '/', web_app_proxy
|
44
44
|
#
|
45
|
-
# # here's a sample directory
|
45
|
+
# # here's a sample directory
|
46
46
|
# test_directory = directory(
|
47
47
|
# 'tests/',
|
48
48
|
# :index_file => 'index.html',
|
@@ -53,34 +53,34 @@ require 'mongrel2/config' unless defined?( Mongrel2::Config )
|
|
53
53
|
# route '/testsmulti/(.*.json)', test_directory
|
54
54
|
#
|
55
55
|
# chat_demo_dir = directory(
|
56
|
-
# 'examples/chat/static/',
|
57
|
-
# :index_file => 'index.html',
|
56
|
+
# 'examples/chat/static/',
|
57
|
+
# :index_file => 'index.html',
|
58
58
|
# :default_ctype => 'text/plain'
|
59
59
|
# )
|
60
60
|
#
|
61
61
|
# route '/chatdemo/', chat_demo_dir
|
62
62
|
# route '/static/', chat_demo_dir
|
63
63
|
#
|
64
|
-
# route '/mp3stream', handler(
|
65
|
-
# 'tcp://127.0.0.1:9995',
|
66
|
-
# '53f9f1d1-1116-4751-b6ff-4fbe3e43d142',
|
64
|
+
# route '/mp3stream', handler(
|
65
|
+
# 'tcp://127.0.0.1:9995',
|
66
|
+
# '53f9f1d1-1116-4751-b6ff-4fbe3e43d142',
|
67
67
|
# 'tcp://127.0.0.1:9994'
|
68
|
-
# )
|
68
|
+
# )
|
69
69
|
# end
|
70
70
|
#
|
71
71
|
# end
|
72
72
|
#
|
73
73
|
# settings(
|
74
74
|
# "zeromq.threads" => 1,
|
75
|
-
# "upload.temp_store" => "/home/zedshaw/projects/mongrel2/tmp/upload.XXXXXX",
|
76
|
-
# "upload.temp_store_mode" => "0666"
|
75
|
+
# "upload.temp_store" => "/home/zedshaw/projects/mongrel2/tmp/upload.XXXXXX",
|
76
|
+
# "upload.temp_store_mode" => "0666"
|
77
77
|
# )
|
78
78
|
#
|
79
79
|
module Mongrel2::Config::DSL
|
80
80
|
|
81
81
|
|
82
82
|
# A decorator object that provides the DSL-ish interface to the various Config
|
83
|
-
# objects. It derives its interface on the fly from columns of the class it's
|
83
|
+
# objects. It derives its interface on the fly from columns of the class it's
|
84
84
|
# created with and a DSLMethods mixin if the target class defines one.
|
85
85
|
class Adapter
|
86
86
|
include Mongrel2::Loggable
|
@@ -144,7 +144,7 @@ module Mongrel2::Config::DSL
|
|
144
144
|
end # class Adapter
|
145
145
|
|
146
146
|
|
147
|
-
### Create a Mongrel2::Config::Server with the specified +uuid+, evaluate
|
147
|
+
### Create a Mongrel2::Config::Server with the specified +uuid+, evaluate
|
148
148
|
### the block (if given) within its context, and return it.
|
149
149
|
def server( uuid, &block )
|
150
150
|
Mongrel2::Config.init_database
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'tnetstring'
|
4
|
+
|
5
|
+
require 'mongrel2' unless defined?( Mongrel2 )
|
6
|
+
require 'mongrel2/config' unless defined?( Mongrel2::Config )
|
7
|
+
|
8
|
+
# Mongrel2 Host configuration class
|
9
|
+
class Mongrel2::Config::Filter < Mongrel2::Config( :filter )
|
10
|
+
|
11
|
+
### As of Mongrel2/1.7.5:
|
12
|
+
# CREATE TABLE filter (id INTEGER PRIMARY KEY,
|
13
|
+
# server_id INTEGER,
|
14
|
+
# name TEXT,
|
15
|
+
# settings TEXT);
|
16
|
+
|
17
|
+
many_to_one :server
|
18
|
+
|
19
|
+
|
20
|
+
# Serialize the settings column as TNetStrings
|
21
|
+
plugin :serialization, :tnetstring, :settings
|
22
|
+
|
23
|
+
end # class Mongrel2::Config::Filter
|
24
|
+
|
@@ -1,5 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
require 'uri'
|
4
|
+
require 'pathname'
|
5
|
+
|
3
6
|
require 'mongrel2' unless defined?( Mongrel2 )
|
4
7
|
require 'mongrel2/config' unless defined?( Mongrel2::Config )
|
5
8
|
|
@@ -21,6 +24,8 @@ class Mongrel2::Config::Server < Mongrel2::Config( :server )
|
|
21
24
|
# use_ssl INTEGER default 0);
|
22
25
|
|
23
26
|
one_to_many :hosts
|
27
|
+
one_to_many :filters
|
28
|
+
|
24
29
|
|
25
30
|
##
|
26
31
|
# Look up a server by its +uuid+.
|
@@ -30,6 +35,40 @@ class Mongrel2::Config::Server < Mongrel2::Config( :server )
|
|
30
35
|
def_dataset_method( :by_uuid ) {|uuid| filter(:uuid => uuid).first }
|
31
36
|
|
32
37
|
|
38
|
+
### Return the URI for its control socket.
|
39
|
+
def control_socket_uri
|
40
|
+
# Find the control socket relative to the server's chroot
|
41
|
+
csock_uri = Mongrel2::Config.settings[:control_port] || DEFAULT_CONTROL_SOCKET
|
42
|
+
Mongrel2.log.debug "Chrooted control socket uri is: %p" % [ csock_uri ]
|
43
|
+
|
44
|
+
scheme, sock_path = csock_uri.split( '://', 2 )
|
45
|
+
Mongrel2.log.debug " chrooted socket path is: %p" % [ sock_path ]
|
46
|
+
|
47
|
+
csock_path = Pathname( self.chroot ) + sock_path
|
48
|
+
Mongrel2.log.debug " fully-qualified path is: %p" % [ csock_path ]
|
49
|
+
csock_uri = "%s:/%s" % [ scheme, csock_path ]
|
50
|
+
|
51
|
+
Mongrel2.log.debug " control socket URI is: %p" % [ csock_uri ]
|
52
|
+
return csock_uri
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
### Return the Mongrel2::Control object for the server's control socket.
|
57
|
+
def control_socket
|
58
|
+
return Mongrel2::Control.new( self.control_socket_uri )
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
### Return a Pathname for the server's PID file with its chroot directory prepended.
|
63
|
+
def pid_file_path
|
64
|
+
base = Pathname( self.chroot )
|
65
|
+
pidfile = self.pid_file
|
66
|
+
pidfile.slice!( 0, 1 ) if pidfile.start_with?( '/' )
|
67
|
+
|
68
|
+
return base + pidfile
|
69
|
+
end
|
70
|
+
|
71
|
+
|
33
72
|
#
|
34
73
|
# :section: Validation Callbacks
|
35
74
|
#
|
@@ -41,7 +80,6 @@ class Mongrel2::Config::Server < Mongrel2::Config( :server )
|
|
41
80
|
end
|
42
81
|
|
43
82
|
|
44
|
-
|
45
83
|
### DSL methods for the Server context besides those automatically-generated from its
|
46
84
|
### columns.
|
47
85
|
module DSLMethods
|
@@ -58,6 +96,14 @@ class Mongrel2::Config::Server < Mongrel2::Config( :server )
|
|
58
96
|
self.target.add_host( adapter.target )
|
59
97
|
end
|
60
98
|
|
99
|
+
### Add a Mongrel2::Config::Filter to the Server object with the specified
|
100
|
+
### +path+ (name) and +settings+ hash.
|
101
|
+
def filter( path, settings={} )
|
102
|
+
self.target.save( :validate => false )
|
103
|
+
|
104
|
+
Mongrel2.log.debug "Filter [%s]: %p" % [ path, settings ]
|
105
|
+
self.target.add_filter( name: path, settings: settings )
|
106
|
+
end
|
61
107
|
|
62
108
|
end # module DSLMethods
|
63
109
|
|
data/lib/mongrel2/constants.rb
CHANGED
@@ -11,6 +11,9 @@ module Mongrel2::Constants
|
|
11
11
|
# The path to the default Sqlite configuration database
|
12
12
|
DEFAULT_CONFIG_URI = 'config.sqlite'
|
13
13
|
|
14
|
+
# The default URI of the control socket
|
15
|
+
DEFAULT_CONTROL_SOCKET = 'ipc://run/control'
|
16
|
+
|
14
17
|
# Maximum number of identifiers that can be included in a broadcast response
|
15
18
|
MAX_BROADCAST_IDENTS = 100
|
16
19
|
|
@@ -163,19 +163,19 @@ class Mongrel2::HTTPResponse < Mongrel2::Response
|
|
163
163
|
### one, or using #seek and #tell if it implements those. If neither of those are
|
164
164
|
### possible, an exception is raised.
|
165
165
|
def get_content_length
|
166
|
-
if
|
167
|
-
return
|
168
|
-
elsif
|
169
|
-
starting_pos =
|
170
|
-
|
171
|
-
length =
|
172
|
-
|
166
|
+
if self.body.respond_to?( :bytesize )
|
167
|
+
return self.body.bytesize
|
168
|
+
elsif self.body.respond_to?( :seek ) && self.body.respond_to?( :tell )
|
169
|
+
starting_pos = self.body.tell
|
170
|
+
self.body.seek( 0, IO::SEEK_END )
|
171
|
+
length = self.body.tell - starting_pos
|
172
|
+
self.body.seek( starting_pos, IO::SEEK_SET )
|
173
173
|
|
174
174
|
return length
|
175
175
|
else
|
176
176
|
raise Mongrel2::ResponseError,
|
177
177
|
"No way to calculate the content length of the response (a %s)." %
|
178
|
-
[
|
178
|
+
[ self.body.class.name ]
|
179
179
|
end
|
180
180
|
end
|
181
181
|
|
data/lib/mongrel2/response.rb
CHANGED
@@ -49,8 +49,8 @@ class Mongrel2::Response
|
|
49
49
|
|
50
50
|
# The body of the response
|
51
51
|
attr_accessor :body
|
52
|
-
# The request that this response is for, if there is one
|
53
52
|
|
53
|
+
# The request that this response is for, if there is one
|
54
54
|
attr_accessor :request
|
55
55
|
|
56
56
|
|
@@ -75,6 +75,7 @@ class Mongrel2::Response
|
|
75
75
|
return self.body
|
76
76
|
end
|
77
77
|
|
78
|
+
|
78
79
|
### Returns a string containing a human-readable representation of the Response,
|
79
80
|
### suitable for debugging.
|
80
81
|
def inspect
|
data/lib/mongrel2/table.rb
CHANGED
@@ -41,6 +41,10 @@ class Mongrel2::Table
|
|
41
41
|
end
|
42
42
|
|
43
43
|
|
44
|
+
#################################################################
|
45
|
+
### I N S T A N C E M E T H O D S
|
46
|
+
#################################################################
|
47
|
+
|
44
48
|
### Create a new Mongrel2::Table using the given +hash+ for initial
|
45
49
|
### values.
|
46
50
|
def initialize( initial_values={} )
|