mongrel2 0.32.0 → 0.33.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/ChangeLog +37 -1
- data/History.rdoc +7 -0
- data/data/mongrel2/bootstrap.html +5 -3
- data/examples/async-upload.rb +2 -6
- data/lib/mongrel2/connection.rb +2 -2
- data/lib/mongrel2/handler.rb +85 -26
- data/lib/mongrel2/request.rb +2 -2
- data/lib/mongrel2.rb +2 -2
- data/spec/lib/helpers.rb +3 -24
- data/spec/mongrel2/handler_spec.rb +5 -3
- data.tar.gz.sig +0 -0
- metadata +2 -2
- metadata.gz.sig +3 -3
data/ChangeLog
CHANGED
@@ -1,8 +1,44 @@
|
|
1
|
+
2012-09-21 Michael Granger <ged@FaerieMUD.org>
|
2
|
+
|
3
|
+
* spec/lib/helpers.rb:
|
4
|
+
Use Loggability's spec helpers
|
5
|
+
[36f9259ea9aa] [tip]
|
6
|
+
|
7
|
+
* lib/mongrel2/request.rb:
|
8
|
+
Don't log the whole damn request in debugging
|
9
|
+
[6767558cf718]
|
10
|
+
|
11
|
+
2012-09-18 Michael Granger <ged@FaerieMUD.org>
|
12
|
+
|
13
|
+
* .hgtags:
|
14
|
+
Added tag v0.32.0 for changeset 784babdfb85c
|
15
|
+
[d7f1ccc8c130]
|
16
|
+
|
17
|
+
* .hgsigs:
|
18
|
+
Added signature for changeset ebfb060e8c65
|
19
|
+
[784babdfb85c] [v0.32.0]
|
20
|
+
|
21
|
+
* History.rdoc, lib/mongrel2.rb:
|
22
|
+
Bump the minor version, update history.
|
23
|
+
[ebfb060e8c65]
|
24
|
+
|
25
|
+
* .hgignore:
|
26
|
+
Ignore foreman settings files
|
27
|
+
[16b910708f91]
|
28
|
+
|
29
|
+
* bin/m2sh.rb:
|
30
|
+
Add a settings command for showing "expert" settings
|
31
|
+
[09884906b249]
|
32
|
+
|
33
|
+
* .rvm.gems, Rakefile:
|
34
|
+
Updating dependencies
|
35
|
+
[7a901c95b004]
|
36
|
+
|
1
37
|
2012-08-20 Michael Granger <ged@FaerieMUD.org>
|
2
38
|
|
3
39
|
* .hgtags:
|
4
40
|
Added tag v0.31.1 for changeset 54464cda5795
|
5
|
-
[933a499629d1]
|
41
|
+
[933a499629d1]
|
6
42
|
|
7
43
|
* .hgsigs:
|
8
44
|
Added signature for changeset a66bb80de490
|
data/History.rdoc
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
== v0.33.0 [2012-10-02] Michael Granger <ged@FaerieMUD.org>
|
2
|
+
|
3
|
+
- Implement deferred signal-handling for Mongrel2::Handler
|
4
|
+
- Update the examples/
|
5
|
+
- Squelch some of the noisier debug logging
|
6
|
+
|
7
|
+
|
1
8
|
== v0.32.0 [2012-09-18] Michael Granger <ged@FaerieMUD.org>
|
2
9
|
|
3
10
|
- Add a settings command for showing "expert" settings to m2sh.rb.
|
@@ -18,14 +18,16 @@
|
|
18
18
|
<li><a href="/hello">Hello World</a> (<a href="/source/helloworld-handler.rb">source</a>) </li>
|
19
19
|
<li><a href="/async-upload">Async Upload Demo</a>
|
20
20
|
(<a href="/source/async-upload.rb">source</a>) </li>
|
21
|
-
<li><a href="/dump">Dump Request</a>
|
22
|
-
|
21
|
+
<li><a href="/dump">Dump Request</a>
|
22
|
+
(<a href="/source/request-dumper.rb">source</a>) </li>
|
23
|
+
<li><a href="/websock-test.html">Web Socket Test</a>
|
24
|
+
(<a href="/source/ws-echo.rb">source</a>)</li>
|
23
25
|
</ol>
|
24
26
|
</section>
|
25
27
|
|
26
28
|
<footer>
|
27
29
|
<p>Copyright © 2011-2012 Michael Granger <<a href="mailto:ged@FaerieMUD.org">ged@FaerieMUD.org</a>>.</p>
|
28
|
-
<p><tt>$Id: bootstrap.html,v
|
30
|
+
<p><tt>$Id: bootstrap.html,v 4c64666f4255 2012/10/03 00:42:35 ged $</tt></p>
|
29
31
|
</footer>
|
30
32
|
</body>
|
31
33
|
</html>
|
data/examples/async-upload.rb
CHANGED
@@ -26,7 +26,7 @@ class AsyncUploadHandler < Mongrel2::Handler
|
|
26
26
|
|
27
27
|
|
28
28
|
### Mongrel2 async upload callback -- allow uploads to proceed.
|
29
|
-
def
|
29
|
+
def handle_async_upload_start( request )
|
30
30
|
self.log.info "Upload started: %s" % [ request.header.x_mongrel2_upload_start ]
|
31
31
|
return nil # Do nothing
|
32
32
|
end
|
@@ -52,12 +52,8 @@ class AsyncUploadHandler < Mongrel2::Handler
|
|
52
52
|
|
53
53
|
### Regular request -- show the upload form.
|
54
54
|
def handle( request )
|
55
|
-
# If it's the 'upload started' notification, use that handler method
|
56
|
-
if request.upload_started?
|
57
|
-
return self.handle_upload_start( request )
|
58
|
-
|
59
55
|
# If it's a finished upload, use that handler method
|
60
|
-
|
56
|
+
if request.upload_done?
|
61
57
|
return self.handle_upload_done( request )
|
62
58
|
|
63
59
|
else
|
data/lib/mongrel2/connection.rb
CHANGED
@@ -69,12 +69,12 @@ class Mongrel2::Connection
|
|
69
69
|
self.log.debug "0mq Context is: %p" % [ ctx ]
|
70
70
|
|
71
71
|
self.log.info "Connecting PULL request socket (%s)" % [ self.sub_addr ]
|
72
|
-
@request_sock
|
72
|
+
@request_sock = ctx.socket( ZMQ::PULL )
|
73
73
|
@request_sock.setsockopt( ZMQ::LINGER, 0 )
|
74
74
|
@request_sock.connect( self.sub_addr )
|
75
75
|
|
76
76
|
self.log.info "Connecting PUB response socket (%s)" % [ self.pub_addr ]
|
77
|
-
@response_sock
|
77
|
+
@response_sock = ctx.socket( ZMQ::PUB )
|
78
78
|
@response_sock.setsockopt( ZMQ::IDENTITY, self.identifier )
|
79
79
|
@response_sock.setsockopt( ZMQ::LINGER, 0 )
|
80
80
|
@response_sock.connect( self.pub_addr )
|
data/lib/mongrel2/handler.rb
CHANGED
@@ -90,6 +90,13 @@ class Mongrel2::Handler
|
|
90
90
|
log_to :mongrel2
|
91
91
|
|
92
92
|
|
93
|
+
# Signals we handle
|
94
|
+
QUEUE_SIGS = [
|
95
|
+
:INT, :TERM, :HUP, :USR1,
|
96
|
+
# :TODO: :QUIT, :WINCH, :USR2, :TTIN, :TTOU
|
97
|
+
]
|
98
|
+
|
99
|
+
|
93
100
|
### Create an instance of the handler using the config from the database with
|
94
101
|
### the given +appid+ and run it.
|
95
102
|
def self::run( appid )
|
@@ -121,6 +128,8 @@ class Mongrel2::Handler
|
|
121
128
|
def initialize( app_id, send_spec, recv_spec ) # :notnew:
|
122
129
|
@app_id = app_id
|
123
130
|
@conn = Mongrel2::Connection.new( app_id, send_spec, recv_spec )
|
131
|
+
|
132
|
+
Thread.main[:signal_queue] = []
|
124
133
|
end
|
125
134
|
|
126
135
|
|
@@ -158,7 +167,9 @@ class Mongrel2::Handler
|
|
158
167
|
### Shut down the handler.
|
159
168
|
def shutdown
|
160
169
|
self.log.info "Shutting down."
|
170
|
+
self.ignore_signals
|
161
171
|
@conn.close
|
172
|
+
Mongrel2.zmq_context.close
|
162
173
|
end
|
163
174
|
|
164
175
|
|
@@ -176,25 +187,35 @@ class Mongrel2::Handler
|
|
176
187
|
### Start a loop, accepting a request and handling it.
|
177
188
|
def start_accepting_requests
|
178
189
|
until @conn.closed?
|
179
|
-
|
180
|
-
self.
|
181
|
-
res = self.dispatch_request( req )
|
182
|
-
|
183
|
-
if res
|
184
|
-
self.log.info( res.inspect )
|
185
|
-
@conn.reply( res ) unless @conn.closed?
|
186
|
-
end
|
190
|
+
ZMQ.select([ @conn.request_sock ])
|
191
|
+
self.accept_request unless @conn.closed?
|
187
192
|
end
|
188
193
|
rescue ZMQ::Error => err
|
194
|
+
self.process_signal_queue
|
195
|
+
|
189
196
|
unless @conn.closed?
|
190
197
|
self.log.error "%p while accepting requests: %s" % [ err.class, err.message ]
|
191
198
|
self.log.debug { err.backtrace.join("\n ") }
|
192
199
|
|
200
|
+
# Restart the method
|
193
201
|
retry
|
194
202
|
end
|
195
203
|
end
|
196
204
|
|
197
205
|
|
206
|
+
### Read a request from the connection and dispatch it.
|
207
|
+
def accept_request
|
208
|
+
req = @conn.receive
|
209
|
+
self.log.info( req.inspect )
|
210
|
+
res = self.dispatch_request( req )
|
211
|
+
|
212
|
+
if res
|
213
|
+
self.log.info( res.inspect )
|
214
|
+
@conn.reply( res ) unless @conn.closed?
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
|
198
219
|
### Invoke a handler method appropriate for the given +request+.
|
199
220
|
def dispatch_request( request )
|
200
221
|
if request.is_disconnect?
|
@@ -329,6 +350,10 @@ class Mongrel2::Handler
|
|
329
350
|
end
|
330
351
|
|
331
352
|
|
353
|
+
#########
|
354
|
+
protected
|
355
|
+
#########
|
356
|
+
|
332
357
|
#
|
333
358
|
# :section: Signal Handling
|
334
359
|
# These methods set up some behavior for starting, restarting, and stopping
|
@@ -336,43 +361,77 @@ class Mongrel2::Handler
|
|
336
361
|
# be handled, override #set_signal_handlers with an empty method.
|
337
362
|
#
|
338
363
|
|
339
|
-
### Set up signal handlers for
|
340
|
-
### #on_hangup_signal, #on_termination_signal, #on_interrupt_signal, and
|
341
|
-
### #on_user1_signal methods, respectively.
|
364
|
+
### Set up signal handlers for common signals that will shut down, restart, etc.
|
342
365
|
def set_signal_handlers
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
366
|
+
self.log.debug "Setting up deferred signal handlers."
|
367
|
+
QUEUE_SIGS.each do |sig|
|
368
|
+
Signal.trap( sig ) { Thread.main[:signal_queue] << sig }
|
369
|
+
end
|
347
370
|
end
|
348
371
|
|
349
372
|
|
350
|
-
###
|
373
|
+
### Set all signal handlers to ignore.
|
374
|
+
def ignore_signals
|
375
|
+
self.log.debug "Ignoring signals."
|
376
|
+
QUEUE_SIGS.each do |sig|
|
377
|
+
Signal.trap( sig, :IGNORE )
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
|
382
|
+
### Set the signal handlers back to their defaults.
|
351
383
|
def restore_signal_handlers
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
384
|
+
self.log.debug "Restoring default signal handlers."
|
385
|
+
QUEUE_SIGS.each do |sig|
|
386
|
+
Signal.trap( sig, :DEFAULT )
|
387
|
+
end
|
356
388
|
end
|
357
389
|
|
390
|
+
### Handle any queued signals.
|
391
|
+
def process_signal_queue
|
392
|
+
# Look for any signals that arrived and handle them
|
393
|
+
while sig = Thread.main[:signal_queue].shift
|
394
|
+
self.handle_signal( sig )
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
|
399
|
+
### Handle signals.
|
400
|
+
def handle_signal( sig )
|
401
|
+
self.log.debug "Handling signal %s" % [ sig ]
|
402
|
+
case sig
|
403
|
+
when :INT, :TERM
|
404
|
+
self.on_termination_signal( sig )
|
405
|
+
|
406
|
+
when :HUP
|
407
|
+
self.on_hangup_signal( sig )
|
408
|
+
|
409
|
+
when :USR1
|
410
|
+
self.on_user1_signal( sig )
|
411
|
+
|
412
|
+
else
|
413
|
+
self.log.warn "Unhandled signal %s" % [ sig ]
|
414
|
+
end
|
358
415
|
|
359
|
-
### Handle a HUP signal. The default is to restart the handler.
|
360
|
-
def on_hangup_signal( signo )
|
361
|
-
self.log.warn "Hangup: reconnecting."
|
362
|
-
self.restart
|
363
416
|
end
|
364
417
|
|
365
418
|
|
366
419
|
### Handle a TERM signal. Shuts the handler down after handling any current request/s. Also
|
367
420
|
### aliased to #on_interrupt_signal.
|
368
421
|
def on_termination_signal( signo )
|
369
|
-
self.log.warn "
|
370
|
-
[ Thread.current, Thread.main ]
|
422
|
+
self.log.warn "Terminated (%p)" % [ signo ]
|
371
423
|
self.shutdown
|
372
424
|
end
|
373
425
|
alias_method :on_interrupt_signal, :on_termination_signal
|
374
426
|
|
375
427
|
|
428
|
+
### Handle a HUP signal. The default is to restart the handler.
|
429
|
+
def on_hangup_signal( signo )
|
430
|
+
self.log.warn "Hangup (%p)" % [ signo ]
|
431
|
+
self.restart
|
432
|
+
end
|
433
|
+
|
434
|
+
|
376
435
|
### Handle a USR1 signal. Writes a message to the log by default.
|
377
436
|
def on_user1_signal( signo )
|
378
437
|
self.log.info "Checkpoint: User signal."
|
data/lib/mongrel2/request.rb
CHANGED
@@ -27,8 +27,8 @@ class Mongrel2::Request
|
|
27
27
|
### request object.
|
28
28
|
def self::parse( raw_request )
|
29
29
|
sender, conn_id, path, rest = raw_request.split( ' ', 4 )
|
30
|
-
self.log.debug "Parsing request for %p from %s:%s (rest: %p)" %
|
31
|
-
[ path, sender, conn_id, rest ]
|
30
|
+
self.log.debug "Parsing request for %p from %s:%s (rest: %p...)" %
|
31
|
+
[ path, sender, conn_id, rest[0,20] ]
|
32
32
|
|
33
33
|
# Extract the headers and the body, ignore the rest
|
34
34
|
headers, rest = TNetstring.parse( rest )
|
data/lib/mongrel2.rb
CHANGED
@@ -20,10 +20,10 @@ module Mongrel2
|
|
20
20
|
abort "\n\n>>> Mongrel2 requires Ruby 1.9.2 or later. <<<\n\n" if RUBY_VERSION < '1.9.2'
|
21
21
|
|
22
22
|
# Library version constant
|
23
|
-
VERSION = '0.
|
23
|
+
VERSION = '0.33.0'
|
24
24
|
|
25
25
|
# Version-control revision constant
|
26
|
-
REVISION = %q$Revision:
|
26
|
+
REVISION = %q$Revision: 8703559eacf1 $
|
27
27
|
|
28
28
|
|
29
29
|
require 'mongrel2/constants'
|
data/spec/lib/helpers.rb
CHANGED
@@ -39,6 +39,8 @@ require 'mongrel2'
|
|
39
39
|
require 'mongrel2/config'
|
40
40
|
require 'mongrel2/testing'
|
41
41
|
|
42
|
+
require 'loggability/spechelpers'
|
43
|
+
|
42
44
|
require 'sequel'
|
43
45
|
require 'sequel/model'
|
44
46
|
|
@@ -60,30 +62,6 @@ module Mongrel2::SpecHelpers
|
|
60
62
|
end
|
61
63
|
|
62
64
|
|
63
|
-
### Reset the logging subsystem to its default state.
|
64
|
-
def reset_logging
|
65
|
-
Loggability.formatter = nil
|
66
|
-
Loggability.output_to( $stderr )
|
67
|
-
Loggability.level = :fatal
|
68
|
-
end
|
69
|
-
|
70
|
-
|
71
|
-
### Alter the output of the default log formatter to be pretty in SpecMate output
|
72
|
-
def setup_logging( level=:fatal )
|
73
|
-
|
74
|
-
# Only do this when executing from a spec in TextMate
|
75
|
-
if ENV['HTML_LOGGING'] || (ENV['TM_FILENAME'] && ENV['TM_FILENAME'] =~ /_spec\.rb/)
|
76
|
-
logarray = []
|
77
|
-
Thread.current['logger-output'] = logarray
|
78
|
-
Loggability.output_to( logarray )
|
79
|
-
Loggability.format_as( :html )
|
80
|
-
Loggability.level = :debug
|
81
|
-
else
|
82
|
-
Loggability.level = level
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
|
87
65
|
### Set up a Mongrel2 configuration database in memory.
|
88
66
|
def setup_config_db
|
89
67
|
Mongrel2::Config.db ||= Mongrel2::Config.in_memory_db
|
@@ -254,6 +232,7 @@ RSpec.configure do |c|
|
|
254
232
|
c.include( Mongrel2::TestConstants )
|
255
233
|
c.include( Mongrel2::SpecHelpers )
|
256
234
|
c.include( Mongrel2::Matchers )
|
235
|
+
c.include( Loggability::SpecHelpers )
|
257
236
|
|
258
237
|
c.include( Mongrel2::Config::DSL )
|
259
238
|
end
|
@@ -58,13 +58,15 @@ describe Mongrel2::Handler do
|
|
58
58
|
|
59
59
|
# Ensure 0MQ never actually gets called
|
60
60
|
before( :each ) do
|
61
|
-
@ctx = double(
|
62
|
-
@request_sock = double( "request socket", :
|
63
|
-
@response_sock = double( "response socket", :
|
61
|
+
@ctx = double( '0mq context', close: nil )
|
62
|
+
@request_sock = double( "request socket", setsockopt: nil, connect: nil, close: nil )
|
63
|
+
@response_sock = double( "response socket", setsockopt: nil, connect: nil, close: nil )
|
64
64
|
|
65
65
|
@ctx.stub( :socket ).with( ZMQ::PULL ).and_return( @request_sock )
|
66
66
|
@ctx.stub( :socket ).with( ZMQ::PUB ).and_return( @response_sock )
|
67
67
|
|
68
|
+
ZMQ.stub( :select ).and_return([ [@request_sock], [], [] ])
|
69
|
+
|
68
70
|
Mongrel2.instance_variable_set( :@zmq_ctx, @ctx )
|
69
71
|
end
|
70
72
|
|
data.tar.gz.sig
CHANGED
Binary file
|
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.33.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -36,7 +36,7 @@ cert_chain:
|
|
36
36
|
YUhDS0xaZFNLai9SSHVUT3QrZ2JsUmV4OEZBaDhOZUEKY21saFhlNDZwWk5K
|
37
37
|
Z1dLYnhaYWg4NWpJang5NWhSOHZPSStOQU01aUg5a09xSzEzRHJ4YWNUS1Bo
|
38
38
|
cWo1UGp3RgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
|
39
|
-
date: 2012-
|
39
|
+
date: 2012-10-03 00:00:00.000000000 Z
|
40
40
|
dependencies:
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: nokogiri
|
metadata.gz.sig
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
�
|
1
|
+
7�=�Սq��~5گ<����Hz/����P����{t�����
|
2
|
+
�$ÂF��s'>�w��
|
3
|
+
��^�j�@*Y�'+�;<���^���v�+h��9fc2[*s��og3y���j�d@�Z����1��E?��W4�������'���ʬ"��*�O�
|