mongrel2 0.48.0 → 0.49.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/ChangeLog +10 -2
- data/History.rdoc +7 -0
- data/Manifest.txt +0 -16
- data/README.rdoc +0 -4
- data/Rakefile +7 -7
- data/lib/mongrel2.rb +3 -28
- data/lib/mongrel2/connection.rb +9 -11
- data/lib/mongrel2/control.rb +6 -7
- data/lib/mongrel2/handler.rb +50 -18
- data/spec/mongrel2/connection_spec.rb +28 -50
- data/spec/mongrel2/control_spec.rb +49 -48
- data/spec/mongrel2/handler_spec.rb +52 -31
- metadata +54 -66
- metadata.gz.sig +4 -3
- data/data/mongrel2/bootstrap.html +0 -33
- data/data/mongrel2/config.rb.in +0 -71
- data/data/mongrel2/css/master.css +0 -77
- data/data/mongrel2/index.html.in +0 -51
- data/data/mongrel2/js/websock-test.js +0 -108
- data/data/mongrel2/websock-test.html +0 -33
- data/examples/Procfile +0 -7
- data/examples/README.txt +0 -6
- data/examples/async-upload.rb +0 -109
- data/examples/config.rb +0 -63
- data/examples/helloworld-handler.rb +0 -33
- data/examples/request-dumper.rb +0 -49
- data/examples/request-dumper.tmpl +0 -78
- data/examples/run +0 -22
- data/examples/sendfile.rb +0 -39
- data/examples/ws-echo.rb +0 -263
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 944abee18512b2a14ea074675313be9c301e3960
|
4
|
+
data.tar.gz: d46b4b9b56a054bb195f4a42bf14b08f69164768
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c4efad71c6dde2c3a8b15951c5651c6ac4bf2e37ff157b4b6f385f2ab0b0c0c9ee31714ef50f3926e987d079416c218b0aca38a3304624e787cdfaf7b201c26
|
7
|
+
data.tar.gz: eef053a14975b06e55e4ce1c459d56adbf5592a4668a4c2571f6cb2d47789211497ca283ddbe72369325abd761c175f6b755734c18394222467663fab2dae459
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/ChangeLog
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
2016-11-23 Mahlon E. Smith <mahlon@martini.nu>
|
2
2
|
|
3
|
+
* .hgtags:
|
4
|
+
Added tag v0.47.0 for changeset 3298fb41de78
|
5
|
+
[b01f4b4e8c2f] [tip]
|
6
|
+
|
7
|
+
* .hgsigs:
|
8
|
+
Added signature for changeset c4ae80fe8067
|
9
|
+
[3298fb41de78] [v0.47.0]
|
10
|
+
|
3
11
|
* History.rdoc, lib/mongrel2.rb:
|
4
12
|
Bump version, update History.
|
5
|
-
[c4ae80fe8067]
|
13
|
+
[c4ae80fe8067]
|
6
14
|
|
7
15
|
* lib/mongrel2/handler.rb, spec/mongrel2/handler_spec.rb:
|
8
16
|
Rather than waiting for GC to free up a descriptor, close spooled
|
@@ -13,7 +21,7 @@
|
|
13
21
|
|
14
22
|
* .hgtags:
|
15
23
|
Added tag v0.46.0 for changeset e7c165fb6bb2
|
16
|
-
[7f3c8162e5ef]
|
24
|
+
[7f3c8162e5ef] [github/master]
|
17
25
|
|
18
26
|
* .hgsigs:
|
19
27
|
Added signature for changeset a28294965462
|
data/History.rdoc
CHANGED
data/Manifest.txt
CHANGED
@@ -8,24 +8,8 @@ Manifest.txt
|
|
8
8
|
README.rdoc
|
9
9
|
Rakefile
|
10
10
|
bin/m2sh.rb
|
11
|
-
data/mongrel2/bootstrap.html
|
12
|
-
data/mongrel2/config.rb.in
|
13
11
|
data/mongrel2/config.sql
|
14
|
-
data/mongrel2/css/master.css
|
15
|
-
data/mongrel2/index.html.in
|
16
|
-
data/mongrel2/js/websock-test.js
|
17
12
|
data/mongrel2/mimetypes.sql
|
18
|
-
data/mongrel2/websock-test.html
|
19
|
-
examples/Procfile
|
20
|
-
examples/README.txt
|
21
|
-
examples/async-upload.rb
|
22
|
-
examples/config.rb
|
23
|
-
examples/helloworld-handler.rb
|
24
|
-
examples/request-dumper.rb
|
25
|
-
examples/request-dumper.tmpl
|
26
|
-
examples/run
|
27
|
-
examples/sendfile.rb
|
28
|
-
examples/ws-echo.rb
|
29
13
|
lib/mongrel2.rb
|
30
14
|
lib/mongrel2/config.rb
|
31
15
|
lib/mongrel2/config/directory.rb
|
data/README.rdoc
CHANGED
@@ -155,10 +155,6 @@ and generate the API documentation.
|
|
155
155
|
There are two other Mongrel2 Ruby libraries, +m2r+ +rack-mongrel2+.
|
156
156
|
This implementation differs from them in several ways:
|
157
157
|
|
158
|
-
* It uses a C extension for 0MQ (rbczmq) instead of the FFI one. If you
|
159
|
-
strongly prefer the FFI library, both of the other Mongrel2 libraries use
|
160
|
-
it, so you'll want to stick to one of them.
|
161
|
-
|
162
158
|
* It doesn't come with a Rack handler, or Rails examples, or anything too
|
163
159
|
fancy. I intend to build my own webby framework bits around Mongrel2, and
|
164
160
|
I thought maybe someone else might want to as well. If you don't, well
|
data/Rakefile
CHANGED
@@ -25,15 +25,15 @@ hoespec = Hoe.spec 'mongrel2' do
|
|
25
25
|
|
26
26
|
self.developer 'Michael Granger', 'ged@FaerieMUD.org'
|
27
27
|
|
28
|
+
self.dependency 'cztop', '~> 0.11'
|
29
|
+
self.dependency 'libxml-ruby', '~> 2.7'
|
30
|
+
self.dependency 'loggability', '~> 0.12'
|
28
31
|
self.dependency 'sequel', '~> 4.2'
|
32
|
+
self.dependency 'sqlite3', '~> 1.3'
|
33
|
+
self.dependency 'sysexits', '~> 1.1'
|
29
34
|
self.dependency 'tnetstring', '~> 0.3'
|
30
|
-
self.dependency 'yajl-ruby', '~> 1.0'
|
31
35
|
self.dependency 'trollop', '~> 2.0'
|
32
|
-
self.dependency '
|
33
|
-
self.dependency 'rbczmq', '~> 1.7'
|
34
|
-
self.dependency 'loggability', '~> 0.11'
|
35
|
-
self.dependency 'sqlite3', '~> 1.3'
|
36
|
-
self.dependency 'libxml-ruby', '~> 2.7'
|
36
|
+
self.dependency 'yajl-ruby', '~> 1.0'
|
37
37
|
|
38
38
|
self.dependency 'amalgalite', '~> 1.5', :developer
|
39
39
|
self.dependency 'configurability', '~> 3.1', :developer
|
@@ -76,7 +76,7 @@ if File.directory?( '.hg' )
|
|
76
76
|
end
|
77
77
|
|
78
78
|
task :gemspec => GEMSPEC
|
79
|
-
file GEMSPEC => __FILE__
|
79
|
+
file GEMSPEC => [ __FILE__, 'Manifest.txt' ]
|
80
80
|
task GEMSPEC do |task|
|
81
81
|
spec = $hoespec.spec
|
82
82
|
spec.files.delete( '.gemtest' )
|
data/lib/mongrel2.rb
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
#encoding: utf-8
|
3
3
|
|
4
|
-
# Ensure this is used instead of 'zmq' if it's also installed
|
5
|
-
gem 'rbczmq'
|
6
|
-
|
7
4
|
require 'loggability'
|
8
|
-
require '
|
5
|
+
require 'cztop'
|
9
6
|
|
10
7
|
#
|
11
8
|
# A Mongrel2 connector and configuration library for Ruby.
|
@@ -25,10 +22,10 @@ module Mongrel2
|
|
25
22
|
abort "\n\n>>> Mongrel2 requires Ruby 2.2 or later. <<<\n\n" if RUBY_VERSION < '2.2.0'
|
26
23
|
|
27
24
|
# Library version constant
|
28
|
-
VERSION = '0.
|
25
|
+
VERSION = '0.49.0'
|
29
26
|
|
30
27
|
# Version-control revision constant
|
31
|
-
REVISION = %q$Revision:
|
28
|
+
REVISION = %q$Revision: e2508eadb52d $
|
32
29
|
|
33
30
|
|
34
31
|
require 'mongrel2/constants'
|
@@ -44,20 +41,6 @@ module Mongrel2
|
|
44
41
|
end
|
45
42
|
|
46
43
|
|
47
|
-
# ZMQ::Context (lazy-loaded)
|
48
|
-
@zmq_ctx = nil
|
49
|
-
|
50
|
-
### Fetch the ZMQ::Context for sockets, creating it if necessary.
|
51
|
-
def self::zmq_context
|
52
|
-
if @zmq_ctx.nil?
|
53
|
-
self.log.info "Using 0MQ %d.%d.%d" % ZMQ.version
|
54
|
-
@zmq_ctx = ZMQ::Context.new
|
55
|
-
end
|
56
|
-
|
57
|
-
return @zmq_ctx
|
58
|
-
end
|
59
|
-
|
60
|
-
|
61
44
|
require 'mongrel2/exceptions'
|
62
45
|
require 'mongrel2/connection'
|
63
46
|
require 'mongrel2/handler'
|
@@ -72,11 +55,3 @@ module Mongrel2
|
|
72
55
|
end # module Mongrel2
|
73
56
|
|
74
57
|
|
75
|
-
# Workaround for rbzmq <= 2.3.0
|
76
|
-
unless defined?( ZMQ::Error )
|
77
|
-
module ZMQ
|
78
|
-
Error = ::RuntimeError
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
|
data/lib/mongrel2/connection.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
#encoding: utf-8
|
3
3
|
|
4
4
|
require 'socket'
|
5
|
-
require '
|
5
|
+
require 'cztop'
|
6
6
|
require 'yajl'
|
7
7
|
require 'digest/sha1'
|
8
8
|
require 'loggability'
|
@@ -66,17 +66,14 @@ class Mongrel2::Connection
|
|
66
66
|
|
67
67
|
### Establish both connections to the Mongrel2 server.
|
68
68
|
def connect
|
69
|
-
ctx = Mongrel2.zmq_context
|
70
|
-
self.log.debug "0mq Context is: %p" % [ ctx ]
|
71
|
-
|
72
69
|
self.log.info "Connecting PULL request socket (%s)" % [ self.sub_addr ]
|
73
|
-
@request_sock =
|
74
|
-
@request_sock.linger = 0
|
70
|
+
@request_sock = CZTop::Socket::PULL.new
|
71
|
+
@request_sock.options.linger = 0
|
75
72
|
@request_sock.connect( self.sub_addr )
|
76
73
|
|
77
74
|
self.log.info "Connecting PUB response socket (%s)" % [ self.pub_addr ]
|
78
|
-
@response_sock =
|
79
|
-
@response_sock.linger = 0
|
75
|
+
@response_sock = CZTop::Socket::PUB.new
|
76
|
+
@response_sock.options.linger = 0
|
80
77
|
@response_sock.connect( self.pub_addr )
|
81
78
|
end
|
82
79
|
|
@@ -104,7 +101,8 @@ class Mongrel2::Connection
|
|
104
101
|
self.check_closed
|
105
102
|
|
106
103
|
self.log.debug "Fetching next request (PULL)"
|
107
|
-
|
104
|
+
message = self.request_sock.receive
|
105
|
+
data = message.pop
|
108
106
|
self.log.debug " got %d bytes of %s request data" % [ data.bytesize, data.encoding.name ]
|
109
107
|
return data
|
110
108
|
end
|
@@ -124,7 +122,7 @@ class Mongrel2::Connection
|
|
124
122
|
header = "%s %d:%s," % [ sender_id, conn_id.to_s.length, conn_id ]
|
125
123
|
buf = header + ' ' + data
|
126
124
|
self.log.debug "Sending response (PUB)"
|
127
|
-
self.response_sock
|
125
|
+
self.response_sock << buf
|
128
126
|
self.log.debug " done with send (%d bytes)" % [ buf.bytesize ]
|
129
127
|
end
|
130
128
|
|
@@ -136,7 +134,7 @@ class Mongrel2::Connection
|
|
136
134
|
self.log.debug "Sending response with %s extended reply (PUB)"
|
137
135
|
header = "%s %d:X %s," % [ sender_id, conn_id.to_s.length + 2, conn_id ]
|
138
136
|
buf = header + ' ' + TNetstring.dump( [response_type] + data )
|
139
|
-
self.response_sock
|
137
|
+
self.response_sock << buf
|
140
138
|
self.log.debug " done with send (%d bytes)" % [ buf.bytesize ]
|
141
139
|
end
|
142
140
|
|
data/lib/mongrel2/control.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'cztop'
|
4
4
|
require 'yajl'
|
5
5
|
require 'pathname'
|
6
6
|
require 'tnetstring'
|
@@ -27,9 +27,8 @@ class Mongrel2::Control
|
|
27
27
|
### Create a new control port object using the current configuration.
|
28
28
|
def initialize( port=DEFAULT_PORT )
|
29
29
|
check_port( port )
|
30
|
-
@
|
31
|
-
@socket =
|
32
|
-
@socket.linger = 0
|
30
|
+
@socket = CZTop::Socket::REQ.new
|
31
|
+
@socket.options.linger = 0
|
33
32
|
@socket.connect( port.to_s )
|
34
33
|
end
|
35
34
|
|
@@ -172,11 +171,11 @@ class Mongrel2::Control
|
|
172
171
|
def request( command, options={} )
|
173
172
|
msg = TNetstring.dump([ command, options ])
|
174
173
|
self.log.debug "Request: %p" % [ msg ]
|
175
|
-
self.socket
|
174
|
+
self.socket << msg
|
176
175
|
|
177
|
-
response = self.socket.
|
176
|
+
response = self.socket.receive
|
178
177
|
self.log.debug "Response: %p" % [ response ]
|
179
|
-
return unpack_response( response )
|
178
|
+
return unpack_response( response.pop )
|
180
179
|
end
|
181
180
|
|
182
181
|
|
data/lib/mongrel2/handler.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#-*- ruby -*-
|
2
2
|
#encoding: utf-8
|
3
3
|
|
4
|
-
require '
|
4
|
+
require 'cztop'
|
5
5
|
require 'loggability'
|
6
6
|
|
7
7
|
require 'mongrel2' unless defined?( Mongrel2 )
|
@@ -135,8 +135,16 @@ class Mongrel2::Handler
|
|
135
135
|
### Create a new instance of the handler with the specified +app_id+, +send_spec+,
|
136
136
|
### and +recv_spec+.
|
137
137
|
def initialize( app_id, send_spec, recv_spec ) # :notnew:
|
138
|
-
@app_id
|
139
|
-
@conn
|
138
|
+
@app_id = app_id
|
139
|
+
@conn = Mongrel2::Connection.new( app_id, send_spec, recv_spec )
|
140
|
+
# @self_pipe = CZTop::Socket::PAIR.new( 'inproc://signal-handler' )
|
141
|
+
|
142
|
+
@self_pipe = {
|
143
|
+
reader: CZTop::Socket::PAIR.new( '@inproc://signal-handler' ),
|
144
|
+
writer: CZTop::Socket::PAIR.new( '>inproc://signal-handler' )
|
145
|
+
}
|
146
|
+
|
147
|
+
@poller = CZTop::Poller.new( @conn.request_sock, @self_pipe[:reader] )
|
140
148
|
|
141
149
|
Thread.main[:signal_queue] = []
|
142
150
|
end
|
@@ -156,6 +164,7 @@ class Mongrel2::Handler
|
|
156
164
|
### Run the handler.
|
157
165
|
def run
|
158
166
|
self.log.info "Starting up %p" % [ self ]
|
167
|
+
|
159
168
|
self.set_signal_handlers
|
160
169
|
self.start_accepting_requests
|
161
170
|
|
@@ -164,7 +173,6 @@ class Mongrel2::Handler
|
|
164
173
|
self.restore_signal_handlers
|
165
174
|
self.log.info "Done: %p" % [ self ]
|
166
175
|
@conn.close
|
167
|
-
Mongrel2.zmq_context.close if Mongrel2.zmq_context.respond_to?( :close )
|
168
176
|
end
|
169
177
|
|
170
178
|
|
@@ -222,6 +230,9 @@ class Mongrel2::Handler
|
|
222
230
|
self.log.info "Restarting"
|
223
231
|
old_conn = @conn
|
224
232
|
@conn = @conn.dup
|
233
|
+
|
234
|
+
@poller = CZTop::Poller.new( @conn.request_sock, @self_pipe[:reader] )
|
235
|
+
|
225
236
|
self.log.debug " conn %p -> %p" % [ old_conn, @conn ]
|
226
237
|
old_conn.close
|
227
238
|
end
|
@@ -229,26 +240,34 @@ class Mongrel2::Handler
|
|
229
240
|
|
230
241
|
### Start a loop, accepting a request and handling it.
|
231
242
|
def start_accepting_requests
|
243
|
+
self.log.info "Starting the request loop."
|
232
244
|
until @conn.closed?
|
233
|
-
|
234
|
-
|
245
|
+
begin
|
246
|
+
if event = @poller.wait
|
247
|
+
case event.socket
|
248
|
+
when @conn.request_sock
|
249
|
+
req = @conn.receive
|
250
|
+
self.accept_request( req ) unless @conn.closed?
|
251
|
+
when @self_pipe[:reader]
|
252
|
+
@self_pipe[:reader].wait
|
253
|
+
self.process_signal_queue
|
254
|
+
else
|
255
|
+
self.log.warn "Got unhandled poller event: %p" % [ event ]
|
256
|
+
end
|
257
|
+
end
|
258
|
+
rescue Errno::EAGAIN
|
259
|
+
# self.log.debug "Got EAGAIN, retrying."
|
260
|
+
rescue Interrupt
|
261
|
+
# self.log.debug "Got an Interrupt; retrying."
|
262
|
+
end
|
235
263
|
end
|
236
|
-
rescue ZMQ::Error => err
|
237
|
-
self.process_signal_queue
|
238
|
-
|
239
|
-
unless @conn.closed?
|
240
|
-
self.log.error "%p while accepting requests: %s" % [ err.class, err.message ]
|
241
|
-
self.log.debug { err.backtrace.join("\n ") }
|
242
264
|
|
243
|
-
|
244
|
-
retry
|
245
|
-
end
|
265
|
+
self.log.debug "Done accepting requests."
|
246
266
|
end
|
247
267
|
|
248
268
|
|
249
269
|
### Read a request from the connection and dispatch it.
|
250
|
-
def accept_request
|
251
|
-
req = @conn.receive
|
270
|
+
def accept_request( req )
|
252
271
|
self.log.info( req.inspect )
|
253
272
|
res = self.dispatch_request( req )
|
254
273
|
|
@@ -414,11 +433,23 @@ class Mongrel2::Handler
|
|
414
433
|
# be handled, override #set_signal_handlers with an empty method.
|
415
434
|
#
|
416
435
|
|
436
|
+
### Wake up the handler when a signal needs to be processed.
|
437
|
+
def wake_up
|
438
|
+
$stderr.puts "Waking up the signal handler"
|
439
|
+
@self_pipe[ :writer ].signal( 0 )
|
440
|
+
$stderr.puts "Done sending the wakeup."
|
441
|
+
end
|
442
|
+
|
443
|
+
|
417
444
|
### Set up signal handlers for common signals that will shut down, restart, etc.
|
418
445
|
def set_signal_handlers
|
419
446
|
self.log.debug "Setting up deferred signal handlers."
|
420
447
|
QUEUE_SIGS.each do |sig|
|
421
|
-
Signal.trap( sig )
|
448
|
+
Signal.trap( sig ) do
|
449
|
+
Thread.main[:signal_queue] << sig
|
450
|
+
self.wake_up
|
451
|
+
$stderr.puts "Done handling the signal."
|
452
|
+
end
|
422
453
|
end
|
423
454
|
end
|
424
455
|
|
@@ -440,6 +471,7 @@ class Mongrel2::Handler
|
|
440
471
|
end
|
441
472
|
end
|
442
473
|
|
474
|
+
|
443
475
|
### Handle any queued signals.
|
444
476
|
def process_signal_queue
|
445
477
|
# Look for any signals that arrived and handle them
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative '../helpers'
|
4
4
|
|
5
|
+
require 'ostruct'
|
5
6
|
require 'mongrel2'
|
6
7
|
require 'mongrel2/connection'
|
7
8
|
|
@@ -18,16 +19,9 @@ describe Mongrel2::Connection do
|
|
18
19
|
|
19
20
|
# Ensure 0MQ never actually gets called
|
20
21
|
before( :each ) do
|
21
|
-
@ctx = double( "0mq context" )
|
22
|
-
Mongrel2.instance_variable_set( :@zmq_ctx, @ctx )
|
23
|
-
|
24
22
|
@conn = Mongrel2::Connection.new( TEST_UUID, TEST_SEND_SPEC, TEST_RECV_SPEC )
|
25
23
|
end
|
26
24
|
|
27
|
-
after( :each ) do
|
28
|
-
Mongrel2.instance_variable_set( :@zmq_ctx, nil )
|
29
|
-
end
|
30
|
-
|
31
25
|
|
32
26
|
it "doesn't connect to the endpoints when it's created" do
|
33
27
|
expect( @conn.instance_variable_get( :@request_sock ) ).to be_nil()
|
@@ -35,16 +29,16 @@ describe Mongrel2::Connection do
|
|
35
29
|
end
|
36
30
|
|
37
31
|
it "connects to the endpoints specified on demand" do
|
38
|
-
request_sock = double( "request socket" )
|
39
|
-
response_sock = double( "response socket" )
|
32
|
+
request_sock = double( "request socket", options: OpenStruct.new )
|
33
|
+
response_sock = double( "response socket", options: OpenStruct.new )
|
40
34
|
|
41
|
-
expect(
|
42
|
-
expect( request_sock ).to receive( :linger= ).with( 0 )
|
35
|
+
expect( CZTop::Socket::PULL ).to receive( :new ).and_return( request_sock )
|
36
|
+
expect( request_sock.options ).to receive( :linger= ).with( 0 )
|
43
37
|
expect( request_sock ).to receive( :connect ).with( TEST_SEND_SPEC )
|
44
38
|
|
45
|
-
expect(
|
46
|
-
expect( response_sock ).to receive( :linger= ).with( 0 )
|
47
|
-
expect( response_sock ).to_not receive( :identity= )
|
39
|
+
expect( CZTop::Socket::PUB ).to receive( :new ).and_return( response_sock )
|
40
|
+
expect( response_sock.options ).to receive( :linger= ).with( 0 )
|
41
|
+
expect( response_sock.options ).to_not receive( :identity= )
|
48
42
|
expect( response_sock ).to receive( :connect ).with( TEST_RECV_SPEC )
|
49
43
|
|
50
44
|
expect( @conn.request_sock ).to eq( request_sock )
|
@@ -58,11 +52,11 @@ describe Mongrel2::Connection do
|
|
58
52
|
context "after a connection has been established" do
|
59
53
|
|
60
54
|
before( :each ) do
|
61
|
-
@request_sock = double( "request socket", :
|
62
|
-
@response_sock = double( "response socket", :
|
55
|
+
@request_sock = double( "request socket", :options => OpenStruct.new, :connect => nil )
|
56
|
+
@response_sock = double( "response socket", :options => OpenStruct.new, :connect => nil )
|
63
57
|
|
64
|
-
allow(
|
65
|
-
allow(
|
58
|
+
allow( CZTop::Socket::PULL ).to receive( :new ).and_return( @request_sock )
|
59
|
+
allow( CZTop::Socket::PUB ).to receive( :new ).and_return( @response_sock )
|
66
60
|
|
67
61
|
@conn.connect
|
68
62
|
end
|
@@ -87,10 +81,10 @@ describe Mongrel2::Connection do
|
|
87
81
|
end
|
88
82
|
|
89
83
|
it "doesn't keep its request and response sockets when duped" do
|
90
|
-
request_sock2 = double( "request socket", :
|
91
|
-
response_sock2 = double( "response socket", :
|
92
|
-
allow(
|
93
|
-
allow(
|
84
|
+
request_sock2 = double( "request socket", :options => OpenStruct.new, :connect => nil )
|
85
|
+
response_sock2 = double( "response socket", :options => OpenStruct.new, :connect => nil )
|
86
|
+
allow( CZTop::Socket::PULL ).to receive( :new ).and_return( request_sock2 )
|
87
|
+
allow( CZTop::Socket::PUB ).to receive( :new ).and_return( response_sock2 )
|
94
88
|
|
95
89
|
duplicate = @conn.dup
|
96
90
|
|
@@ -109,72 +103,56 @@ describe Mongrel2::Connection do
|
|
109
103
|
end
|
110
104
|
|
111
105
|
it "can read raw request messages off of the request_sock" do
|
112
|
-
expect( @request_sock ).to receive( :
|
106
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( "the data" ) )
|
113
107
|
expect( @conn.recv ).to eq( "the data" )
|
114
108
|
end
|
115
109
|
|
116
110
|
it "can read request messages off of the request_sock as Mongrel2::Request objects" do
|
117
111
|
msg = make_request()
|
118
|
-
expect( @request_sock ).to receive( :
|
112
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( msg ) )
|
119
113
|
expect( @conn.receive ).to be_a( Mongrel2::Request )
|
120
114
|
end
|
121
115
|
|
122
|
-
it "handles a socket error while receiving" do
|
123
|
-
expect( @request_sock ).to receive( :recv ).and_return( nil )
|
124
|
-
expect( ZMQ ).to receive( :error ).and_return( ZMQ::Error.new("something bad happened") )
|
125
|
-
expect {
|
126
|
-
@conn.receive
|
127
|
-
}.to raise_error( ZMQ::Error, 'something bad happened' )
|
128
|
-
end
|
129
|
-
|
130
|
-
it "handles a socket error that doesn't set an error message while receiving" do
|
131
|
-
expect( @request_sock ).to receive( :recv ).and_return( nil )
|
132
|
-
expect( ZMQ ).to receive( :error ).and_return( nil )
|
133
|
-
expect {
|
134
|
-
@conn.receive
|
135
|
-
}.to raise_error( RuntimeError, 'unknown error' )
|
136
|
-
end
|
137
|
-
|
138
116
|
it "can write raw response messages with a TNetString header onto the response_sock" do
|
139
|
-
expect( @response_sock ).to receive(
|
117
|
+
expect( @response_sock ).to receive( :<< ).with( "#{TEST_UUID} 1:8, the data" )
|
140
118
|
@conn.send( TEST_UUID, 8, "the data" )
|
141
119
|
end
|
142
120
|
|
143
121
|
it "can write Mongrel2::Responses to the response_sock" do
|
144
|
-
expect( @response_sock ).to receive(
|
122
|
+
expect( @response_sock ).to receive( :<< ).with( "#{TEST_UUID} 1:8, the data" )
|
145
123
|
|
146
124
|
response = Mongrel2::Response.new( TEST_UUID, 8, 'the data' )
|
147
125
|
@conn.reply( response )
|
148
126
|
end
|
149
127
|
|
150
128
|
it "can write raw response messages to more than one conn_id at the same time" do
|
151
|
-
expect( @response_sock ).to receive(
|
129
|
+
expect( @response_sock ).to receive( :<< ).
|
152
130
|
with( "#{TEST_UUID} 15:8 16 44 45 1833, the data" )
|
153
131
|
@conn.broadcast( TEST_UUID, [8, 16, 44, 45, 1833], 'the data' )
|
154
132
|
end
|
155
133
|
|
156
134
|
it "can write raw response messages to more than one conn_id at the same time" do
|
157
|
-
expect( @response_sock ).to receive(
|
135
|
+
expect( @response_sock ).to receive( :<< ).
|
158
136
|
with( "#{TEST_UUID} 15:8 16 44 45 1833, the data" )
|
159
137
|
@conn.broadcast( TEST_UUID, [8, 16, 44, 45, 1833], 'the data' )
|
160
138
|
end
|
161
139
|
|
162
140
|
it "can write an extended response message" do
|
163
|
-
expect( @response_sock ).to receive(
|
141
|
+
expect( @response_sock ).to receive( :<< ).
|
164
142
|
with( "#{TEST_UUID} 3:X 8, 27:8:sendfile,12:the_data.txt,]" )
|
165
143
|
@conn.send_extended( TEST_UUID, 8, :sendfile, "the_data.txt" )
|
166
144
|
end
|
167
145
|
|
168
146
|
it "can broadcast an extended response message" do
|
169
|
-
expect( @response_sock ).to receive(
|
147
|
+
expect( @response_sock ).to receive( :<< ).
|
170
148
|
with( "#{TEST_UUID} 9:X 8 16 32, 27:8:sendfile,12:the_data.txt,]" )
|
171
149
|
@conn.broadcast_extended( TEST_UUID, [8,16,32], :sendfile, "the_data.txt" )
|
172
150
|
end
|
173
151
|
|
174
152
|
it "can write a Mongrel2::Response with extended reply" do
|
175
|
-
expect( @response_sock ).to receive(
|
153
|
+
expect( @response_sock ).to receive( :<< ).
|
176
154
|
with( "#{TEST_UUID} 1:8, " )
|
177
|
-
expect( @response_sock ).to receive(
|
155
|
+
expect( @response_sock ).to receive( :<< ).
|
178
156
|
with( "#{TEST_UUID} 3:X 8, 27:8:sendfile,12:the_data.txt,]" )
|
179
157
|
|
180
158
|
response = Mongrel2::Response.new( TEST_UUID, 8, '' )
|
@@ -185,14 +163,14 @@ describe Mongrel2::Connection do
|
|
185
163
|
end
|
186
164
|
|
187
165
|
it "can tell the connection a request or a response was from to close" do
|
188
|
-
expect( @response_sock ).to receive(
|
166
|
+
expect( @response_sock ).to receive( :<< ).with( "#{TEST_UUID} 1:8, " )
|
189
167
|
|
190
168
|
response = Mongrel2::Response.new( TEST_UUID, 8 )
|
191
169
|
@conn.reply_close( response )
|
192
170
|
end
|
193
171
|
|
194
172
|
it "can broadcast a close to multiple connection IDs" do
|
195
|
-
expect( @response_sock ).to receive(
|
173
|
+
expect( @response_sock ).to receive( :<< ).with( "#{TEST_UUID} 15:8 16 44 45 1833, " )
|
196
174
|
@conn.broadcast_close( TEST_UUID, [8, 16, 44, 45, 1833] )
|
197
175
|
end
|
198
176
|
|