mongrel2 0.34.1.pre.357 → 0.35.0

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
@@ -1,7 +1,13 @@
1
- == v0.34.1 [2012-12-04] Michael Granger <ged@FaerieMUD.org>
2
-
3
- - Ensure the ZMQ context is closed when Handler#run exits.
4
-
1
+ == v0.35.0 [2012-12-11] Michael Granger <ged@FaerieMUD.org>
2
+
3
+ - Allow WebSocket frames to be set to reserved opcodes
4
+ - Allow WebSocket opcodes to be set numerically
5
+ - Add a #socket_id method to all WebSocket frame types.
6
+ * Created a Mongrel2::WebSocket::Methods mixin with the
7
+ implementation of the method.
8
+ * Included the new mixin in WebSocket::Frame,
9
+ WebSocket::ClientHandshake, and WebSocket::ServerHandshake
10
+ - Ensure the ZMQ context is closed when #run exits.
5
11
 
6
12
  == v0.34.0 [2012-10-17] Michael Granger <ged@FaerieMUD.org>
7
13
 
@@ -20,10 +20,10 @@ module Mongrel2
20
20
  abort "\n\n>>> Mongrel2 requires Ruby 1.9.2 or later. <<<\n\n" if RUBY_VERSION < '1.9.2'
21
21
 
22
22
  # Library version constant
23
- VERSION = '0.34.1'
23
+ VERSION = '0.35.0'
24
24
 
25
25
  # Version-control revision constant
26
- REVISION = %q$Revision: 20d86c77d502 $
26
+ REVISION = %q$Revision: d19a29e2ca5f $
27
27
 
28
28
 
29
29
  require 'mongrel2/constants'
@@ -191,6 +191,7 @@ class Mongrel2::Connection
191
191
  ]
192
192
  end
193
193
 
194
+
194
195
  ### Returns a string containing a human-readable representation of the Connection,
195
196
  ### suitable for debugging.
196
197
  def inspect
@@ -27,6 +27,11 @@ require 'mongrel2/constants'
27
27
  # ...
28
28
  # end
29
29
  # end
30
+ #
31
+ # == References
32
+ #
33
+ # * http://tools.ietf.org/html/rfc6455
34
+ #
30
35
  module Mongrel2::WebSocket
31
36
 
32
37
  # WebSocket-related header and status constants
@@ -200,9 +205,21 @@ module Mongrel2::WebSocket
200
205
  class HandshakeError < Mongrel2::WebSocket::Error; end
201
206
 
202
207
 
208
+ # A mixin containing methods common to WebSocket frame classes.
209
+ module Methods
210
+
211
+ ### Get a string identifying the websocket the frame belongs to.
212
+ def socket_id
213
+ return [ self.sender_id, self.conn_id ].join( ':' )
214
+ end
215
+
216
+ end # module Methods
217
+
218
+
203
219
  # The client (request) handshake for a WebSocket opening handshake.
204
220
  class ClientHandshake < Mongrel2::HTTPRequest
205
- include Mongrel2::WebSocket::Constants
221
+ include Mongrel2::WebSocket::Constants,
222
+ Mongrel2::WebSocket::Methods
206
223
 
207
224
  # Set this class as the one that will handle WEBSOCKET_HANDSHAKE requests
208
225
  register_request_type( self, :WEBSOCKET_HANDSHAKE )
@@ -228,8 +245,8 @@ module Mongrel2::WebSocket
228
245
  end
229
246
 
230
247
 
231
- ### Create a Mongrel2::WebSocket::Handshake that will respond to the same server/connection as
232
- ### the receiver.
248
+ ### Create a Mongrel2::WebSocket::Handshake that will respond to the same
249
+ ### server/connection as the receiver.
233
250
  def response( protocol=nil )
234
251
  @response = super() unless @response
235
252
  if protocol
@@ -247,7 +264,8 @@ module Mongrel2::WebSocket
247
264
 
248
265
  # The server (response) handshake for a WebSocket opening handshake.
249
266
  class ServerHandshake < Mongrel2::HTTPResponse
250
- include Mongrel2::WebSocket::Constants
267
+ include Mongrel2::WebSocket::Constants,
268
+ Mongrel2::WebSocket::Methods
251
269
 
