mongrel2 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/ChangeLog +15 -2
- data/DSL.rdoc +300 -0
- data/History.rdoc +8 -0
- data/Manifest.txt +1 -0
- data/Rakefile +1 -1
- data/bin/m2sh.rb +2 -2
- data/examples/config.rb +19 -37
- data/lib/mongrel2.rb +2 -2
- data/lib/mongrel2/config.rb +1 -1
- data/lib/mongrel2/config/dsl.rb +40 -80
- data/lib/mongrel2/config/server.rb +3 -2
- data/lib/mongrel2/httprequest.rb +12 -0
- data/spec/mongrel2/config/dsl_spec.rb +15 -0
- data/spec/mongrel2/config_spec.rb +2 -1
- data/spec/mongrel2/httprequest_spec.rb +10 -0
- metadata +38 -36
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/ChangeLog
CHANGED
@@ -1,8 +1,21 @@
|
|
1
|
+
2012-02-10 Michael Granger <ged@FaerieMUD.org>
|
2
|
+
|
3
|
+
* examples/config.rb, lib/mongrel2/config/dsl.rb:
|
4
|
+
Start work on detailed docs for the config DSL
|
5
|
+
[fd35a1c88881] [tip]
|
6
|
+
|
1
7
|
2012-02-06 Michael Granger <ged@FaerieMUD.org>
|
2
8
|
|
9
|
+
* .rvm.gems, .rvmrc, .tm_properties, bin/m2sh.rb, examples/config.rb,
|
10
|
+
lib/mongrel2/config.rb, lib/mongrel2/config/dsl.rb,
|
11
|
+
lib/mongrel2/config/server.rb, spec/mongrel2/config/dsl_spec.rb,
|
12
|
+
spec/mongrel2/config_spec.rb:
|
13
|
+
Make the DSL declarations destructive.
|
14
|
+
[8c065a2dcebc]
|
15
|
+
|
3
16
|
* .hgtags:
|
4
17
|
Added tag v0.10.0 for changeset 1e9885cbcafd
|
5
|
-
[d3f06f6344ad]
|
18
|
+
[d3f06f6344ad]
|
6
19
|
|
7
20
|
* .hgsigs:
|
8
21
|
Added signature for changeset 948877fd6c9d
|
@@ -29,7 +42,7 @@
|
|
29
42
|
spec/mongrel2/config/filter_spec.rb,
|
30
43
|
spec/mongrel2/config/route_spec.rb:
|
31
44
|
Updating config database schema/classes for Mongrel 1.8.
|
32
|
-
[6d2608b23873]
|
45
|
+
[6d2608b23873]
|
33
46
|
|
34
47
|
* examples/config.rb:
|
35
48
|
Move the example server back to port 8113
|
data/DSL.rdoc
ADDED
@@ -0,0 +1,300 @@
|
|
1
|
+
= The Mongrel2 Config DSL
|
2
|
+
|
3
|
+
The Mongrel2::Config::DSL module is a mixin that will add functions to your
|
4
|
+
namespace that can create and replace configuration items in the current
|
5
|
+
Mongrel2 config database.
|
6
|
+
|
7
|
+
If you're creating a config that will be run standalone, you'll need to
|
8
|
+
point the config classes to the right database before using the DSL:
|
9
|
+
|
10
|
+
#!/usr/bin/env ruby
|
11
|
+
|
12
|
+
require 'mongrel2'
|
13
|
+
require 'mongrel2/config'
|
14
|
+
require 'mongrel2/config/dsl'
|
15
|
+
|
16
|
+
Mongrel2::Config.configure( configdb: 'myconfig.sqlite' )
|
17
|
+
include Mongrel2::Config::DSL
|
18
|
+
|
19
|
+
server 'myserver' do
|
20
|
+
# ...
|
21
|
+
end
|
22
|
+
|
23
|
+
If you're creating a config to be loaded via m2sh.rb, you don't need any of
|
24
|
+
that, as m2sh.rb provides its own prelude before loading the config.
|
25
|
+
|
26
|
+
== DSL Syntax
|
27
|
+
|
28
|
+
There is basically one directive for each configuration item, and the layout follows the basic structure described in the {Mongrel2 manual}[http://mongrel2.org/static/book-finalch4.html#x6-260003.4].
|
29
|
+
|
30
|
+
|
31
|
+
=== server
|
32
|
+
|
33
|
+
server <uuid> { <server config block> }
|
34
|
+
|
35
|
+
This creates or replaces the server associated with the specified +uuid+. The
|
36
|
+
<tt>server config block</tt> has directives for each of the server attributes,
|
37
|
+
each of which corresponds to one of the columns in the configuration database's
|
38
|
+
+server+ table (descriptions largely borrowed from the
|
39
|
+
manual[http://mongrel2.org/static/book-finalch4.html#x6-270003.4.1]):
|
40
|
+
|
41
|
+
[chroot +directory+] The directory that Mongrel2 should chroot to at startup.
|
42
|
+
Defaults to <tt>/var/www</tt>.
|
43
|
+
[access_log +path+] The path to the access log file relative to the +chroot+.
|
44
|
+
Usually starts with a ‘/’. Defaults to
|
45
|
+
<tt>/logs/access.log</tt>.
|
46
|
+
[error_log +path+] The error log file, just like +access_log+. Defaults to
|
47
|
+
<tt>/logs/error.log</tt>.
|
48
|
+
[pid_file +path+] The path to the PID file, relative to the +chroot+.
|
49
|
+
Defaults to <tt>/run/mongrel2.pid</tt>.
|
50
|
+
[default_host +name+] Which +host+ in the server to use as the default if
|
51
|
+
the +Host+ header doesn't match any host's +matching+
|
52
|
+
attribute. Defaults to <tt>localhost</tt>.
|
53
|
+
[bind_addr +ipaddr+] The IP address to bind to; default is <tt>0.0.0.0</tt>.
|
54
|
+
[port +int+] The port the server should listen on for new connections;
|
55
|
+
defaults to <tt>8888</tt>.
|
56
|
+
|
57
|
+
The server will be saved immediately upon exiting the block, and will return the
|
58
|
+
saved Mongrel2::Config::Server object.
|
59
|
+
|
60
|
+
|
61
|
+
=== host
|
62
|
+
|
63
|
+
host <name> { <host config block> }
|
64
|
+
|
65
|
+
This creates or replaces the named Host within a +server+ block. Inside the
|
66
|
+
<tt>host config block</tt>, there are directives for further configuring the
|
67
|
+
Host, adding Routes, and setting up Handler, Proxy, and Directory targets
|
68
|
+
for Routes.
|
69
|
+
|
70
|
+
[matching +pattern+] This is a pattern that’s used to match incoming
|
71
|
+
<tt>Host</tt> headers for routing purposes.
|
72
|
+
[maintenance +boolean+] This is a (currently unused) setting that will display
|
73
|
+
a "down for maintenance" page.
|
74
|
+
|
75
|
+
The rest of the block will likely be concerned with setting up the routes for
|
76
|
+
the host using the +route+, +handler+, +directory+, and +proxy+ directives, e.g.:
|
77
|
+
|
78
|
+
host 'main' do
|
79
|
+
matching 'example.com'
|
80
|
+
maintenance false
|
81
|
+
|
82
|
+
# Hello world application
|
83
|
+
route '/hello', handler('tcp://127.0.0.1:9999', 'helloworld-handler')
|
84
|
+
# Contact form handler
|
85
|
+
route '/contact', handler('tcp://127.0.0.1:9995', 'contact-form')
|
86
|
+
|
87
|
+
# reverse proxy for a non-mongrel application listening on 8080
|
88
|
+
route '/api', proxy('127.0.0.1', 8080)
|
89
|
+
end
|
90
|
+
# => #<Mongrel2::Config::Host ...>
|
91
|
+
|
92
|
+
Since the block is just a Ruby block, and each directive returns the configured
|
93
|
+
object, you can use conditionals, assign targets to variables to be reused later,
|
94
|
+
etc:
|
95
|
+
|
96
|
+
require 'socket'
|
97
|
+
|
98
|
+
host 'test' do
|
99
|
+
matching 'testing.example.com'
|
100
|
+
|
101
|
+
# Decide which address to listen to, and which app to use based on which
|
102
|
+
# host the config is running on.
|
103
|
+
testhandler =
|
104
|
+
if Socket.gethostname.include?( 'example.com' )
|
105
|
+
handler 'tcp://0.0.0.0:31218', 'ci-builder'
|
106
|
+
else
|
107
|
+
handler 'tcp://127.0.0.1', 'unittest-builder'
|
108
|
+
end
|
109
|
+
|
110
|
+
route '', testhandler
|
111
|
+
end
|
112
|
+
|
113
|
+
=== route
|
114
|
+
|
115
|
+
route <pattern>, <target>, [<opts>]
|
116
|
+
|
117
|
+
Create a route in the current host that will match the given +pattern+ and
|
118
|
+
pass the request to the specified +target+, which should be a Handler, a
|
119
|
+
Directory, or a Proxy.
|
120
|
+
|
121
|
+
The only current option is +reversed+, which (if +true+) means that the pattern
|
122
|
+
is bound to the end rather than the beginning of the path.
|
123
|
+
|
124
|
+
It returns the configured Route object.
|
125
|
+
|
126
|
+
route '/demo', handler('tcp://localhost:9400', 'demo-handler')
|
127
|
+
# => #<Mongrel2::Config::Route ...>
|
128
|
+
route '.css', directory('/public/css', 'base.css', 'text/css'), reverse: true
|
129
|
+
|
130
|
+
# Use the same image-factory handler for each image type
|
131
|
+
image_handler = handler('tcp://localhost:9300', 'image-factory')
|
132
|
+
route '.jpg', image_handler, reverse: true
|
133
|
+
route '.gif', image_handler, reverse: true
|
134
|
+
route '.png', image_handler, reverse: true
|
135
|
+
route '.ico', image_handler, reverse: true
|
136
|
+
|
137
|
+
=== handler
|
138
|
+
|
139
|
+
handler <send_spec>, <send_ident>, [<recv_spec>[, <recv_ident>]], [<options>]
|
140
|
+
|
141
|
+
Create a Handler that will send and receive on +send_spec+ and +recv_spec+ 0mq
|
142
|
+
sockets, respectively. The application's +send_ident+ is an identifier (usually
|
143
|
+
a UUID) that will be used to register the send socket so messages persist
|
144
|
+
through crashes.
|
145
|
+
|
146
|
+
If no +recv_spec+ is given, the port immediately below the +send_spec+ is used.
|
147
|
+
|
148
|
+
The +recv_ident+ is another UUID if you want the receive socket to subscribe to
|
149
|
+
its messages. Handlers properly mention the send_ident on all returned
|
150
|
+
messages, so you should either set this to nothing and don’t subscribe, or set
|
151
|
+
it to the same as +send_ident+.
|
152
|
+
|
153
|
+
Valid +options+ for Handlers are:
|
154
|
+
|
155
|
+
[raw_payload +boolean+] ?
|
156
|
+
[protocol +name+] The protocol used to communicate with the handler. Should
|
157
|
+
be either 'tnetstring' or 'json' (the default).
|
158
|
+
|
159
|
+
As with the other directives, +handler+ returns the newly-saved Handler object.
|
160
|
+
This means that you can either assign it to a variable for later inclusion in
|
161
|
+
one or more Route declarations, or you can define it in the <tt>route</tt> itself:
|
162
|
+
|
163
|
+
route '/gravatar/:email', handler('tcp://localhost:1480', 'gravatar-service')
|
164
|
+
# => #<Mongrel2::Config::Route ...>
|
165
|
+
|
166
|
+
See the documentation for @route@ for more examples of this.
|
167
|
+
|
168
|
+
|
169
|
+
=== directory
|
170
|
+
|
171
|
+
directory <base>, [<index_file>[, <default_ctype>[, <options>]]]
|
172
|
+
|
173
|
+
Create a Dir target for a route that will serve static content from the
|
174
|
+
specified +base+ directory. Returns the saved Dir object.
|
175
|
+
|
176
|
+
There aren't currently any supported +options+, but the Mongrel2 manual
|
177
|
+
says that "eventually you’ll be able to tweak more and more of the
|
178
|
+
settings to control how Dirs work."
|
179
|
+
|
180
|
+
|
181
|
+
=== proxy
|
182
|
+
|
183
|
+
proxy <addr>[, <port>]
|
184
|
+
|
185
|
+
Create a Proxy target for a route that will proxy another server listening
|
186
|
+
on the given +addr+ and +port+. If not specified, +port+ defaults to
|
187
|
+
<tt>80</tt>. Returns the saved Proxy object.
|
188
|
+
|
189
|
+
|
190
|
+
=== filter
|
191
|
+
|
192
|
+
filter <path>[, <settings>]
|
193
|
+
|
194
|
+
Set up a Filter[http://mongrel2.org/static/book-finalch6.html#x8-840005.8]
|
195
|
+
for the containing Server by loading the object from the specified +path+
|
196
|
+
and passing it the specified +options+ as a
|
197
|
+
TNetstring[http://tnetstrings.org/].
|
198
|
+
|
199
|
+
|
200
|
+
=== setting/settings
|
201
|
+
|
202
|
+
setting <name>, <value>
|
203
|
+
settings <name1> => <value1>[, <name2> => <value2>, ...]
|
204
|
+
|
205
|
+
Set one or more of Mongrel2's internal settings. See the
|
206
|
+
{tweakable expert settings section}[http://mongrel2.org/static/book-finalch4.html#x6-410003.10]
|
207
|
+
of the manual for valid values and more details on what these do.
|
208
|
+
|
209
|
+
An example (from the manual):
|
210
|
+
|
211
|
+
settings "zeromq.threads" => 1,
|
212
|
+
"upload.temp_store" => "/home/zedshaw/projects/mongrel2/tmp/upload.XXXXXX",
|
213
|
+
"upload.temp_store_mode" => "0666"
|
214
|
+
# => [ #<Mongrel2::Config::Setting ...>, #<Mongrel2::Config::Setting ...>, ... ]
|
215
|
+
|
216
|
+
=== mimetype/mimetypes
|
217
|
+
|
218
|
+
mimetype <extension>, <mimetype>
|
219
|
+
mimetypes <extension1> => <mimetype1>[, <extension2> => <mimetype2>]
|
220
|
+
|
221
|
+
Map one or more file +extension+s to a +mimetype+.
|
222
|
+
|
223
|
+
An example:
|
224
|
+
|
225
|
+
mimetypes '.ttf' => 'application/x-font-truetype',
|
226
|
+
'.otf' => 'application/x-font-opentype'
|
227
|
+
# => [#<Mongrel2::Config::Mimetype ...>, ... ]
|
228
|
+
|
229
|
+
|
230
|
+
== Example
|
231
|
+
|
232
|
+
This is the mongrel2.org config re-expressed in the Ruby DSL:
|
233
|
+
|
234
|
+
# the server to run them all
|
235
|
+
server '2f62bd5-9e59-49cd-993c-3b6013c28f05' do
|
236
|
+
|
237
|
+
access_log "/logs/access.log"
|
238
|
+
error_log "/logs/error.log"
|
239
|
+
chroot "./"
|
240
|
+
pid_file "/run/mongrel2.pid"
|
241
|
+
default_host "mongrel2.org"
|
242
|
+
name "main"
|
243
|
+
port 6767
|
244
|
+
|
245
|
+
# your main host
|
246
|
+
host "mongrel2.org" do
|
247
|
+
|
248
|
+
# a sample of doing some handlers
|
249
|
+
route '@chat', handler(
|
250
|
+
'tcp://127.0.0.1:9999',
|
251
|
+
'54c6755b-9628-40a4-9a2d-cc82a816345e',
|
252
|
+
'tcp://127.0.0.1:9998'
|
253
|
+
)
|
254
|
+
|
255
|
+
route '/handlertest', handler(
|
256
|
+
'tcp://127.0.0.1:9997',
|
257
|
+
'34f9ceee-cd52-4b7f-b197-88bf2f0ec378',
|
258
|
+
'tcp://127.0.0.1:9996'
|
259
|
+
)
|
260
|
+
|
261
|
+
# a sample proxy route
|
262
|
+
web_app_proxy = proxy( '127.0.0.1', 8080 )
|
263
|
+
|
264
|
+
route '/chat/', web_app_proxy
|
265
|
+
route '/', web_app_proxy
|
266
|
+
|
267
|
+
# here's a sample directory
|
268
|
+
test_directory = directory(
|
269
|
+
'tests/',
|
270
|
+
:index_file => 'index.html',
|
271
|
+
:default_ctype => 'text/plain'
|
272
|
+
)
|
273
|
+
|
274
|
+
route '/tests/', test_directory
|
275
|
+
route '/testsmulti/(.*.json)', test_directory
|
276
|
+
|
277
|
+
chat_demo_dir = directory(
|
278
|
+
'examples/chat/static/',
|
279
|
+
:index_file => 'index.html',
|
280
|
+
:default_ctype => 'text/plain'
|
281
|
+
)
|
282
|
+
|
283
|
+
route '/chatdemo/', chat_demo_dir
|
284
|
+
route '/static/', chat_demo_dir
|
285
|
+
|
286
|
+
route '/mp3stream', handler(
|
287
|
+
'tcp://127.0.0.1:9995',
|
288
|
+
'53f9f1d1-1116-4751-b6ff-4fbe3e43d142',
|
289
|
+
'tcp://127.0.0.1:9994'
|
290
|
+
)
|
291
|
+
end
|
292
|
+
|
293
|
+
end
|
294
|
+
|
295
|
+
settings(
|
296
|
+
"zeromq.threads" => 1,
|
297
|
+
"upload.temp_store" => "/home/zedshaw/projects/mongrel2/tmp/upload.XXXXXX",
|
298
|
+
"upload.temp_store_mode" => "0666"
|
299
|
+
)
|
300
|
+
|
data/History.rdoc
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== v0.11.0 [2012-02-15] Michael Granger <ged@FaerieMUD.org>
|
2
|
+
|
3
|
+
- Make the DSL declarations replace existing records.
|
4
|
+
- Flesh out the documentation for the DSL
|
5
|
+
- Provide convenience methods for resetting an HTTP request's
|
6
|
+
Content-type and Content-encoding headers.
|
7
|
+
|
8
|
+
|
1
9
|
== v0.10.0 [2012-02-06] Michael Granger <ged@FaerieMUD.org>
|
2
10
|
|
3
11
|
This release includes updates for Mongrel 1.8 and finishes up the m2sh.rb tool.
|
data/Manifest.txt
CHANGED
data/Rakefile
CHANGED
@@ -20,7 +20,7 @@ Hoe.plugins.delete :rubyforge
|
|
20
20
|
hoespec = Hoe.spec 'mongrel2' do
|
21
21
|
self.readme_file = 'README.rdoc'
|
22
22
|
self.history_file = 'History.rdoc'
|
23
|
-
self.extra_rdoc_files
|
23
|
+
self.extra_rdoc_files = Rake::FileList[ '*.rdoc' ]
|
24
24
|
self.spec_extras[:rdoc_options] = ['-t', 'Ruby-Mongrel2']
|
25
25
|
|
26
26
|
self.developer 'Michael Granger', 'ged@FaerieMUD.org'
|
data/bin/m2sh.rb
CHANGED
@@ -293,7 +293,7 @@ class Mongrel2::M2SHCommand
|
|
293
293
|
|
294
294
|
header "Loading config from #{configfile}"
|
295
295
|
source = File.read( configfile )
|
296
|
-
|
296
|
+
|
297
297
|
runspace.module_eval( source, configfile, 0 )
|
298
298
|
end
|
299
299
|
help :load, "Overwrite the config database with the values from the speciifed CONFIGFILE."
|
@@ -406,7 +406,7 @@ class Mongrel2::M2SHCommand
|
|
406
406
|
def servers_command( * )
|
407
407
|
header 'SERVERS:'
|
408
408
|
Mongrel2::Config.servers.each do |server|
|
409
|
-
message "%s
|
409
|
+
message "%s [%s]: %s" % [
|
410
410
|
self.prompt.color( server.name, :key ),
|
411
411
|
server.default_host,
|
412
412
|
server.uuid,
|
data/examples/config.rb
CHANGED
@@ -1,52 +1,37 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
# The Mongrel config used by the examples.
|
3
|
+
# The Mongrel config used by the examples. Load it with:
|
4
|
+
#
|
5
|
+
# m2sh.rb -c examples.sqlite load examples/config.rb
|
6
|
+
#
|
4
7
|
|
5
|
-
|
6
|
-
|
7
|
-
basedir = Pathname( __FILE__ ).dirname.parent
|
8
|
-
libdir = basedir + 'lib'
|
9
|
-
|
10
|
-
$LOAD_PATH.unshift( libdir.to_s )
|
11
|
-
}
|
12
|
-
|
13
|
-
require 'rubygems'
|
14
|
-
require 'fileutils'
|
15
|
-
require 'mongrel2'
|
16
|
-
require 'mongrel2/config'
|
17
|
-
|
18
|
-
include FileUtils::Verbose
|
19
|
-
|
20
|
-
Mongrel2.log.level = Logger::INFO
|
21
|
-
Mongrel2::Config.configure( :configdb => 'examples.sqlite' )
|
22
|
-
include Mongrel2::Config::DSL
|
8
|
+
# samples server
|
9
|
+
server '34D8E57C-3E91-4F24-9BBE-0B53C1827CB4' do
|
23
10
|
|
24
|
-
|
11
|
+
name 'main'
|
12
|
+
default_host 'www.example.com'
|
25
13
|
|
26
|
-
|
27
|
-
|
14
|
+
access_log '/logs/access.log'
|
15
|
+
error_log '/logs/error.log'
|
16
|
+
chroot '/var/mongrel2'
|
17
|
+
pid_file '/run/mongrel2.pid'
|
28
18
|
|
29
|
-
|
30
|
-
|
31
|
-
chroot "/var/mongrel2"
|
32
|
-
pid_file "/run/mongrel2.pid"
|
33
|
-
default_host "localhost"
|
34
|
-
name "main"
|
35
|
-
port 8113
|
19
|
+
bind_addr '0.0.0.0'
|
20
|
+
port 8113
|
36
21
|
|
37
|
-
# your main host
|
38
|
-
host
|
22
|
+
# your main host
|
23
|
+
host 'www.example.com' do
|
39
24
|
|
40
25
|
route '/', directory( 'data/mongrel2/', 'bootstrap.html', 'text/html' )
|
41
26
|
route '/source', directory( 'examples/', 'README.txt', 'text/plain' )
|
42
27
|
|
43
28
|
# Handlers
|
44
|
-
route '/hello', handler( 'tcp://127.0.0.1:9999', 'helloworld-handler' )
|
45
|
-
route '/dump', handler( 'tcp://127.0.0.1:9997', 'request-dumper' )
|
29
|
+
route '/hello', handler( 'tcp://127.0.0.1:9999', 'helloworld-handler' )
|
30
|
+
route '/dump', handler( 'tcp://127.0.0.1:9997', 'request-dumper' )
|
46
31
|
|
47
32
|
end
|
48
33
|
|
49
|
-
filter
|
34
|
+
filter '/usr/local/lib/mongrel2/filters/null.so',
|
50
35
|
extensions: ["*.html", "*.txt"],
|
51
36
|
min_size: 1000
|
52
37
|
|
@@ -54,6 +39,3 @@ end
|
|
54
39
|
|
55
40
|
setting "zeromq.threads", 1
|
56
41
|
|
57
|
-
mkdir_p 'run'
|
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.11.0'
|
18
18
|
|
19
19
|
# Version-control revision constant
|
20
|
-
REVISION = %q$Revision:
|
20
|
+
REVISION = %q$Revision: 5d438ea6037a $
|
21
21
|
|
22
22
|
|
23
23
|
require 'mongrel2/logging'
|
data/lib/mongrel2/config.rb
CHANGED
data/lib/mongrel2/config/dsl.rb
CHANGED
@@ -3,79 +3,7 @@
|
|
3
3
|
require 'mongrel2' unless defined?( Mongrel2 )
|
4
4
|
require 'mongrel2/config' unless defined?( Mongrel2::Config )
|
5
5
|
|
6
|
-
#
|
7
|
-
#
|
8
|
-
# == Example
|
9
|
-
#
|
10
|
-
# This is the mongrel2.org config re-expressed in the Ruby DSL:
|
11
|
-
#
|
12
|
-
# # the server to run them all
|
13
|
-
# server '2f62bd5-9e59-49cd-993c-3b6013c28f05' do
|
14
|
-
#
|
15
|
-
# access_log "/logs/access.log"
|
16
|
-
# error_log "/logs/error.log"
|
17
|
-
# chroot "./"
|
18
|
-
# pid_file "/run/mongrel2.pid"
|
19
|
-
# default_host "mongrel2.org"
|
20
|
-
# name "main"
|
21
|
-
# port 6767
|
22
|
-
#
|
23
|
-
# # your main host
|
24
|
-
# host "mongrel2.org" do
|
25
|
-
#
|
26
|
-
# # a sample of doing some handlers
|
27
|
-
# route '@chat', handler(
|
28
|
-
# 'tcp://127.0.0.1:9999',
|
29
|
-
# '54c6755b-9628-40a4-9a2d-cc82a816345e',
|
30
|
-
# 'tcp://127.0.0.1:9998'
|
31
|
-
# )
|
32
|
-
#
|
33
|
-
# route '/handlertest', handler(
|
34
|
-
# 'tcp://127.0.0.1:9997',
|
35
|
-
# '34f9ceee-cd52-4b7f-b197-88bf2f0ec378',
|
36
|
-
# 'tcp://127.0.0.1:9996'
|
37
|
-
# )
|
38
|
-
#
|
39
|
-
# # a sample proxy route
|
40
|
-
# web_app_proxy = proxy( '127.0.0.1', 8080 )
|
41
|
-
#
|
42
|
-
# route '/chat/', web_app_proxy
|
43
|
-
# route '/', web_app_proxy
|
44
|
-
#
|
45
|
-
# # here's a sample directory
|
46
|
-
# test_directory = directory(
|
47
|
-
# 'tests/',
|
48
|
-
# :index_file => 'index.html',
|
49
|
-
# :default_ctype => 'text/plain'
|
50
|
-
# )
|
51
|
-
#
|
52
|
-
# route '/tests/', test_directory
|
53
|
-
# route '/testsmulti/(.*.json)', test_directory
|
54
|
-
#
|
55
|
-
# chat_demo_dir = directory(
|
56
|
-
# 'examples/chat/static/',
|
57
|
-
# :index_file => 'index.html',
|
58
|
-
# :default_ctype => 'text/plain'
|
59
|
-
# )
|
60
|
-
#
|
61
|
-
# route '/chatdemo/', chat_demo_dir
|
62
|
-
# route '/static/', chat_demo_dir
|
63
|
-
#
|
64
|
-
# route '/mp3stream', handler(
|
65
|
-
# 'tcp://127.0.0.1:9995',
|
66
|
-
# '53f9f1d1-1116-4751-b6ff-4fbe3e43d142',
|
67
|
-
# 'tcp://127.0.0.1:9994'
|
68
|
-
# )
|
69
|
-
# end
|
70
|
-
#
|
71
|
-
# end
|
72
|
-
#
|
73
|
-
# settings(
|
74
|
-
# "zeromq.threads" => 1,
|
75
|
-
# "upload.temp_store" => "/home/zedshaw/projects/mongrel2/tmp/upload.XXXXXX",
|
76
|
-
# "upload.temp_store_mode" => "0666"
|
77
|
-
# )
|
78
|
-
#
|
6
|
+
# See DSL.rdoc for details on how to use this mixin.
|
79
7
|
module Mongrel2::Config::DSL
|
80
8
|
|
81
9
|
|
@@ -85,10 +13,19 @@ module Mongrel2::Config::DSL
|
|
85
13
|
class Adapter
|
86
14
|
include Mongrel2::Loggable
|
87
15
|
|
88
|
-
###
|
16
|
+
### Create an instance of the specified +targetclass+ using the specified +opts+
|
17
|
+
### as initial values. The first pair of +opts+ will be used in the filter to
|
18
|
+
### find any previous instance and delete it.
|
89
19
|
def initialize( targetclass, opts={} )
|
90
20
|
self.log.debug "Wrapping a %p" % [ targetclass ]
|
91
21
|
@targetclass = targetclass
|
22
|
+
|
23
|
+
# Use the first pair as the primary key
|
24
|
+
unless opts.empty?
|
25
|
+
first_pair = Hash[ *opts.first ]
|
26
|
+
@targetclass.filter( first_pair ).destroy
|
27
|
+
end
|
28
|
+
|
92
29
|
@target = @targetclass.new( opts )
|
93
30
|
self.decorate_with_column_declaratives( @target )
|
94
31
|
self.decorate_with_custom_declaratives( @targetclass )
|
@@ -147,11 +84,32 @@ module Mongrel2::Config::DSL
|
|
147
84
|
### Create a Mongrel2::Config::Server with the specified +uuid+, evaluate
|
148
85
|
### the block (if given) within its context, and return it.
|
149
86
|
def server( uuid, &block )
|
150
|
-
|
87
|
+
adapter = nil
|
88
|
+
|
89
|
+
Mongrel2.log.info "Entering transaction for server %p" % [ uuid ]
|
90
|
+
Mongrel2::Config.db.transaction do
|
91
|
+
Mongrel2.log.info " ensuring db is set up..."
|
92
|
+
Mongrel2::Config.init_database
|
93
|
+
|
94
|
+
# Set up the options hash with the UUID and reasonable defaults
|
95
|
+
# for everything else
|
96
|
+
server_opts = {
|
97
|
+
uuid: uuid,
|
98
|
+
access_log: "/logs/access.log",
|
99
|
+
error_log: "/logs/error.log",
|
100
|
+
pid_file: "/run/mongrel2.pid",
|
101
|
+
default_host: "localhost",
|
102
|
+
port: 8888,
|
103
|
+
}
|
104
|
+
|
105
|
+
Mongrel2.log.debug "Server [%s] (block: %p)" % [ uuid, block ]
|
106
|
+
adapter = Adapter.new( Mongrel2::Config::Server, server_opts )
|
107
|
+
adapter.instance_eval( &block ) if block
|
108
|
+
|
109
|
+
Mongrel2.log.info " saving server %p..." % [ uuid ]
|
110
|
+
adapter.target.save
|
111
|
+
end
|
151
112
|
|
152
|
-
Mongrel2.log.debug "Server [%s] (block: %p)" % [ uuid, block ]
|
153
|
-
adapter = Adapter.new( Mongrel2::Config::Server, :uuid => uuid )
|
154
|
-
adapter.instance_eval( &block ) if block
|
155
113
|
return adapter.target
|
156
114
|
end
|
157
115
|
|
@@ -159,7 +117,9 @@ module Mongrel2::Config::DSL
|
|
159
117
|
### Set the value of one of the 'Tweakable Expert Settings'
|
160
118
|
def setting( key, val )
|
161
119
|
Mongrel2::Config.init_database
|
162
|
-
|
120
|
+
setting = Mongrel2::Config::Setting.find_or_create( key: key )
|
121
|
+
setting.value = val
|
122
|
+
setting.save
|
163
123
|
end
|
164
124
|
|
165
125
|
|
@@ -181,7 +141,7 @@ module Mongrel2::Config::DSL
|
|
181
141
|
def mimetype( extension, mimetype )
|
182
142
|
Mongrel2::Config.init_database
|
183
143
|
|
184
|
-
type = Mongrel2::Config::Mimetype.find_or_create( :
|
144
|
+
type = Mongrel2::Config::Mimetype.find_or_create( extension: extension )
|
185
145
|
type.mimetype = mimetype
|
186
146
|
type.save
|
187
147
|
|
@@ -90,12 +90,13 @@ class Mongrel2::Config::Server < Mongrel2::Config( :server )
|
|
90
90
|
self.target.save( :validate => false )
|
91
91
|
|
92
92
|
Mongrel2.log.debug "Host [%s] (block: %p)" % [ name, block ]
|
93
|
-
adapter = Mongrel2::Config::DSL::Adapter.new( Mongrel2::Config::Host,
|
94
|
-
|
93
|
+
adapter = Mongrel2::Config::DSL::Adapter.new( Mongrel2::Config::Host, name: name )
|
94
|
+
adapter.target.matching = name
|
95
95
|
adapter.instance_eval( &block ) if block
|
96
96
|
self.target.add_host( adapter.target )
|
97
97
|
end
|
98
98
|
|
99
|
+
|
99
100
|
### Add a Mongrel2::Config::Filter to the Server object with the specified
|
100
101
|
### +path+ (name) and +settings+ hash.
|
101
102
|
def filter( path, settings={} )
|
data/lib/mongrel2/httprequest.rb
CHANGED
@@ -60,12 +60,24 @@ class Mongrel2::HTTPRequest < Mongrel2::Request
|
|
60
60
|
end
|
61
61
|
|
62
62
|
|
63
|
+
### Set the current request's Content-Type.
|
64
|
+
def content_type=( type )
|
65
|
+
return self.headers.content_type = type
|
66
|
+
end
|
67
|
+
|
68
|
+
|
63
69
|
### Fetch the encoding type of the request's content, as set in its header.
|
64
70
|
def content_encoding
|
65
71
|
return self.headers.content_encoding
|
66
72
|
end
|
67
73
|
|
68
74
|
|
75
|
+
### Set the request's encoding type.
|
76
|
+
def content_encoding=( type )
|
77
|
+
return self.headers.content_encoding = type
|
78
|
+
end
|
79
|
+
|
80
|
+
|
69
81
|
|
70
82
|
#########
|
71
83
|
protected
|
@@ -31,6 +31,13 @@ describe Mongrel2::Config::DSL do
|
|
31
31
|
setup_config_db()
|
32
32
|
end
|
33
33
|
|
34
|
+
before( :each ) do
|
35
|
+
Mongrel2::Config::Server.truncate
|
36
|
+
Mongrel2::Config::Host.truncate
|
37
|
+
Mongrel2::Config::Route.truncate
|
38
|
+
Mongrel2::Config::Filter.truncate
|
39
|
+
end
|
40
|
+
|
34
41
|
after( :all ) do
|
35
42
|
reset_logging()
|
36
43
|
end
|
@@ -161,6 +168,14 @@ describe Mongrel2::Config::DSL do
|
|
161
168
|
|
162
169
|
describe 'settings' do
|
163
170
|
|
171
|
+
before( :all ) do
|
172
|
+
@ids = Mongrel2::Config::Setting.map( :id )
|
173
|
+
end
|
174
|
+
|
175
|
+
after( :each ) do
|
176
|
+
Mongrel2::Config::Setting.dataset.filter( ~:id => @ids ).delete
|
177
|
+
end
|
178
|
+
|
164
179
|
it "can set the expert tweakable settings en masse" do
|
165
180
|
result = settings(
|
166
181
|
"zeromq.threads" => 8,
|
@@ -54,7 +54,8 @@ describe Mongrel2::Config do
|
|
54
54
|
|
55
55
|
it "has a convenience method for fetching an Array of all of its configured servers" do
|
56
56
|
Mongrel2::Config.init_database
|
57
|
-
Mongrel2::Config::Server.
|
57
|
+
Mongrel2::Config::Server.truncate
|
58
|
+
|
58
59
|
s = Mongrel2::Config::Server.create(
|
59
60
|
uuid: TEST_UUID,
|
60
61
|
access_log: '/log/access.log',
|
@@ -97,10 +97,20 @@ describe Mongrel2::HTTPRequest do
|
|
97
97
|
@req.content_type.should == 'application/x-pdf'
|
98
98
|
end
|
99
99
|
|
100
|
+
it "provides a convenience method for resetting the 'Content-type' header" do
|
101
|
+
@req.content_type = 'application/json'
|
102
|
+
@req.content_type.should == 'application/json'
|
103
|
+
end
|
104
|
+
|
100
105
|
it "provides a convenience method for fetching the 'Content-encoding' header" do
|
101
106
|
@req.content_encoding.should == 'gzip'
|
102
107
|
end
|
103
108
|
|
109
|
+
it "provides a convenience method for resetting the 'Content-encoding' header" do
|
110
|
+
@req.content_encoding = 'identity'
|
111
|
+
@req.content_encoding.should == 'identity'
|
112
|
+
end
|
113
|
+
|
104
114
|
end
|
105
115
|
|
106
116
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongrel2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -48,11 +48,11 @@ cert_chain:
|
|
48
48
|
-----END CERTIFICATE-----
|
49
49
|
|
50
50
|
'
|
51
|
-
date: 2012-02-
|
51
|
+
date: 2012-02-16 00:00:00.000000000 Z
|
52
52
|
dependencies:
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
54
|
name: nokogiri
|
55
|
-
requirement: &
|
55
|
+
requirement: &70337700771620 !ruby/object:Gem::Requirement
|
56
56
|
none: false
|
57
57
|
requirements:
|
58
58
|
- - ~>
|
@@ -60,10 +60,10 @@ dependencies:
|
|
60
60
|
version: '1.5'
|
61
61
|
type: :runtime
|
62
62
|
prerelease: false
|
63
|
-
version_requirements: *
|
63
|
+
version_requirements: *70337700771620
|
64
64
|
- !ruby/object:Gem::Dependency
|
65
65
|
name: sequel
|
66
|
-
requirement: &
|
66
|
+
requirement: &70337700771160 !ruby/object:Gem::Requirement
|
67
67
|
none: false
|
68
68
|
requirements:
|
69
69
|
- - ~>
|
@@ -71,10 +71,10 @@ dependencies:
|
|
71
71
|
version: '3.31'
|
72
72
|
type: :runtime
|
73
73
|
prerelease: false
|
74
|
-
version_requirements: *
|
74
|
+
version_requirements: *70337700771160
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: amalgalite
|
77
|
-
requirement: &
|
77
|
+
requirement: &70337700770600 !ruby/object:Gem::Requirement
|
78
78
|
none: false
|
79
79
|
requirements:
|
80
80
|
- - ~>
|
@@ -82,10 +82,10 @@ dependencies:
|
|
82
82
|
version: '1.1'
|
83
83
|
type: :runtime
|
84
84
|
prerelease: false
|
85
|
-
version_requirements: *
|
85
|
+
version_requirements: *70337700770600
|
86
86
|
- !ruby/object:Gem::Dependency
|
87
87
|
name: tnetstring
|
88
|
-
requirement: &
|
88
|
+
requirement: &70337700770060 !ruby/object:Gem::Requirement
|
89
89
|
none: false
|
90
90
|
requirements:
|
91
91
|
- - ~>
|
@@ -93,10 +93,10 @@ dependencies:
|
|
93
93
|
version: '0.3'
|
94
94
|
type: :runtime
|
95
95
|
prerelease: false
|
96
|
-
version_requirements: *
|
96
|
+
version_requirements: *70337700770060
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: yajl-ruby
|
99
|
-
requirement: &
|
99
|
+
requirement: &70337700769520 !ruby/object:Gem::Requirement
|
100
100
|
none: false
|
101
101
|
requirements:
|
102
102
|
- - ~>
|
@@ -104,10 +104,10 @@ dependencies:
|
|
104
104
|
version: '1.0'
|
105
105
|
type: :runtime
|
106
106
|
prerelease: false
|
107
|
-
version_requirements: *
|
107
|
+
version_requirements: *70337700769520
|
108
108
|
- !ruby/object:Gem::Dependency
|
109
109
|
name: trollop
|
110
|
-
requirement: &
|
110
|
+
requirement: &70337700769020 !ruby/object:Gem::Requirement
|
111
111
|
none: false
|
112
112
|
requirements:
|
113
113
|
- - ~>
|
@@ -115,10 +115,10 @@ dependencies:
|
|
115
115
|
version: '1.16'
|
116
116
|
type: :runtime
|
117
117
|
prerelease: false
|
118
|
-
version_requirements: *
|
118
|
+
version_requirements: *70337700769020
|
119
119
|
- !ruby/object:Gem::Dependency
|
120
120
|
name: sysexits
|
121
|
-
requirement: &
|
121
|
+
requirement: &70337700768500 !ruby/object:Gem::Requirement
|
122
122
|
none: false
|
123
123
|
requirements:
|
124
124
|
- - ~>
|
@@ -126,10 +126,10 @@ dependencies:
|
|
126
126
|
version: '1.0'
|
127
127
|
type: :runtime
|
128
128
|
prerelease: false
|
129
|
-
version_requirements: *
|
129
|
+
version_requirements: *70337700768500
|
130
130
|
- !ruby/object:Gem::Dependency
|
131
131
|
name: zmq
|
132
|
-
requirement: &
|
132
|
+
requirement: &70337700767980 !ruby/object:Gem::Requirement
|
133
133
|
none: false
|
134
134
|
requirements:
|
135
135
|
- - ~>
|
@@ -137,10 +137,10 @@ dependencies:
|
|
137
137
|
version: 2.1.4
|
138
138
|
type: :runtime
|
139
139
|
prerelease: false
|
140
|
-
version_requirements: *
|
140
|
+
version_requirements: *70337700767980
|
141
141
|
- !ruby/object:Gem::Dependency
|
142
142
|
name: hoe-mercurial
|
143
|
-
requirement: &
|
143
|
+
requirement: &70337700767500 !ruby/object:Gem::Requirement
|
144
144
|
none: false
|
145
145
|
requirements:
|
146
146
|
- - ~>
|
@@ -148,10 +148,10 @@ dependencies:
|
|
148
148
|
version: 1.3.1
|
149
149
|
type: :development
|
150
150
|
prerelease: false
|
151
|
-
version_requirements: *
|
151
|
+
version_requirements: *70337700767500
|
152
152
|
- !ruby/object:Gem::Dependency
|
153
153
|
name: hoe-highline
|
154
|
-
requirement: &
|
154
|
+
requirement: &70337700766940 !ruby/object:Gem::Requirement
|
155
155
|
none: false
|
156
156
|
requirements:
|
157
157
|
- - ~>
|
@@ -159,10 +159,10 @@ dependencies:
|
|
159
159
|
version: 0.0.1
|
160
160
|
type: :development
|
161
161
|
prerelease: false
|
162
|
-
version_requirements: *
|
162
|
+
version_requirements: *70337700766940
|
163
163
|
- !ruby/object:Gem::Dependency
|
164
164
|
name: configurability
|
165
|
-
requirement: &
|
165
|
+
requirement: &70337700766400 !ruby/object:Gem::Requirement
|
166
166
|
none: false
|
167
167
|
requirements:
|
168
168
|
- - ~>
|
@@ -170,10 +170,10 @@ dependencies:
|
|
170
170
|
version: '1.0'
|
171
171
|
type: :development
|
172
172
|
prerelease: false
|
173
|
-
version_requirements: *
|
173
|
+
version_requirements: *70337700766400
|
174
174
|
- !ruby/object:Gem::Dependency
|
175
175
|
name: rspec
|
176
|
-
requirement: &
|
176
|
+
requirement: &70337700765860 !ruby/object:Gem::Requirement
|
177
177
|
none: false
|
178
178
|
requirements:
|
179
179
|
- - ~>
|
@@ -181,29 +181,29 @@ dependencies:
|
|
181
181
|
version: '2.8'
|
182
182
|
type: :development
|
183
183
|
prerelease: false
|
184
|
-
version_requirements: *
|
184
|
+
version_requirements: *70337700765860
|
185
185
|
- !ruby/object:Gem::Dependency
|
186
|
-
name:
|
187
|
-
requirement: &
|
186
|
+
name: rdoc
|
187
|
+
requirement: &70337700765360 !ruby/object:Gem::Requirement
|
188
188
|
none: false
|
189
189
|
requirements:
|
190
190
|
- - ~>
|
191
191
|
- !ruby/object:Gem::Version
|
192
|
-
version: '
|
192
|
+
version: '3.10'
|
193
193
|
type: :development
|
194
194
|
prerelease: false
|
195
|
-
version_requirements: *
|
195
|
+
version_requirements: *70337700765360
|
196
196
|
- !ruby/object:Gem::Dependency
|
197
|
-
name:
|
198
|
-
requirement: &
|
197
|
+
name: hoe
|
198
|
+
requirement: &70337700764820 !ruby/object:Gem::Requirement
|
199
199
|
none: false
|
200
200
|
requirements:
|
201
201
|
- - ~>
|
202
202
|
- !ruby/object:Gem::Version
|
203
|
-
version: '
|
203
|
+
version: '2.13'
|
204
204
|
type: :development
|
205
205
|
prerelease: false
|
206
|
-
version_requirements: *
|
206
|
+
version_requirements: *70337700764820
|
207
207
|
description: ! "Ruby-Mongrel2 is a complete Ruby (1.9-only) connector for \nMongrel2[http://mongrel2.org/].\n\nThis
|
208
208
|
library includes configuration-database ORM classes, a Ruby\nimplementation of the
|
209
209
|
'm2sh' tool, a configuration DSL for generating config\ndatabases in pure Ruby,
|
@@ -227,12 +227,14 @@ extensions: []
|
|
227
227
|
extra_rdoc_files:
|
228
228
|
- Manifest.txt
|
229
229
|
- examples/README.txt
|
230
|
-
-
|
230
|
+
- DSL.rdoc
|
231
231
|
- History.rdoc
|
232
|
+
- README.rdoc
|
232
233
|
files:
|
233
234
|
- .autotest
|
234
235
|
- .gemtest
|
235
236
|
- ChangeLog
|
237
|
+
- DSL.rdoc
|
236
238
|
- History.rdoc
|
237
239
|
- Manifest.txt
|
238
240
|
- README.rdoc
|
@@ -327,7 +329,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
327
329
|
version: '0'
|
328
330
|
requirements: []
|
329
331
|
rubyforge_project: mongrel2
|
330
|
-
rubygems_version: 1.8.
|
332
|
+
rubygems_version: 1.8.10
|
331
333
|
signing_key:
|
332
334
|
specification_version: 3
|
333
335
|
summary: Ruby-Mongrel2 is a complete Ruby (1.9-only) connector for Mongrel2[http://mongrel2.org/]
|
metadata.gz.sig
CHANGED
Binary file
|