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
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative '../helpers'
|
4
4
|
|
5
|
+
require 'ostruct'
|
5
6
|
require 'mongrel2'
|
6
7
|
require 'mongrel2/control'
|
7
8
|
|
@@ -17,46 +18,40 @@ describe Mongrel2::Control do
|
|
17
18
|
|
18
19
|
before( :each ) do
|
19
20
|
@ctx = double( "ZMQ::Context" )
|
20
|
-
@socket = double( "ZMQ REQ socket", :connect => nil, :
|
21
|
-
allow(
|
22
|
-
|
23
|
-
Mongrel2.instance_variable_set( :@zmq_ctx, @ctx )
|
21
|
+
@socket = double( "ZMQ REQ socket", :connect => nil, :options => OpenStruct.new )
|
22
|
+
allow( CZTop::Socket::REQ ).to receive( :new ).and_return( @socket )
|
24
23
|
|
25
24
|
allow( FileTest ).to receive( :socket? ).with( 'var/run/control' ). and_return( true )
|
26
25
|
|
27
26
|
@control = Mongrel2::Control.new( 'ipc://var/run/control' )
|
28
27
|
end
|
29
28
|
|
30
|
-
after( :all ) do
|
31
|
-
Mongrel2.instance_variable_set( :@zmq_ctx, nil )
|
32
|
-
end
|
33
|
-
|
34
29
|
|
35
30
|
it "sends a 'stop' command to the control port when #stop is called" do
|
36
|
-
expect( @socket ).to receive(
|
37
|
-
expect( @socket ).to receive( :
|
38
|
-
and_return( "59:7:headers,6:3:msg,]4:rows,29:25:21:signal sent to server,]]}" )
|
31
|
+
expect( @socket ).to receive( :<< ).with( "10:4:stop,0:}]" )
|
32
|
+
expect( @socket ).to receive( :receive ).
|
33
|
+
and_return( CZTop::Message.new("59:7:headers,6:3:msg,]4:rows,29:25:21:signal sent to server,]]}") )
|
39
34
|
expect( @control.stop ).to eq( [{ :msg => "signal sent to server" }] )
|
40
35
|
end
|
41
36
|
|
42
37
|
it "sends a 'reload' command to the control port when #reload is called" do
|
43
|
-
expect( @socket ).to receive(
|
44
|
-
expect( @socket ).to receive( :
|
45
|
-
and_return( "59:7:headers,6:3:msg,]4:rows,29:25:21:signal sent to server,]]}" )
|
38
|
+
expect( @socket ).to receive( :<< ).with( "12:6:reload,0:}]" )
|
39
|
+
expect( @socket ).to receive( :receive ).
|
40
|
+
and_return( CZTop::Message.new("59:7:headers,6:3:msg,]4:rows,29:25:21:signal sent to server,]]}") )
|
46
41
|
expect( @control.reload ).to eq( [{ :msg => "signal sent to server" }] )
|
47
42
|
end
|
48
43
|
|
49
44
|
it "sends a 'terminate' command to the control port when #terminate is called" do
|
50
|
-
expect( @socket ).to receive(
|
51
|
-
expect( @socket ).to receive( :
|
52
|
-
and_return( "59:7:headers,6:3:msg,]4:rows,29:25:21:signal sent to server,]]}" )
|
45
|
+
expect( @socket ).to receive( :<< ).with( "15:9:terminate,0:}]" )
|
46
|
+
expect( @socket ).to receive( :receive ).
|
47
|
+
and_return( CZTop::Message.new("59:7:headers,6:3:msg,]4:rows,29:25:21:signal sent to server,]]}") )
|
53
48
|
expect( @control.terminate ).to eq( [{ :msg => "signal sent to server" }] )
|
54
49
|
end
|
55
50
|
|
56
51
|
it "sends a 'help' command to the control port when #help is called" do
|
57
|
-
expect( @socket ).to receive(
|
58
|
-
expect( @socket ).to receive( :
|
59
|
-
|
52
|
+
expect( @socket ).to receive( :<< ).with( "10:4:help,0:}]" )
|
53
|
+
expect( @socket ).to receive( :receive ).and_return(
|
54
|
+
CZTop::Message.new("416:7:headers,14:4:name,4:help,]4:rows,376:35:4:stop" +
|
60
55
|
",24:stop the server (SIGINT),]30:6:reload,17:reload " +
|
61
56
|
"the server,]23:4:help,12:this command,]37:12:control" +
|
62
57
|
"_stop,17:stop control port,]28:4:kill,17:kill a conn" +
|
@@ -64,7 +59,8 @@ describe Mongrel2::Control do
|
|
64
59
|
"]46:9:terminate,30:terminate the server (SIGTERM),]2" +
|
65
60
|
"8:4:time,17:the server's time,]28:4:uuid,17:the serv" +
|
66
61
|
"er's uuid,]40:4:info,29:information about this serve" +
|
67
|
-
|
62
|
+
"r,]]}")
|
63
|
+
)
|
68
64
|
expect( @control.help ).to eq([
|
69
65
|
{:name => "stop", :help => "stop the server (SIGINT)"},
|
70
66
|
{:name => "reload", :help => "reload the server"},
|
@@ -80,22 +76,24 @@ describe Mongrel2::Control do
|
|
80
76
|
end
|
81
77
|
|
82
78
|
it "sends a 'uuid' command to the control port when #uuid is called" do
|
83
|
-
expect( @socket ).to receive(
|
84
|
-
expect( @socket ).to receive( :
|
85
|
-
|
86
|
-
|
79
|
+
expect( @socket ).to receive( :<< ).with( "10:4:uuid,0:}]" )
|
80
|
+
expect( @socket ).to receive( :receive ).and_return(
|
81
|
+
CZTop::Message.new("75:7:headers,7:4:uuid,]4:rows,44:40:36:34D8E57C-3E91" +
|
82
|
+
"-4F24-9BBE-0B53C1827CB4,]]}")
|
83
|
+
)
|
87
84
|
expect( @control.uuid ).to eq( [{ :uuid => '34D8E57C-3E91-4F24-9BBE-0B53C1827CB4' }] )
|
88
85
|
end
|
89
86
|
|
90
87
|
it "sends an 'info' command to the control port when #info is called" do
|
91
|
-
expect( @socket ).to receive(
|
92
|
-
expect( @socket ).to receive( :
|
93
|
-
|
88
|
+
expect( @socket ).to receive( :<< ).with( "10:4:info,0:}]" )
|
89
|
+
expect( @socket ).to receive( :receive ).and_return(
|
90
|
+
CZTop::Message.new("260:7:headers,92:4:port,9:bind_addr,4:uuid,6:chroot," +
|
94
91
|
"10:access_log,9:error_log,8:pid_file,16:default_host" +
|
95
92
|
"name,]4:rows,142:137:4:8113#7:0.0.0.0,36:34D8E57C-3E" +
|
96
93
|
"91-4F24-9BBE-0B53C1827CB4,2:./,18:.//logs/access.log" +
|
97
94
|
",15:/logs/error.log,18:./run/mongrel2.pid,9:localhos" +
|
98
|
-
|
95
|
+
"t,]]}")
|
96
|
+
)
|
99
97
|
expect( @control.info ).to eq([{
|
100
98
|
:port => 8113,
|
101
99
|
:bind_addr => "0.0.0.0",
|
@@ -111,15 +109,16 @@ describe Mongrel2::Control do
|
|
111
109
|
it "sends a 'status' command with a 'what' option set to 'tasks' to the control port " +
|
112
110
|
"when #tasklist is called" do
|
113
111
|
|
114
|
-
expect( @socket ).to receive(
|
115
|
-
expect( @socket ).to receive( :
|
116
|
-
|
112
|
+
expect( @socket ).to receive( :<< ).with( "28:6:status,15:4:what,5:tasks,}]" )
|
113
|
+
expect( @socket ).to receive( :receive ).and_return(
|
114
|
+
CZTop::Message.new("343:7:headers,38:2:id,6:system,4:name,5:state,6:status," +
|
117
115
|
"]4:rows,279:38:1:1#5:false!6:SERVER,7:read fd,4:idle,]5" +
|
118
116
|
"1:1:2#5:false!12:Handler_task,12:read handler,4:idle,]5" +
|
119
117
|
"1:1:3#5:false!12:Handler_task,12:read handler,4:idle,]4" +
|
120
118
|
"8:1:4#5:false!7:control,12:read handler,7:running,]31:1" +
|
121
119
|
":5#5:false!6:ticker,0:,4:idle,]36:1:6#4:true!6:fdtask,5" +
|
122
|
-
|
120
|
+
":yield,5:ready,]]}")
|
121
|
+
)
|
123
122
|
expect( @control.tasklist ).to eq([
|
124
123
|
{:id=>1, :system=>false, :name=>"SERVER", :state=>"read fd", :status=>"idle"},
|
125
124
|
{:id=>2, :system=>false, :name=>"Handler_task", :state=>"read handler", :status=>"idle"},
|
@@ -133,11 +132,12 @@ describe Mongrel2::Control do
|
|
133
132
|
it "sends an 'status' command with a 'what' option set to 'net' to the control port " +
|
134
133
|
"when #conn_status is called" do
|
135
134
|
|
136
|
-
expect( @socket ).to receive(
|
137
|
-
expect( @socket ).to receive( :
|
138
|
-
|
135
|
+
expect( @socket ).to receive( :<< ).with( "26:6:status,13:4:what,3:net,}]" )
|
136
|
+
expect( @socket ).to receive( :receive ).and_return(
|
137
|
+
CZTop::Message.new("150:7:headers,86:2:id,2:fd,4:type,9:last_ping,9:last_read," +
|
139
138
|
"10:last_write,10:bytes_read,13:bytes_written,]4:rows,39:35" +
|
140
|
-
":1:2#2:38#1:1#1:0#1:0#1:0#3:405#1:0#]]}"
|
139
|
+
":1:2#2:38#1:1#1:0#1:0#1:0#3:405#1:0#]]}")
|
140
|
+
)
|
141
141
|
expect( @control.conn_status ).to eq([
|
142
142
|
{:id=>2, :fd=>38, :type=>1, :last_ping=>0, :last_read=>0, :last_write=>0,
|
143
143
|
:bytes_read=>405, :bytes_written=>0}
|
@@ -145,31 +145,32 @@ describe Mongrel2::Control do
|
|
145
145
|
end
|
146
146
|
|
147
147
|
it "sends a 'time' command to the control port when #time is called" do
|
148
|
-
expect( @socket ).to receive(
|
149
|
-
expect( @socket ).to receive( :
|
150
|
-
and_return( "49:7:headers,7:4:time,]4:rows,18:14:10:1315532674,]]}" )
|
148
|
+
expect( @socket ).to receive( :<< ).with( "10:4:time,0:}]" )
|
149
|
+
expect( @socket ).to receive( :receive ).
|
150
|
+
and_return( CZTop::Message.new("49:7:headers,7:4:time,]4:rows,18:14:10:1315532674,]]}") )
|
151
151
|
expect( @control.time ).to eq( Time.at( 1315532674 ) )
|
152
152
|
end
|
153
153
|
|
154
154
|
it "sends a 'kill' command with an ID equal to the argument to the control port when #kill " +
|
155
155
|
"is called" do
|
156
|
-
expect( @socket ).to receive(
|
157
|
-
expect( @socket ).to receive( :
|
156
|
+
expect( @socket ).to receive( :<< ).with( "19:4:kill,9:2:id,1:0#}]" )
|
157
|
+
expect( @socket ).to receive( :receive ).
|
158
|
+
and_return( CZTop::Message.new( "40:7:headers,9:6:status,]4:rows,8:5:2:OK,]]}" ) )
|
158
159
|
expect( @control.kill( 0 ) ).to eq( [{ :status => "OK" }] )
|
159
160
|
end
|
160
161
|
|
161
162
|
it "sends a 'control_stop' command to the control port when #info is called" do
|
162
|
-
expect( @socket ).to receive(
|
163
|
-
expect( @socket ).to receive( :
|
164
|
-
and_return( "63:7:headers,6:3:msg,]4:rows,33:29:25:stopping the control port,]]}" )
|
163
|
+
expect( @socket ).to receive( :<< ).with( "19:12:control_stop,0:}]" )
|
164
|
+
expect( @socket ).to receive( :receive ).
|
165
|
+
and_return( CZTop::Message.new("63:7:headers,6:3:msg,]4:rows,33:29:25:stopping the control port,]]}") )
|
165
166
|
expect( @control.control_stop ).to eq( [{:msg => "stopping the control port"}] )
|
166
167
|
end
|
167
168
|
|
168
169
|
|
169
170
|
it "raises an exception if the server responds with an error" do
|
170
|
-
expect( @socket ).to receive(
|
171
|
-
expect( @socket ).to receive( :
|
172
|
-
and_return( "61:4:code,16:INVALID_ARGUMENT,5:error,22:Invalid argument type.,}" )
|
171
|
+
expect( @socket ).to receive( :<< ).with( "19:4:kill,9:2:id,1:0#}]" )
|
172
|
+
expect( @socket ).to receive( :receive ).
|
173
|
+
and_return( CZTop::Message.new("61:4:code,16:INVALID_ARGUMENT,5:error,22:Invalid argument type.,}") )
|
173
174
|
|
174
175
|
expect {
|
175
176
|
@control.kill( 0 )
|
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
require_relative '../helpers'
|
4
4
|
|
5
|
+
require 'ostruct'
|
6
|
+
require 'cztop'
|
7
|
+
|
5
8
|
require 'mongrel2'
|
6
9
|
require 'mongrel2/config'
|
7
10
|
require 'mongrel2/handler'
|
@@ -36,20 +39,23 @@ describe Mongrel2::Handler, :db do
|
|
36
39
|
|
37
40
|
# Ensure 0MQ never actually gets called
|
38
41
|
before( :each ) do
|
39
|
-
@
|
40
|
-
@
|
41
|
-
@
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
allow(
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
42
|
+
@request_sock = instance_double( CZTop::Socket::PULL, :options => OpenStruct.new, :connect => nil, :close => nil )
|
43
|
+
@response_sock = instance_double( CZTop::Socket::PUB, :options => OpenStruct.new, :connect => nil, :close => nil )
|
44
|
+
@selfpipe_reader = instance_double( CZTop::Socket::PAIR )
|
45
|
+
@selfpipe_writer = instance_double( CZTop::Socket::PAIR )
|
46
|
+
@poller = instance_double( CZTop::Poller )
|
47
|
+
@poller_event = instance_double( CZTop::Poller::Event )
|
48
|
+
|
49
|
+
allow( CZTop::Socket::PULL ).to receive( :new ).and_return( @request_sock )
|
50
|
+
allow( CZTop::Socket::PUB ).to receive( :new ).and_return( @response_sock )
|
51
|
+
allow( CZTop::Socket::PAIR ).to receive( :new ).with( '@inproc://signal-handler' ).
|
52
|
+
and_return( @selfpipe_reader )
|
53
|
+
allow( CZTop::Socket::PAIR ).to receive( :new ).with( '>inproc://signal-handler' ).
|
54
|
+
and_return( @selfpipe_writer )
|
55
|
+
allow( CZTop::Poller ).to receive( :new ).and_return( @poller )
|
56
|
+
|
57
|
+
allow( @poller ).to receive( :wait ).and_return( @poller_event )
|
58
|
+
allow( @poller_event ).to receive( :socket ).and_return( @request_sock )
|
53
59
|
end
|
54
60
|
|
55
61
|
|
@@ -78,11 +84,12 @@ describe Mongrel2::Handler, :db do
|
|
78
84
|
).to eq([ TEST_SEND_SPEC, TEST_RECV_SPEC ])
|
79
85
|
end
|
80
86
|
|
87
|
+
|
81
88
|
it "has a convenience method for instantiating and running a Handler given an " +
|
82
89
|
"application ID" do
|
83
90
|
|
84
91
|
req = make_request()
|
85
|
-
expect( @request_sock ).to receive( :
|
92
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( req ) )
|
86
93
|
|
87
94
|
res = OneShotHandler.run( TEST_UUID )
|
88
95
|
|
@@ -92,9 +99,10 @@ describe Mongrel2::Handler, :db do
|
|
92
99
|
expect( res.conn.pub_addr ).to eq( TEST_RECV_SPEC )
|
93
100
|
end
|
94
101
|
|
102
|
+
|
95
103
|
it "knows what handler config corresponds to its" do
|
96
104
|
req = make_request()
|
97
|
-
expect( @request_sock ).to receive( :
|
105
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( req ) )
|
98
106
|
|
99
107
|
res = OneShotHandler.run( TEST_UUID )
|
100
108
|
|
@@ -124,7 +132,7 @@ describe Mongrel2::Handler, :db do
|
|
124
132
|
|
125
133
|
it "dispatches HTTP requests to the #handle method" do
|
126
134
|
req = make_request()
|
127
|
-
expect( @request_sock ).to receive( :
|
135
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( req ) )
|
128
136
|
|
129
137
|
res = OneShotHandler.new( TEST_UUID, TEST_SEND_SPEC, TEST_RECV_SPEC ).run
|
130
138
|
|
@@ -135,9 +143,10 @@ describe Mongrel2::Handler, :db do
|
|
135
143
|
expect( response.status ).to eq( 204 )
|
136
144
|
end
|
137
145
|
|
146
|
+
|
138
147
|
it "ignores JSON messages by default" do
|
139
148
|
req = make_json_request()
|
140
|
-
expect( @request_sock ).to receive( :
|
149
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( req ) )
|
141
150
|
|
142
151
|
res = OneShotHandler.new( TEST_UUID, TEST_SEND_SPEC, TEST_RECV_SPEC ).run
|
143
152
|
|
@@ -147,6 +156,7 @@ describe Mongrel2::Handler, :db do
|
|
147
156
|
expect( response ).to be_nil()
|
148
157
|
end
|
149
158
|
|
159
|
+
|
150
160
|
it "dispatches JSON message to the #handle_json method" do
|
151
161
|
json_handler = Class.new( OneShotHandler ) do
|
152
162
|
def handle_json( request )
|
@@ -155,7 +165,7 @@ describe Mongrel2::Handler, :db do
|
|
155
165
|
end
|
156
166
|
|
157
167
|
req = make_json_request()
|
158
|
-
expect( @request_sock ).to receive( :
|
168
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( req ) )
|
159
169
|
|
160
170
|
res = json_handler.new( TEST_UUID, TEST_SEND_SPEC, TEST_RECV_SPEC ).run
|
161
171
|
|
@@ -165,9 +175,10 @@ describe Mongrel2::Handler, :db do
|
|
165
175
|
expect( response ).to be_a( Mongrel2::Response )
|
166
176
|
end
|
167
177
|
|
178
|
+
|
168
179
|
it "ignores XML messages by default" do
|
169
180
|
req = make_xml_request()
|
170
|
-
expect( @request_sock ).to receive( :
|
181
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( req ) )
|
171
182
|
|
172
183
|
res = OneShotHandler.new( TEST_UUID, TEST_SEND_SPEC, TEST_RECV_SPEC ).run
|
173
184
|
|
@@ -177,6 +188,7 @@ describe Mongrel2::Handler, :db do
|
|
177
188
|
expect( response ).to be_nil()
|
178
189
|
end
|
179
190
|
|
191
|
+
|
180
192
|
it "dispatches XML message to the #handle_xml method" do
|
181
193
|
xml_handler = Class.new( OneShotHandler ) do
|
182
194
|
def handle_xml( request )
|
@@ -185,7 +197,7 @@ describe Mongrel2::Handler, :db do
|
|
185
197
|
end
|
186
198
|
|
187
199
|
req = make_xml_request()
|
188
|
-
expect( @request_sock ).to receive( :
|
200
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( req ) )
|
189
201
|
|
190
202
|
res = xml_handler.new( TEST_UUID, TEST_SEND_SPEC, TEST_RECV_SPEC ).run
|
191
203
|
|
@@ -195,6 +207,7 @@ describe Mongrel2::Handler, :db do
|
|
195
207
|
expect( response ).to be_a( Mongrel2::Response )
|
196
208
|
end
|
197
209
|
|
210
|
+
|
198
211
|
it "dispatches WebSocket opening handshakes to the #handle_websocket_handshake method" do
|
199
212
|
ws_handler = Class.new( OneShotHandler ) do
|
200
213
|
def handle_websocket_handshake( handshake )
|
@@ -203,7 +216,7 @@ describe Mongrel2::Handler, :db do
|
|
203
216
|
end
|
204
217
|
|
205
218
|
req = make_websocket_handshake()
|
206
|
-
expect( @request_sock ).to receive( :
|
219
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( req ) )
|
207
220
|
|
208
221
|
res = ws_handler.new( TEST_UUID, TEST_SEND_SPEC, TEST_RECV_SPEC ).run
|
209
222
|
|
@@ -213,6 +226,7 @@ describe Mongrel2::Handler, :db do
|
|
213
226
|
expect( response ).to be_a( Mongrel2::WebSocket::ServerHandshake )
|
214
227
|
end
|
215
228
|
|
229
|
+
|
216
230
|
it "dispatches WebSocket protocol frames to the #handle_websocket method" do
|
217
231
|
ws_handler = Class.new( OneShotHandler ) do
|
218
232
|
def handle_websocket( frame )
|
@@ -221,7 +235,7 @@ describe Mongrel2::Handler, :db do
|
|
221
235
|
end
|
222
236
|
|
223
237
|
req = make_websocket_frame()
|
224
|
-
expect( @request_sock ).to receive( :
|
238
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( req ) )
|
225
239
|
|
226
240
|
res = ws_handler.new( TEST_UUID, TEST_SEND_SPEC, TEST_RECV_SPEC ).run
|
227
241
|
|
@@ -231,11 +245,13 @@ describe Mongrel2::Handler, :db do
|
|
231
245
|
expect( response ).to be_a( Mongrel2::WebSocket::Frame )
|
232
246
|
end
|
233
247
|
|
234
|
-
|
248
|
+
|
249
|
+
it "continues when a SocketError is received but the connection remains open" do
|
250
|
+
pending "Does this still apply?"
|
235
251
|
req = make_request()
|
236
252
|
|
237
|
-
expect( @request_sock ).to receive( :
|
238
|
-
expect( @request_sock ).to receive( :
|
253
|
+
expect( @request_sock ).to receive( :receive ).and_raise( SocketError.new("Interrupted system call.") )
|
254
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( req ) )
|
239
255
|
|
240
256
|
res = OneShotHandler.new( TEST_UUID, TEST_SEND_SPEC, TEST_RECV_SPEC ).run
|
241
257
|
|
@@ -246,9 +262,10 @@ describe Mongrel2::Handler, :db do
|
|
246
262
|
expect( response.status ).to eq( 204 )
|
247
263
|
end
|
248
264
|
|
265
|
+
|
249
266
|
it "ignores disconnect notices by default" do
|
250
267
|
req = make_json_request( :path => '@*', :body => {'type' => 'disconnect'} )
|
251
|
-
expect( @request_sock ).to receive( :
|
268
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( req ) )
|
252
269
|
|
253
270
|
res = OneShotHandler.new( TEST_UUID, TEST_SEND_SPEC, TEST_RECV_SPEC ).run
|
254
271
|
|
@@ -258,6 +275,7 @@ describe Mongrel2::Handler, :db do
|
|
258
275
|
expect( response ).to be_nil()
|
259
276
|
end
|
260
277
|
|
278
|
+
|
261
279
|
it "dispatches disconnect notices to the #handle_disconnect method" do
|
262
280
|
disconnect_handler = Class.new( OneShotHandler ) do
|
263
281
|
def handle_disconnect( request )
|
@@ -266,7 +284,7 @@ describe Mongrel2::Handler, :db do
|
|
266
284
|
end
|
267
285
|
|
268
286
|
req = make_json_request( :path => '@*', :body => {'type' => 'disconnect'} )
|
269
|
-
expect( @request_sock ).to receive( :
|
287
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( req ) )
|
270
288
|
|
271
289
|
res = disconnect_handler.new( TEST_UUID, TEST_SEND_SPEC, TEST_RECV_SPEC ).run
|
272
290
|
|
@@ -276,10 +294,11 @@ describe Mongrel2::Handler, :db do
|
|
276
294
|
expect( response ).to be_nil()
|
277
295
|
end
|
278
296
|
|
297
|
+
|
279
298
|
it "cancels async upload notices by default" do
|
280
299
|
req = make_request( 'METHOD' => 'POST', :headers => {'x-mongrel2-upload-start' => 'uploadfile.XXX'} )
|
281
|
-
expect( @request_sock ).to receive( :
|
282
|
-
expect( @response_sock ).to receive(
|
300
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( req ) )
|
301
|
+
expect( @response_sock ).to receive( :<< ).with( "#{TEST_UUID} 1:8, " )
|
283
302
|
|
284
303
|
res = OneShotHandler.new( TEST_UUID, TEST_SEND_SPEC, TEST_RECV_SPEC ).run
|
285
304
|
|
@@ -288,6 +307,7 @@ describe Mongrel2::Handler, :db do
|
|
288
307
|
expect( response ).to be_nil()
|
289
308
|
end
|
290
309
|
|
310
|
+
|
291
311
|
it "re-establishes its connection when told to restart" do
|
292
312
|
res = OneShotHandler.new( TEST_UUID, TEST_SEND_SPEC, TEST_RECV_SPEC )
|
293
313
|
original_conn = res.conn
|
@@ -295,6 +315,7 @@ describe Mongrel2::Handler, :db do
|
|
295
315
|
expect( res.conn ).to_not equal( original_conn )
|
296
316
|
end
|
297
317
|
|
318
|
+
|
298
319
|
it "cleans any mongrel2 request spool files after sending a response" do
|
299
320
|
spoolfile = Pathname.new( Dir.tmpdir + '/mongrel2.uskd8l1' )
|
300
321
|
spoolfile.write( "Hi!" )
|
@@ -303,7 +324,7 @@ describe Mongrel2::Handler, :db do
|
|
303
324
|
'x-mongrel2-upload-start' => spoolfile.basename,
|
304
325
|
'x-mongrel2-upload-done' => spoolfile.basename
|
305
326
|
})
|
306
|
-
expect( @request_sock ).to receive( :
|
327
|
+
expect( @request_sock ).to receive( :receive ).and_return( CZTop::Message.new( req ) )
|
307
328
|
|
308
329
|
res = OneShotHandler.new( TEST_UUID, TEST_SEND_SPEC, TEST_RECV_SPEC ).run
|
309
330
|
request, response = res.transactions.first
|
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.49.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Granger
|
@@ -10,154 +10,159 @@ bindir: bin
|
|
10
10
|
cert_chain:
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
13
|
+
MIIEbDCCAtSgAwIBAgIBATANBgkqhkiG9w0BAQsFADA+MQwwCgYDVQQDDANnZWQx
|
14
|
+
GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
|
15
|
+
HhcNMTYwODIwMTgxNzQyWhcNMTcwODIwMTgxNzQyWjA+MQwwCgYDVQQDDANnZWQx
|
16
|
+
GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
|
17
|
+
ggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC/JWGRHO+USzR97vXjkFgt
|
18
|
+
83qeNf2KHkcvrRTSnR64i6um/ziin0I0oX23H7VYrDJC9A/uoUa5nGRJS5Zw/+wW
|
19
|
+
ENcvWVZS4iUzi4dsYJGY6yEOsXh2CcF46+QevV8iE+UmbkU75V7Dy1JCaUOyizEt
|
20
|
+
TH5UHsOtUU7k9TYARt/TgYZKuaoAMZZd5qyVqhF1vV+7/Qzmp89NGflXf2xYP26a
|
21
|
+
4MAX2qqKX/FKXqmFO+AGsbwYTEds1mksBF3fGsFgsQWxftG8GfZQ9+Cyu2+l1eOw
|
22
|
+
cZ+lPcg834G9DrqW2zhqUoLr1MTly4pqxYGb7XoDhoR7dd1kFE2a067+DzWC/ADt
|
23
|
+
+QkcqWUm5oh1fN0eqr7NsZlVJDulFgdiiYPQiIN7UNsii4Wc9aZqBoGcYfBeQNPZ
|
24
|
+
soo/6za/bWajOKUmDhpqvaiRv9EDpVLzuj53uDoukMMwxCMfgb04+ckQ0t2G7wqc
|
25
|
+
/D+K9JW9DDs3Yjgv9k4h7YMhW5gftosd+NkNC/+Y2CkCAwEAAaN1MHMwCQYDVR0T
|
26
|
+
BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFHKN/nkRusdqCJEuq3lgB3fJvyTg
|
27
|
+
MBwGA1UdEQQVMBOBEWdlZEBGYWVyaWVNVUQub3JnMBwGA1UdEgQVMBOBEWdlZEBG
|
28
|
+
YWVyaWVNVUQub3JnMA0GCSqGSIb3DQEBCwUAA4IBgQAPJzKiT0zBU7kpqe0aS2qb
|
29
|
+
FI0PJ4y5I8buU4IZGUD5NEt/N7pZNfOyBxkrZkXhS44Fp+xwBH5ebLbq/WY78Bqd
|
30
|
+
db0z6ZgW4LMYMpWFfbXsRbd9TU2f52L8oMAhxOvF7Of5qJMVWuFQ8FPagk2iHrdH
|
31
|
+
inYLQagqAF6goWTXgAJCdPd6SNeeSNqA6vlY7CV1Jh5kfNJJ6xu/CVij1GzCLu/5
|
32
|
+
DMOr26DBv+qLJRRC/2h34uX71q5QgeOyxvMg+7V3u/Q06DXyQ2VgeeqiwDFFpEH0
|
33
|
+
PFkdPO6ZqbTRcLfNH7mFgCBJjsfSjJrn0sPBlYyOXgCoByfZnZyrIMH/UY+lgQqS
|
34
|
+
6Von1VDsfQm0eJh5zYZD64ZF86phSR7mUX3mXItwH04HrZwkWpvgd871DZVR3i1n
|
35
|
+
w8aNA5re5+Rt/Vvjxj5AcEnZnZiz5x959NaddQocX32Z1unHw44pzRNUur1GInfW
|
36
|
+
p4vpx2kUSFSAGjtCbDGTNV2AH8w9OU4xEmNz8c5lyoA=
|
32
37
|
-----END CERTIFICATE-----
|
33
|
-
date: 2017-
|
38
|
+
date: 2017-03-10 00:00:00.000000000 Z
|
34
39
|
dependencies:
|
35
40
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
41
|
+
name: cztop
|
37
42
|
requirement: !ruby/object:Gem::Requirement
|
38
43
|
requirements:
|
39
44
|
- - "~>"
|
40
45
|
- !ruby/object:Gem::Version
|
41
|
-
version: '
|
46
|
+
version: '0.11'
|
42
47
|
type: :runtime
|
43
48
|
prerelease: false
|
44
49
|
version_requirements: !ruby/object:Gem::Requirement
|
45
50
|
requirements:
|
46
51
|
- - "~>"
|
47
52
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
53
|
+
version: '0.11'
|
49
54
|
- !ruby/object:Gem::Dependency
|
50
|
-
name:
|
55
|
+
name: libxml-ruby
|
51
56
|
requirement: !ruby/object:Gem::Requirement
|
52
57
|
requirements:
|
53
58
|
- - "~>"
|
54
59
|
- !ruby/object:Gem::Version
|
55
|
-
version: '
|
60
|
+
version: '2.7'
|
56
61
|
type: :runtime
|
57
62
|
prerelease: false
|
58
63
|
version_requirements: !ruby/object:Gem::Requirement
|
59
64
|
requirements:
|
60
65
|
- - "~>"
|
61
66
|
- !ruby/object:Gem::Version
|
62
|
-
version: '
|
67
|
+
version: '2.7'
|
63
68
|
- !ruby/object:Gem::Dependency
|
64
|
-
name:
|
69
|
+
name: loggability
|
65
70
|
requirement: !ruby/object:Gem::Requirement
|
66
71
|
requirements:
|
67
72
|
- - "~>"
|
68
73
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
74
|
+
version: '0.12'
|
70
75
|
type: :runtime
|
71
76
|
prerelease: false
|
72
77
|
version_requirements: !ruby/object:Gem::Requirement
|
73
78
|
requirements:
|
74
79
|
- - "~>"
|
75
80
|
- !ruby/object:Gem::Version
|
76
|
-
version: '
|
81
|
+
version: '0.12'
|
77
82
|
- !ruby/object:Gem::Dependency
|
78
|
-
name:
|
83
|
+
name: sequel
|
79
84
|
requirement: !ruby/object:Gem::Requirement
|
80
85
|
requirements:
|
81
86
|
- - "~>"
|
82
87
|
- !ruby/object:Gem::Version
|
83
|
-
version: '2
|
88
|
+
version: '4.2'
|
84
89
|
type: :runtime
|
85
90
|
prerelease: false
|
86
91
|
version_requirements: !ruby/object:Gem::Requirement
|
87
92
|
requirements:
|
88
93
|
- - "~>"
|
89
94
|
- !ruby/object:Gem::Version
|
90
|
-
version: '2
|
95
|
+
version: '4.2'
|
91
96
|
- !ruby/object:Gem::Dependency
|
92
|
-
name:
|
97
|
+
name: sqlite3
|
93
98
|
requirement: !ruby/object:Gem::Requirement
|
94
99
|
requirements:
|
95
100
|
- - "~>"
|
96
101
|
- !ruby/object:Gem::Version
|
97
|
-
version: '1.
|
102
|
+
version: '1.3'
|
98
103
|
type: :runtime
|
99
104
|
prerelease: false
|
100
105
|
version_requirements: !ruby/object:Gem::Requirement
|
101
106
|
requirements:
|
102
107
|
- - "~>"
|
103
108
|
- !ruby/object:Gem::Version
|
104
|
-
version: '1.
|
109
|
+
version: '1.3'
|
105
110
|
- !ruby/object:Gem::Dependency
|
106
|
-
name:
|
111
|
+
name: sysexits
|
107
112
|
requirement: !ruby/object:Gem::Requirement
|
108
113
|
requirements:
|
109
114
|
- - "~>"
|
110
115
|
- !ruby/object:Gem::Version
|
111
|
-
version: '1.
|
116
|
+
version: '1.1'
|
112
117
|
type: :runtime
|
113
118
|
prerelease: false
|
114
119
|
version_requirements: !ruby/object:Gem::Requirement
|
115
120
|
requirements:
|
116
121
|
- - "~>"
|
117
122
|
- !ruby/object:Gem::Version
|
118
|
-
version: '1.
|
123
|
+
version: '1.1'
|
119
124
|
- !ruby/object:Gem::Dependency
|
120
|
-
name:
|
125
|
+
name: tnetstring
|
121
126
|
requirement: !ruby/object:Gem::Requirement
|
122
127
|
requirements:
|
123
128
|
- - "~>"
|
124
129
|
- !ruby/object:Gem::Version
|
125
|
-
version: '0.
|
130
|
+
version: '0.3'
|
126
131
|
type: :runtime
|
127
132
|
prerelease: false
|
128
133
|
version_requirements: !ruby/object:Gem::Requirement
|
129
134
|
requirements:
|
130
135
|
- - "~>"
|
131
136
|
- !ruby/object:Gem::Version
|
132
|
-
version: '0.
|
137
|
+
version: '0.3'
|
133
138
|
- !ruby/object:Gem::Dependency
|
134
|
-
name:
|
139
|
+
name: trollop
|
135
140
|
requirement: !ruby/object:Gem::Requirement
|
136
141
|
requirements:
|
137
142
|
- - "~>"
|
138
143
|
- !ruby/object:Gem::Version
|
139
|
-
version: '
|
144
|
+
version: '2.0'
|
140
145
|
type: :runtime
|
141
146
|
prerelease: false
|
142
147
|
version_requirements: !ruby/object:Gem::Requirement
|
143
148
|
requirements:
|
144
149
|
- - "~>"
|
145
150
|
- !ruby/object:Gem::Version
|
146
|
-
version: '
|
151
|
+
version: '2.0'
|
147
152
|
- !ruby/object:Gem::Dependency
|
148
|
-
name:
|
153
|
+
name: yajl-ruby
|
149
154
|
requirement: !ruby/object:Gem::Requirement
|
150
155
|
requirements:
|
151
156
|
- - "~>"
|
152
157
|
- !ruby/object:Gem::Version
|
153
|
-
version: '
|
158
|
+
version: '1.0'
|
154
159
|
type: :runtime
|
155
160
|
prerelease: false
|
156
161
|
version_requirements: !ruby/object:Gem::Requirement
|
157
162
|
requirements:
|
158
163
|
- - "~>"
|
159
164
|
- !ruby/object:Gem::Version
|
160
|
-
version: '
|
165
|
+
version: '1.0'
|
161
166
|
- !ruby/object:Gem::Dependency
|
162
167
|
name: hoe-mercurial
|
163
168
|
requirement: !ruby/object:Gem::Requirement
|
@@ -301,7 +306,6 @@ extra_rdoc_files:
|
|
301
306
|
- History.rdoc
|
302
307
|
- Manifest.txt
|
303
308
|
- README.rdoc
|
304
|
-
- examples/README.txt
|
305
309
|
files:
|
306
310
|
- ".autotest"
|
307
311
|
- ".gemtest"
|
@@ -313,24 +317,8 @@ files:
|
|
313
317
|
- README.rdoc
|
314
318
|
- Rakefile
|
315
319
|
- bin/m2sh.rb
|
316
|
-
- data/mongrel2/bootstrap.html
|
317
|
-
- data/mongrel2/config.rb.in
|
318
320
|
- data/mongrel2/config.sql
|
319
|
-
- data/mongrel2/css/master.css
|
320
|
-
- data/mongrel2/index.html.in
|
321
|
-
- data/mongrel2/js/websock-test.js
|
322
321
|
- data/mongrel2/mimetypes.sql
|
323
|
-
- data/mongrel2/websock-test.html
|
324
|
-
- examples/Procfile
|
325
|
-
- examples/README.txt
|
326
|
-
- examples/async-upload.rb
|
327
|
-
- examples/config.rb
|
328
|
-
- examples/helloworld-handler.rb
|
329
|
-
- examples/request-dumper.rb
|
330
|
-
- examples/request-dumper.tmpl
|
331
|
-
- examples/run
|
332
|
-
- examples/sendfile.rb
|
333
|
-
- examples/ws-echo.rb
|
334
322
|
- lib/mongrel2.rb
|
335
323
|
- lib/mongrel2/config.rb
|
336
324
|
- lib/mongrel2/config/directory.rb
|
@@ -410,7 +398,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
410
398
|
version: '0'
|
411
399
|
requirements: []
|
412
400
|
rubyforge_project:
|
413
|
-
rubygems_version: 2.
|
401
|
+
rubygems_version: 2.6.8
|
414
402
|
signing_key:
|
415
403
|
specification_version: 4
|
416
404
|
summary: Ruby-Mongrel2 is a complete Ruby connector for Mongrel2[http://mongrel2.org/]
|