252
270
  ### Create a server handshake frame from the given client +handshake+.
253
271
  def self::from_request( handshake )
@@ -287,7 +305,8 @@ module Mongrel2::WebSocket
287
305
  # WebSocket frame class; this is used for both requests and responses in
288
306
  # WebSocket services.
289
307
  class Frame < Mongrel2::Request
290
- include Mongrel2::WebSocket::Constants
308
+ include Mongrel2::WebSocket::Constants,
309
+ Mongrel2::WebSocket::Methods
291
310
 
292
311
  # The default frame header flags: FIN + CLOSE
293
312
  DEFAULT_FLAGS = FIN_FLAG | OPCODE[:close]
@@ -409,8 +428,14 @@ module Mongrel2::WebSocket
409
428
  ### Set the frame's opcode to +code+, which should be either a numeric opcode or
410
429
  ### its equivalent name (i.e., :continuation, :text, :binary, :close, :ping, :pong)
411
430
  def opcode=( code )
412
- opcode = OPCODE[ code.to_sym ] or
413
- raise ArgumentError, "unknown opcode %p" % [ code ]
431
+ opcode = nil
432
+
433
+ if code.is_a?( Numeric )
434
+ opcode = Integer( code )
435
+ else
436
+ opcode = OPCODE[ code.to_sym ] or
437
+ raise ArgumentError, "unknown opcode %p" % [ code ]
438
+ end
414
439
 
415
440
  self.flags ^= ( self.flags & OPCODE_BITMASK )
416
441
  self.flags |= opcode
@@ -542,12 +567,7 @@ module Mongrel2::WebSocket
542
567
 
543
568
 
544
569
  ### Create a frame in response to the receiving Frame (i.e., with the same
545
- ### Mongrel2 connection ID and sender). This automatically sets up the correct
546
- ### status, Sec-WebSocket-Accept:, Connection, and Upgrade: headers based on the
547
- ### receiver. If +protocol+ is non-nil, and it matches one of the
548
- ### values listed in 'Sec-WebSocket-Protocol', it will be set as the
549
- ### Handshake's Sec-WebSocket-Protocol header. If it is non-nil, but doesn't
550
- ### match one of the request's values, a Mongrel2::WebSocket::Error is raised.
570
+ ### Mongrel2 connection ID and sender).
551
571
  def response( *flags )
552
572
  unless @response
553
573
  @response = super()
@@ -558,7 +578,7 @@ module Mongrel2::WebSocket
558
578
  @response.opcode = :pong
559
579
  IO.copy_stream( self.payload, @response.payload, 4096 )
560
580
  else
561
- @response.opcode = self.opcode
581
+ @response.opcode = self.numeric_opcode
562
582
  end
563
583
 
564
584
  # Set flags in the response
@@ -592,7 +612,7 @@ module Mongrel2::WebSocket
592
612
  when :continuation, :text, :binary, :close, :ping, :pong
593
613
  self.opcode = flag
594
614
  when Integer
595
- self.log.debug " setting Integer flags directly: 0b%08b" % [ integer ]
615
+ self.log.debug " setting Integer flags directly: 0b%08b" % [ flag ]
596
616
  self.flags |= flag
597
617
  else
598
618
  raise ArgumentError, "Don't know what the %p flag is." % [ flag ]
@@ -277,7 +277,7 @@ module Mongrel2::TestConstants # :nodoc:all
277
277
 
278
278
  # Freeze all testing constants
279
279
  constants.each do |cname|
280
- const_get(cname).freeze
280
+ const_get(cname).freeze if cname.to_s.start_with?( 'TEST' )
281
281
  end
282
282
  end
283
283
 
@@ -112,6 +112,11 @@ describe Mongrel2::WebSocket do
112
112
  }.to raise_error( Mongrel2::WebSocket::HandshakeError, /map_updates/i )
113
113
  end
114
114
 
115
+ it "has a socket identifier" do
116
+ handshake = @factory.handshake( '/websock', 'echo', 'superecho' )
117
+ handshake.socket_id.should == "#{handshake.sender_id}:#{handshake.conn_id}"
118
+ end
119
+
115
120
  end
116
121
 
