mongrel2 0.21.0 → 0.22.1
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 +55 -1
- data/History.rdoc +12 -0
- data/Manifest.txt +0 -4
- data/Rakefile +2 -1
- data/bin/m2sh.rb +22 -9
- data/examples/helloworld-handler.rb +3 -3
- data/examples/request-dumper.rb +3 -3
- data/examples/ws-echo.rb +3 -3
- data/lib/mongrel2.rb +9 -6
- data/lib/mongrel2/config.rb +14 -10
- data/lib/mongrel2/config/dsl.rb +7 -2
- data/lib/mongrel2/config/host.rb +3 -3
- data/lib/mongrel2/config/server.rb +6 -6
- data/lib/mongrel2/connection.rb +5 -2
- data/lib/mongrel2/control.rb +6 -2
- data/lib/mongrel2/handler.rb +11 -6
- data/lib/mongrel2/httprequest.rb +8 -3
- data/lib/mongrel2/httpresponse.rb +6 -3
- data/lib/mongrel2/jsonrequest.rb +6 -2
- data/lib/mongrel2/request.rb +10 -8
- data/lib/mongrel2/response.rb +6 -3
- data/lib/mongrel2/table.rb +8 -5
- data/lib/mongrel2/testing.rb +10 -1
- data/lib/mongrel2/websocket.rb +1 -2
- data/lib/mongrel2/xmlrequest.rb +6 -2
- data/spec/lib/helpers.rb +11 -43
- data/spec/mongrel2/handler_spec.rb +0 -5
- data/spec/mongrel2_spec.rb +1 -1
- metadata +23 -11
- metadata.gz.sig +0 -0
- data/lib/mongrel2/logging.rb +0 -241
- data/lib/mongrel2/mixins.rb +0 -143
- data/spec/mongrel2/logging_spec.rb +0 -76
- data/spec/mongrel2/mixins_spec.rb +0 -62
data/lib/mongrel2/connection.rb
CHANGED
@@ -4,9 +4,9 @@ require 'socket'
|
|
4
4
|
require 'zmq'
|
5
5
|
require 'yajl'
|
6
6
|
require 'digest/sha1'
|
7
|
+
require 'loggability'
|
7
8
|
|
8
9
|
require 'mongrel2' unless defined?( Mongrel2 )
|
9
|
-
require 'mongrel2/mixins'
|
10
10
|
|
11
11
|
|
12
12
|
# The Mongrel2 connection class. Connection objects serve as a front end for
|
@@ -17,7 +17,10 @@ require 'mongrel2/mixins'
|
|
17
17
|
# == References
|
18
18
|
# * http://mongrel2.org/static/mongrel2-manual.html#x1-700005.3
|
19
19
|
class Mongrel2::Connection
|
20
|
-
|
20
|
+
extend Loggability
|
21
|
+
|
22
|
+
# Loggability API -- set up logging under the 'mongrel2' log host
|
23
|
+
log_to :mongrel2
|
21
24
|
|
22
25
|
|
23
26
|
### Create a new Connection identified by +app_id+ (a UUID or other unique string) that
|
data/lib/mongrel2/control.rb
CHANGED
@@ -3,9 +3,9 @@
|
|
3
3
|
require 'zmq'
|
4
4
|
require 'yajl'
|
5
5
|
require 'tnetstring'
|
6
|
+
require 'loggability'
|
6
7
|
|
7
8
|
require 'mongrel2' unless defined?( Mongrel2 )
|
8
|
-
require 'mongrel2/mixins'
|
9
9
|
|
10
10
|
|
11
11
|
# An interface to the Mongrel2 control port.
|
@@ -13,7 +13,11 @@ require 'mongrel2/mixins'
|
|
13
13
|
# == References
|
14
14
|
# (http://mongrel2.org/static/mongrel2-manual.html#x1-380003.8)
|
15
15
|
class Mongrel2::Control
|
16
|
-
|
16
|
+
extend Loggability
|
17
|
+
|
18
|
+
# Loggability API -- set up logging under the 'mongrel2' log host
|
19
|
+
log_to :mongrel2
|
20
|
+
|
17
21
|
|
18
22
|
# The default zmq connection spec to use when talking to a mongrel2 server
|
19
23
|
DEFAULT_PORT = 'ipc://run/control'
|
data/lib/mongrel2/handler.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'zmq'
|
4
|
+
require 'loggability'
|
4
5
|
|
5
6
|
require 'mongrel2' unless defined?( Mongrel2 )
|
6
7
|
require 'mongrel2/config'
|
@@ -81,16 +82,20 @@ require 'mongrel2/websocket'
|
|
81
82
|
# app.run
|
82
83
|
#
|
83
84
|
class Mongrel2::Handler
|
84
|
-
|
85
|
-
|
85
|
+
extend Loggability
|
86
|
+
include Mongrel2::Constants
|
87
|
+
|
88
|
+
|
89
|
+
# Loggability API -- set up logging under the 'mongrel2' log host
|
90
|
+
log_to :mongrel2
|
86
91
|
|
87
92
|
|
88
93
|
### Create an instance of the handler using the config from the database with
|
89
94
|
### the given +appid+ and run it.
|
90
95
|
def self::run( appid )
|
91
|
-
|
96
|
+
self.log.info "Running application %p" % [ appid ]
|
92
97
|
send_spec, recv_spec = self.connection_info_for( appid )
|
93
|
-
|
98
|
+
self.log.info " config specs: %s <-> %s" % [ send_spec, recv_spec ]
|
94
99
|
new( appid, send_spec, recv_spec ).run
|
95
100
|
end
|
96
101
|
|
@@ -98,11 +103,11 @@ class Mongrel2::Handler
|
|
98
103
|
### Return the send_spec and recv_spec for the given +appid+ from the current configuration
|
99
104
|
### database. Returns +nil+ if no Handler is configured with +appid+ as its +sender_id+.
|
100
105
|
def self::connection_info_for( appid )
|
101
|
-
|
106
|
+
self.log.debug "Looking up handler spec for appid %p" % [ appid ]
|
102
107
|
hconfig = Mongrel2::Config::Handler.by_send_ident( appid ).first or
|
103
108
|
raise ArgumentError, "no handler with a send_ident of %p configured" % [ appid ]
|
104
109
|
|
105
|
-
|
110
|
+
self.log.debug " found: %s" % [ hconfig.values ]
|
106
111
|
return hconfig.send_spec, hconfig.recv_spec
|
107
112
|
end
|
108
113
|
|
data/lib/mongrel2/httprequest.rb
CHANGED
@@ -1,19 +1,24 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
|
+
require 'ipaddr'
|
4
|
+
require 'loggability'
|
5
|
+
|
3
6
|
require 'mongrel2/request' unless defined?( Mongrel2::Request )
|
4
|
-
require 'mongrel2/mixins'
|
5
7
|
require 'mongrel2/httpresponse'
|
6
|
-
require 'ipaddr'
|
7
8
|
|
8
9
|
|
9
10
|
# The Mongrel2 HTTP Request class. Instances of this class represent an HTTP request from
|
10
11
|
# a Mongrel2 server.
|
11
12
|
class Mongrel2::HTTPRequest < Mongrel2::Request
|
12
|
-
|
13
|
+
extend Loggability
|
14
|
+
|
15
|
+
# Loggability API -- set up logging under the 'mongrel2' log host
|
16
|
+
log_to :mongrel2
|
13
17
|
|
14
18
|
# HTTP verbs from RFC2616
|
15
19
|
HANDLED_HTTP_METHODS = [ :OPTIONS, :GET, :HEAD, :POST, :PUT, :DELETE, :TRACE, :CONNECT ]
|
16
20
|
|
21
|
+
# Mongrel2::Request API -- register this class as handling the HTTP verbs
|
17
22
|
register_request_type( self, *HANDLED_HTTP_METHODS )
|
18
23
|
|
19
24
|
|
@@ -2,16 +2,19 @@
|
|
2
2
|
#encoding: utf-8
|
3
3
|
|
4
4
|
require 'time'
|
5
|
+
require 'loggability'
|
5
6
|
|
6
7
|
require 'mongrel2/response' unless defined?( Mongrel2::Response )
|
7
|
-
require 'mongrel2/mixins'
|
8
8
|
require 'mongrel2/constants'
|
9
9
|
|
10
10
|
|
11
11
|
# The Mongrel2 HTTP Response class.
|
12
12
|
class Mongrel2::HTTPResponse < Mongrel2::Response
|
13
|
-
|
14
|
-
|
13
|
+
extend Loggability
|
14
|
+
include Mongrel2::Constants
|
15
|
+
|
16
|
+
# Loggability API -- set up logging under the 'mongrel2' log host
|
17
|
+
log_to :mongrel2
|
15
18
|
|
16
19
|
# The format for building valid HTTP responses
|
17
20
|
STATUS_LINE_FORMAT = "HTTP/1.1 %03d %s".freeze
|
data/lib/mongrel2/jsonrequest.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
3
|
require 'yajl'
|
4
|
+
require 'loggability'
|
4
5
|
|
5
6
|
require 'mongrel2/request' unless defined?( Mongrel2::Request )
|
6
|
-
require 'mongrel2/mixins'
|
7
7
|
|
8
8
|
|
9
9
|
# The Mongrel2 JSON Request class. Instances of this class represent a JSSocket request from
|
10
10
|
# a Mongrel2 server.
|
11
11
|
class Mongrel2::JSONRequest < Mongrel2::Request
|
12
|
-
|
12
|
+
extend Loggability
|
13
13
|
|
14
|
+
# Loggability API -- set up logging under the 'mongrel2' log host
|
15
|
+
log_to :mongrel2
|
16
|
+
|
17
|
+
# Mongrel2::Request API -- register this request type as handling 'JSON' requests
|
14
18
|
register_request_type( self, :JSON )
|
15
19
|
|
16
20
|
|
data/lib/mongrel2/request.rb
CHANGED
@@ -2,17 +2,19 @@
|
|
2
2
|
|
3
3
|
require 'tnetstring'
|
4
4
|
require 'yajl'
|
5
|
+
require 'loggability'
|
5
6
|
|
6
7
|
require 'mongrel2' unless defined?( Mongrel2 )
|
7
|
-
require 'mongrel2/mixins'
|
8
8
|
require 'mongrel2/table'
|
9
9
|
|
10
10
|
|
11
11
|
# The Mongrel2 Request base class. Derivatives of this class represent a request from
|
12
12
|
# a Mongrel2 server.
|
13
13
|
class Mongrel2::Request
|
14
|
-
|
14
|
+
extend Loggability
|
15
15
|
|
16
|
+
# Loggability API -- set up logging under the 'mongrel2' log host
|
17
|
+
log_to :mongrel2
|
16
18
|
|
17
19
|
# METHOD header -> request class mapping
|
18
20
|
@request_types = Hash.new {|h,k| h[k] = Mongrel2::Request }
|
@@ -23,7 +25,7 @@ class Mongrel2::Request
|
|
23
25
|
### request object.
|
24
26
|
def self::parse( raw_request )
|
25
27
|
sender, conn_id, path, rest = raw_request.split( ' ', 4 )
|
26
|
-
|
28
|
+
self.log.debug "Parsing request for %p from %s:%s (rest: %p)" %
|
27
29
|
[ path, sender, conn_id, rest ]
|
28
30
|
|
29
31
|
# Extract the headers and the body, ignore the rest
|
@@ -32,7 +34,7 @@ class Mongrel2::Request
|
|
32
34
|
|
33
35
|
# Headers will be a JSON String when not using the TNetString protocol
|
34
36
|
if headers.is_a?( String )
|
35
|
-
|
37
|
+
self.log.debug " parsing old-style headers"
|
36
38
|
headers = Yajl::Parser.parse( headers )
|
37
39
|
end
|
38
40
|
|
@@ -40,7 +42,7 @@ class Mongrel2::Request
|
|
40
42
|
headers['METHOD'] =~ /^(\w+)$/ or
|
41
43
|
raise Mongrel2::UnhandledMethodError, headers['METHOD']
|
42
44
|
req_method = $1.untaint.to_sym
|
43
|
-
|
45
|
+
self.log.debug "Request method is: %p" % [ req_method ]
|
44
46
|
concrete_class = self.subclass_for_method( req_method )
|
45
47
|
|
46
48
|
return concrete_class.new( sender, conn_id, path, headers, body, raw_request )
|
@@ -72,15 +74,15 @@ class Mongrel2::Request
|
|
72
74
|
### If you wish one of your subclasses to be used instead of Mongrel2::Request
|
73
75
|
### for the default request class, register it with a METHOD of :__default.
|
74
76
|
def self::register_request_type( subclass, *req_methods )
|
75
|
-
|
77
|
+
self.log.debug "Registering %p for %p requests" % [ subclass, req_methods ]
|
76
78
|
req_methods.each do |methname|
|
77
79
|
if methname == :__default
|
78
80
|
# Clear cached lookups
|
79
|
-
|
81
|
+
self.log.info "Registering %p as the default request type." % [ subclass ]
|
80
82
|
Mongrel2::Request.request_types.delete_if {|_, klass| klass == Mongrel2::Request }
|
81
83
|
Mongrel2::Request.request_types.default_proc = lambda {|h,k| h[k] = subclass }
|
82
84
|
else
|
83
|
-
|
85
|
+
self.log.info "Registering %p for the %p method." % [ subclass, methname ]
|
84
86
|
Mongrel2::Request.request_types[ methname.to_sym ] = subclass
|
85
87
|
end
|
86
88
|
end
|
data/lib/mongrel2/response.rb
CHANGED
@@ -2,14 +2,17 @@
|
|
2
2
|
|
3
3
|
require 'tnetstring'
|
4
4
|
require 'yajl'
|
5
|
+
require 'loggability'
|
5
6
|
|
6
7
|
require 'mongrel2' unless defined?( Mongrel2 )
|
7
|
-
require 'mongrel2/mixins'
|
8
8
|
|
9
9
|
|
10
10
|
# The Mongrel2 Response base class.
|
11
11
|
class Mongrel2::Response
|
12
|
-
|
12
|
+
extend Loggability
|
13
|
+
|
14
|
+
# Loggability API -- set up logging under the 'mongrel2' log host
|
15
|
+
log_to :mongrel2
|
13
16
|
|
14
17
|
# The default number of bytes of the response body to send to the mongrel2
|
15
18
|
# server at a time.
|
@@ -18,7 +21,7 @@ class Mongrel2::Response
|
|
18
21
|
|
19
22
|
### Create a response to the specified +request+ and return it.
|
20
23
|
def self::from_request( request )
|
21
|
-
|
24
|
+
self.log.debug "Creating a %p to request %p" % [ self, request ]
|
22
25
|
response = new( request.sender_id, request.conn_id )
|
23
26
|
response.request = request
|
24
27
|
|
data/lib/mongrel2/table.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
3
|
require 'forwardable'
|
4
|
+
require 'loggability'
|
4
5
|
|
5
6
|
require 'mongrel2' unless defined?( Mongrel2 )
|
6
|
-
require 'mongrel2/mixins'
|
7
7
|
|
8
8
|
|
9
9
|
# The Mongrel2 Table class. Instances of this class provide a case-insensitive hash-like
|
@@ -14,15 +14,18 @@ require 'mongrel2/mixins'
|
|
14
14
|
# headers['user-agent'] # => 'PornBrowser 1.1.5'
|
15
15
|
# headers[:user_agent] # => 'PornBrowser 1.1.5'
|
16
16
|
# headers.user_agent # => 'PornBrowser 1.1.5'
|
17
|
-
#
|
17
|
+
#
|
18
18
|
# == Author/s
|
19
|
-
#
|
19
|
+
#
|
20
20
|
# * Michael Granger <ged@FaerieMUD.org>
|
21
21
|
# * Mahlon E. Smith <mahlon@martini.nu>
|
22
22
|
#
|
23
23
|
class Mongrel2::Table
|
24
|
-
extend Forwardable
|
25
|
-
|
24
|
+
extend Forwardable,
|
25
|
+
Loggability
|
26
|
+
|
27
|
+
# Loggability API -- set up logging under the 'mongrel2' log host
|
28
|
+
log_to :mongrel2
|
26
29
|
|
27
30
|
# Methods that understand case-insensitive keys
|
28
31
|
KEYED_METHODS = [ :"[]", :"[]=", :delete, :fetch, :has_key?, :include?, :member?, :store ]
|
data/lib/mongrel2/testing.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'uri'
|
4
4
|
require 'pathname'
|
5
|
+
require 'loggability'
|
5
6
|
require 'mongrel2'
|
6
7
|
require 'mongrel2/request'
|
7
8
|
|
@@ -19,6 +20,10 @@ module Mongrel2
|
|
19
20
|
|
20
21
|
### A factory for generating Mongrel2::Request objects for testing.
|
21
22
|
class RequestFactory
|
23
|
+
extend Loggability
|
24
|
+
|
25
|
+
# Loggability API -- set up logging under the 'mongrel2' log host
|
26
|
+
log_to :mongrel2
|
22
27
|
|
23
28
|
# Default testing UUID (sender_id)
|
24
29
|
DEFAULT_TEST_UUID = 'BD17D85C-4730-4BF2-999D-9D2B2E0FCCF9'
|
@@ -217,8 +222,12 @@ module Mongrel2
|
|
217
222
|
|
218
223
|
### A factory for generating WebSocket request objects for testing.
|
219
224
|
class WebSocketFrameFactory < Mongrel2::RequestFactory
|
225
|
+
extend Loggability
|
220
226
|
include Mongrel2::Constants
|
221
227
|
|
228
|
+
# Loggability API -- set up logging under the 'mongrel2' log host
|
229
|
+
log_to :mongrel2
|
230
|
+
|
222
231
|
# The default host
|
223
232
|
DEFAULT_TESTING_HOST = 'localhost'
|
224
233
|
DEFAULT_TESTING_PORT = '8113'
|
@@ -371,7 +380,7 @@ module Mongrel2
|
|
371
380
|
flag_symbols.flatten!
|
372
381
|
flag_symbols.compact!
|
373
382
|
|
374
|
-
|
383
|
+
self.log.debug "Making a flags header for symbols: %p" % [ flag_symbols ]
|
375
384
|
|
376
385
|
return flag_symbols.inject( 0x00 ) do |flags, flag|
|
377
386
|
case flag
|
data/lib/mongrel2/websocket.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
3
|
require 'mongrel2/request' unless defined?( Mongrel2::Request )
|
4
|
-
require 'mongrel2/mixins'
|
5
4
|
require 'mongrel2/constants'
|
6
5
|
|
7
6
|
|
@@ -211,7 +210,7 @@ module Mongrel2::WebSocket
|
|
211
210
|
|
212
211
|
### Create a response frame from the given request +frame+.
|
213
212
|
def self::from_request( frame )
|
214
|
-
|
213
|
+
self.log.debug "Creating a %p response to request %p" % [ self, frame ]
|
215
214
|
response = new( frame.sender_id, frame.conn_id, frame.path )
|
216
215
|
response.request_frame = frame
|
217
216
|
|
data/lib/mongrel2/xmlrequest.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
3
|
require 'nokogiri'
|
4
|
+
require 'loggability'
|
4
5
|
|
5
6
|
require 'mongrel2/request' unless defined?( Mongrel2::Request )
|
6
|
-
require 'mongrel2/mixins'
|
7
7
|
|
8
8
|
|
9
9
|
# The Mongrel2 XML Request class. Instances of this class represent a request for an XML route from
|
10
10
|
# a Mongrel2 server.
|
11
11
|
class Mongrel2::XMLRequest < Mongrel2::Request
|
12
|
-
|
12
|
+
extend Loggability
|
13
13
|
|
14
|
+
# Loggability API -- set up logging under the 'mongrel2' log host
|
15
|
+
log_to :mongrel2
|
16
|
+
|
17
|
+
# Mongrel2::Request API -- register this class as handling 'XML' requests
|
14
18
|
register_request_type( self, :XML )
|
15
19
|
|
16
20
|
|
data/spec/lib/helpers.rb
CHANGED
@@ -50,33 +50,6 @@ require 'spec/lib/matchers'
|
|
50
50
|
module Mongrel2::SpecHelpers
|
51
51
|
include Mongrel2::TestConstants
|
52
52
|
|
53
|
-
class ArrayLogger
|
54
|
-
### Create a new ArrayLogger that will append content to +array+.
|
55
|
-
def initialize( array )
|
56
|
-
@array = array
|
57
|
-
end
|
58
|
-
|
59
|
-
### Write the specified +message+ to the array.
|
60
|
-
def write( message )
|
61
|
-
@array << message
|
62
|
-
end
|
63
|
-
|
64
|
-
### No-op -- this is here just so Logger doesn't complain
|
65
|
-
def close; end
|
66
|
-
|
67
|
-
end # class ArrayLogger
|
68
|
-
|
69
|
-
|
70
|
-
unless defined?( LEVEL )
|
71
|
-
LEVEL = {
|
72
|
-
:debug => Logger::DEBUG,
|
73
|
-
:info => Logger::INFO,
|
74
|
-
:warn => Logger::WARN,
|
75
|
-
:error => Logger::ERROR,
|
76
|
-
:fatal => Logger::FATAL,
|
77
|
-
}
|
78
|
-
end
|
79
|
-
|
80
53
|
###############
|
81
54
|
module_function
|
82
55
|
###############
|
@@ -89,29 +62,24 @@ module Mongrel2::SpecHelpers
|
|
89
62
|
|
90
63
|
### Reset the logging subsystem to its default state.
|
91
64
|
def reset_logging
|
92
|
-
|
65
|
+
Loggability.formatter = nil
|
66
|
+
Loggability.output_to( $stderr )
|
67
|
+
Loggability.level = :fatal
|
93
68
|
end
|
94
69
|
|
95
70
|
|
96
71
|
### Alter the output of the default log formatter to be pretty in SpecMate output
|
97
|
-
def setup_logging( level
|
98
|
-
|
99
|
-
# Turn symbol-style level config into Logger's expected Fixnum level
|
100
|
-
if Mongrel2::Logging::LOG_LEVELS.key?( level.to_s )
|
101
|
-
level = Mongrel2::Logging::LOG_LEVELS[ level.to_s ]
|
102
|
-
end
|
103
|
-
|
104
|
-
logger = Logger.new( $stderr )
|
105
|
-
Mongrel2.logger = logger
|
106
|
-
Mongrel2.logger.level = level
|
72
|
+
def setup_logging( level=:fatal )
|
107
73
|
|
108
74
|
# Only do this when executing from a spec in TextMate
|
109
75
|
if ENV['HTML_LOGGING'] || (ENV['TM_FILENAME'] && ENV['TM_FILENAME'] =~ /_spec\.rb/)
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
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
|
115
83
|
end
|
116
84
|
end
|
117
85
|
|