mongrel2 0.48.0 → 0.49.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|