117
122
 
@@ -169,6 +174,45 @@ describe Mongrel2::WebSocket do
169
174
  @factory.pong( '/websock' ).opcode.should == :pong
170
175
  end
171
176
 
177
+ it "knows that its opcode is one of the reserved ones if it's 0x3" do
178
+ @factory.create( '/websocket', '', 0x3 ).opcode.should == :reserved
179
+ end
180
+
181
+ it "knows that its opcode is one of the reserved ones if it's 0x4" do
182
+ @factory.create( '/websocket', '', 0x4 ).opcode.should == :reserved
183
+ end
184
+
185
+ it "knows that its opcode is one of the reserved ones if it's 0xB" do
186
+ @factory.create( '/websocket', '', 0xB ).opcode.should == :reserved
187
+ end
188
+
189
+ it "knows that its opcode is one of the reserved ones if it's 0xD" do
190
+ @factory.create( '/websocket', '', 0xD ).opcode.should == :reserved
191
+ end
192
+
193
+ it "knows that its opcode is one of the reserved ones if it's 0xF" do
194
+ @factory.create( '/websocket', '', 0xF ).opcode.should == :reserved
195
+ end
196
+
197
+ it "allows its opcode to be set Symbolically" do
198
+ frame = @factory.text( '/websocket', 'data' )
199
+ frame.opcode = :binary
200
+ frame.numeric_opcode.should == OPCODE[:binary]
201
+ end
202
+
203
+ it "allows its opcode to be set Numerically" do
204
+ frame = @factory.binary( '/websocket', 'data' )
205
+ frame.opcode = :text
206
+ frame.numeric_opcode.should == OPCODE[:text]
207
+ end
208
+
209
+ it "allows its opcode to be set to one of the reserved opcodes Numerically" do
210
+ frame = @factory.binary( '/websocket', 'data' )
211
+ frame.opcode = 0xC
212
+ frame.opcode.should == :reserved
213
+ frame.numeric_opcode.should == 0xC
214
+ end
215
+
172
216
  it "knows that its RSV1 flag is set if its FLAG header includes that bit" do
173
217
  @factory.ping( '/websock', 'test', :rsv1 ).should be_rsv1()
174
218
  end
@@ -240,6 +284,21 @@ describe Mongrel2::WebSocket do
240
284
  result.payload.read.should == ''
241
285
  end
242
286
 
287
+ it "allows reserved opcodes to be specified when creating a response" do
288
+ frame = @factory.text( '/websock', "some bad data" )
289
+
290
+ result = frame.response( 0xB )
291
+
292
+ result.should be_a( Mongrel2::WebSocket::Frame )
293
+ result.sender_id.should == frame.sender_id
294
+ result.conn_id.should == frame.conn_id
295
+ result.opcode.should == :reserved
296
+ result.numeric_opcode.should == 0xB
297
+
298
+ result.payload.rewind
299
+ result.payload.read.should == ''
300
+ end
301
+
243
302
  it "can be streamed in chunks instead of read all at once" do
244
303
  data = BINARY_DATA * 256
245
304
  binary = @factory.binary( '/websock', data, :fin )
@@ -251,6 +310,11 @@ describe Mongrel2::WebSocket do
251
310
  ]
252
311
  end
253
312
 
313
+ it "has a socket identifier" do
314
+ frame = @factory.text( '/websock', "data" )
315
+ frame.socket_id.should == "#{frame.sender_id}:#{frame.conn_id}"
316
+ end
317
+
254
318
  end
255
319
 
256
320
 
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.34.1.pre.357
4
+ version: 0.35.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -36,7 +36,7 @@ cert_chain:
36
36
  YUhDS0xaZFNLai9SSHVUT3QrZ2JsUmV4OEZBaDhOZUEKY21saFhlNDZwWk5K
37
37
  Z1dLYnhaYWg4NWpJang5NWhSOHZPSStOQU01aUg5a09xSzEzRHJ4YWNUS1Bo
38
38
  cWo1UGp3RgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
39
- date: 2012-12-04 00:00:00.000000000 Z
39
+ date: 2012-12-14 00:00:00.000000000 Z
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: nokogiri
metadata.gz.sig CHANGED
Binary file