websocket 1.2.2 → 1.2.3

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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +37 -0
  3. data/.travis.yml +2 -0
  4. data/CHANGELOG.md +5 -0
  5. data/Gemfile +1 -1
  6. data/Rakefile +3 -3
  7. data/lib/websocket.rb +2 -3
  8. data/lib/websocket/error.rb +57 -25
  9. data/lib/websocket/exception_handler.rb +2 -14
  10. data/lib/websocket/frame.rb +0 -2
  11. data/lib/websocket/frame/base.rb +12 -13
  12. data/lib/websocket/frame/data.rb +1 -3
  13. data/lib/websocket/frame/handler.rb +0 -2
  14. data/lib/websocket/frame/handler/base.rb +2 -4
  15. data/lib/websocket/frame/handler/handler03.rb +149 -112
  16. data/lib/websocket/frame/handler/handler04.rb +3 -3
  17. data/lib/websocket/frame/handler/handler05.rb +3 -3
  18. data/lib/websocket/frame/handler/handler07.rb +8 -10
  19. data/lib/websocket/frame/handler/handler75.rb +10 -12
  20. data/lib/websocket/frame/incoming.rb +0 -2
  21. data/lib/websocket/frame/incoming/client.rb +0 -2
  22. data/lib/websocket/frame/incoming/server.rb +0 -2
  23. data/lib/websocket/frame/outgoing.rb +1 -3
  24. data/lib/websocket/frame/outgoing/client.rb +0 -2
  25. data/lib/websocket/frame/outgoing/server.rb +0 -2
  26. data/lib/websocket/handshake.rb +0 -2
  27. data/lib/websocket/handshake/base.rb +10 -9
  28. data/lib/websocket/handshake/client.rb +22 -35
  29. data/lib/websocket/handshake/handler.rb +0 -2
  30. data/lib/websocket/handshake/handler/base.rb +0 -2
  31. data/lib/websocket/handshake/handler/client.rb +0 -2
  32. data/lib/websocket/handshake/handler/client01.rb +0 -2
  33. data/lib/websocket/handshake/handler/client04.rb +3 -5
  34. data/lib/websocket/handshake/handler/client11.rb +0 -2
  35. data/lib/websocket/handshake/handler/client75.rb +2 -4
  36. data/lib/websocket/handshake/handler/client76.rb +6 -8
  37. data/lib/websocket/handshake/handler/server.rb +0 -1
  38. data/lib/websocket/handshake/handler/server04.rb +3 -5
  39. data/lib/websocket/handshake/handler/server75.rb +2 -4
  40. data/lib/websocket/handshake/handler/server76.rb +7 -9
  41. data/lib/websocket/handshake/server.rb +19 -24
  42. data/lib/websocket/version.rb +1 -1
  43. data/spec/frame/incoming_03_spec.rb +1 -2
  44. data/spec/frame/incoming_04_spec.rb +1 -2
  45. data/spec/frame/incoming_05_spec.rb +1 -2
  46. data/spec/frame/incoming_07_spec.rb +1 -2
  47. data/spec/frame/incoming_75_spec.rb +1 -2
  48. data/spec/support/all_client_drafts.rb +1 -1
  49. data/spec/support/all_server_drafts.rb +7 -10
  50. data/spec/support/frames_base.rb +0 -2
  51. data/spec/support/handshake_requests.rb +4 -4
  52. data/spec/support/outgoing_frames.rb +0 -1
  53. data/spec/support/overwrites.rb +0 -2
  54. data/websocket.gemspec +10 -10
  55. metadata +4 -3
@@ -4,13 +4,13 @@ module WebSocket
4
4
  module Frame
5
5
  module Handler
6
6
  class Handler04 < Handler03
7
-
8
7
  private
9
8
 
10
9
  # The only difference between draft 03 framing and draft 04 framing is
11
10
  # that the MORE bit has been changed to a FIN bit
12
- def fin; true; end
13
-
11
+ def fin
12
+ true
13
+ end
14
14
  end
15
15
  end
16
16
  end
@@ -4,10 +4,10 @@ module WebSocket
4
4
  module Frame
5
5
  module Handler
6
6
  class Handler05 < Handler04
7
-
8
7
  # Since handler 5 masking should be enabled by default
9
- def masking?; true; end
10
-
8
+ def masking?
9
+ true
10
+ end
11
11
  end
12
12
  end
13
13
  end
@@ -4,7 +4,6 @@ module WebSocket
4
4
  module Frame
5
5
  module Handler
6
6
  class Handler07 < Handler05
7
-
8
7
  # Hash of frame names and it's opcodes
9
8
  FRAME_TYPES = {
10
9
  continuation: 0,
@@ -12,7 +11,7 @@ module WebSocket
12
11
  binary: 2,
13
12
  close: 8,
14
13
  ping: 9,
15
- pong: 10,
14
+ pong: 10
16
15
  }
17
16
 
18
17
  # Hash of frame opcodes and it's names
@@ -21,7 +20,7 @@ module WebSocket
21
20
  def encode_frame
22
21
  if @frame.type == :close
23
22
  code = @frame.code || 1000
24
- raise WebSocket::Error::Frame::UnknownCloseCode unless valid_code?(code)
23
+ fail WebSocket::Error::Frame::UnknownCloseCode unless valid_code?(code)
25
24
  @frame.data = Data.new([code].pack('n') + @frame.data.to_s)
26
25
  @frame.code = nil
27
26
  end
@@ -30,11 +29,11 @@ module WebSocket
30
29
 
31
30
  def decode_frame
32
31
  result = super
33
- if has_close_code?(result)
32
+ if close_code?(result)
34
33
  code = result.data.slice!(0..1)
35
34
  result.code = code.unpack('n').first
36
- raise WebSocket::Error::Frame::UnknownCloseCode unless valid_code?(result.code)
37
- raise WebSocket::Error::Frame::InvalidPayloadEncoding unless valid_encoding?(result.data)
35
+ fail WebSocket::Error::Frame::UnknownCloseCode unless valid_code?(result.code)
36
+ fail WebSocket::Error::Frame::InvalidPayloadEncoding unless valid_encoding?(result.data)
38
37
  end
39
38
  result
40
39
  end
@@ -53,7 +52,7 @@ module WebSocket
53
52
  false
54
53
  end
55
54
 
56
- def has_close_code?(frame)
55
+ def close_code?(frame)
57
56
  frame && frame.type == :close && !frame.data.empty?
58
57
  end
59
58
 
@@ -62,7 +61,7 @@ module WebSocket
62
61
  # @return [Integer] opcode or nil
63
62
  # @raise [WebSocket::Error] if frame opcode is not known
64
63
  def type_to_opcode(frame_type)
65
- FRAME_TYPES[frame_type] || raise(WebSocket::Error::Frame::UnknownFrameType)
64
+ FRAME_TYPES[frame_type] || fail(WebSocket::Error::Frame::UnknownFrameType)
66
65
  end
67
66
 
68
67
  # Convert frame opcode to type name
@@ -70,9 +69,8 @@ module WebSocket
70
69
  # @return [Symbol] Frame type name or nil
71
70
  # @raise [WebSocket::Error] if frame type name is not known
72
71
  def opcode_to_type(opcode)
73
- FRAME_TYPES_INVERSE[opcode] || raise(WebSocket::Error::Frame::UnknownOpcode)
72
+ FRAME_TYPES_INVERSE[opcode] || fail(WebSocket::Error::Frame::UnknownOpcode)
74
73
  end
75
-
76
74
  end
77
75
  end
78
76
  end
@@ -4,7 +4,6 @@ module WebSocket
4
4
  module Frame
5
5
  module Handler
6
6
  class Handler75 < Base
7
-
8
7
  # @see WebSocket::Frame::Base#supported_frames
9
8
  def supported_frames
10
9
  [:text, :close]
@@ -13,12 +12,12 @@ module WebSocket
13
12
  # @see WebSocket::Frame::Handler::Base#encode_frame
14
13
  def encode_frame
15
14
  case @frame.type
16
- when :close then "\xff\x00"
17
- when :text then
18
- ary = ["\x00", @frame.data, "\xff"]
19
- ary.map { |s| s.encode('UTF-8', 'UTF-8', invalid: :replace) }
20
- ary.join
21
- else raise WebSocket::Error::Frame::UnknownFrameType
15
+ when :close then "\xff\x00"
16
+ when :text then
17
+ ary = ["\x00", @frame.data, "\xff"]
18
+ ary.map { |s| s.encode('UTF-8', 'UTF-8', invalid: :replace) }
19
+ ary.join
20
+ else fail WebSocket::Error::Frame::UnknownFrameType
22
21
  end
23
22
  end
24
23
 
@@ -43,9 +42,9 @@ module WebSocket
43
42
  break unless (b & 0x80) == 0x80
44
43
  end
45
44
 
46
- raise WebSocket::Error::Frame::TooLong if length > ::WebSocket.max_frame_size
45
+ fail WebSocket::Error::Frame::TooLong if length > ::WebSocket.max_frame_size
47
46
 
48
- unless @frame.data.getbyte(pointer + length - 1) == nil
47
+ unless @frame.data.getbyte(pointer + length - 1).nil?
49
48
  # Straight from spec - I'm sure this isn't crazy...
50
49
  # 6. Read /length/ bytes.
51
50
  # 7. Discard the read bytes.
@@ -59,10 +58,10 @@ module WebSocket
59
58
  else
60
59
  # If the high-order bit of the /frame type/ byte is _not_ set
61
60
 
62
- raise WebSocket::Error::Frame::Invalid if @frame.data.getbyte(0) != 0x00
61
+ fail WebSocket::Error::Frame::Invalid if @frame.data.getbyte(0) != 0x00
63
62
 
64
63
  # Addition to the spec to protect against malicious requests
65
- raise WebSocket::Error::Frame::TooLong if @frame.data.size > ::WebSocket.max_frame_size
64
+ fail WebSocket::Error::Frame::TooLong if @frame.data.size > ::WebSocket.max_frame_size
66
65
 
67
66
  msg = @frame.data.slice!(/\A\x00[^\xff]*\xff/)
68
67
  if msg
@@ -72,7 +71,6 @@ module WebSocket
72
71
  end
73
72
  end
74
73
  end
75
-
76
74
  end
77
75
  end
78
76
  end
@@ -9,7 +9,6 @@ module WebSocket
9
9
  # frame.next # "Hello"
10
10
  # frame.next # "world!""
11
11
  class Incoming < Base
12
-
13
12
  autoload :Client, "#{::WebSocket::ROOT}/websocket/frame/incoming/client"
14
13
  autoload :Server, "#{::WebSocket::ROOT}/websocket/frame/incoming/server"
15
14
 
@@ -46,7 +45,6 @@ module WebSocket
46
45
  def to_s
47
46
  @data
48
47
  end
49
-
50
48
  end
51
49
  end
52
50
  end
@@ -2,7 +2,6 @@ module WebSocket
2
2
  module Frame
3
3
  class Incoming
4
4
  class Client < Incoming
5
-
6
5
  def incoming_masking?
7
6
  false
8
7
  end
@@ -10,7 +9,6 @@ module WebSocket
10
9
  def outgoing_masking?
11
10
  @handler.masking?
12
11
  end
13
-
14
12
  end
15
13
  end
16
14
  end
@@ -2,7 +2,6 @@ module WebSocket
2
2
  module Frame
3
3
  class Incoming
4
4
  class Server < Incoming
5
-
6
5
  def incoming_masking?
7
6
  @handler.masking?
8
7
  end
@@ -10,7 +9,6 @@ module WebSocket
10
9
  def outgoing_masking?
11
10
  false
12
11
  end
13
-
14
12
  end
15
13
  end
16
14
  end
@@ -7,7 +7,6 @@ module WebSocket
7
7
  # frame = WebSocket::Frame::Outgoing::Server.new(version: @handshake.version, data: "Hello", type: :text)
8
8
  # frame.to_s # "\x81\x05\x48\x65\x6c\x6c\x6f"
9
9
  class Outgoing < Base
10
-
11
10
  autoload :Client, "#{::WebSocket::ROOT}/websocket/frame/outgoing/client"
12
11
  autoload :Server, "#{::WebSocket::ROOT}/websocket/frame/outgoing/server"
13
12
 
@@ -25,11 +24,10 @@ module WebSocket
25
24
 
26
25
  # Return raw frame formatted for sending.
27
26
  def to_s
28
- raise WebSocket::Error::Frame::UnknownFrameType unless supported?
27
+ fail WebSocket::Error::Frame::UnknownFrameType unless supported?
29
28
  @handler.encode_frame
30
29
  end
31
30
  rescue_method :to_s
32
-
33
31
  end
34
32
  end
35
33
  end
@@ -2,7 +2,6 @@ module WebSocket
2
2
  module Frame
3
3
  class Outgoing
4
4
  class Client < Outgoing
5
-
6
5
  def incoming_masking?
7
6
  false
8
7
  end
@@ -10,7 +9,6 @@ module WebSocket
10
9
  def outgoing_masking?
11
10
  @handler.masking?
12
11
  end
13
-
14
12
  end
15
13
  end
16
14
  end
@@ -2,7 +2,6 @@ module WebSocket
2
2
  module Frame
3
3
  class Outgoing
4
4
  class Server < Outgoing
5
-
6
5
  def incoming_masking?
7
6
  @handler.masking?
8
7
  end
@@ -10,7 +9,6 @@ module WebSocket
10
9
  def outgoing_masking?
11
10
  false
12
11
  end
13
-
14
12
  end
15
13
  end
16
14
  end
@@ -1,10 +1,8 @@
1
1
  module WebSocket
2
2
  module Handshake
3
-
4
3
  autoload :Base, "#{::WebSocket::ROOT}/websocket/handshake/base"
5
4
  autoload :Client, "#{::WebSocket::ROOT}/websocket/handshake/client"
6
5
  autoload :Handler, "#{::WebSocket::ROOT}/websocket/handshake/handler"
7
6
  autoload :Server, "#{::WebSocket::ROOT}/websocket/handshake/server"
8
-
9
7
  end
10
8
  end
@@ -9,16 +9,18 @@ module WebSocket
9
9
 
10
10
  # Initialize new WebSocket Handshake and set it's state to :new
11
11
  def initialize(args = {})
12
+ args.each { |k, v| instance_variable_set("@#{k}", v) }
13
+
12
14
  @state = :new
13
15
  @handler = nil
14
16
 
15
17
  @data = ''
16
- @headers = {}
18
+ @headers ||= {}
17
19
  end
18
20
 
19
21
  # @abstract Add data to handshake
20
22
  def <<(data)
21
- raise NotImplementedError
23
+ @data << data
22
24
  end
23
25
 
24
26
  # Return textual representation of handshake request or response
@@ -30,8 +32,8 @@ module WebSocket
30
32
 
31
33
  # Recreate inspect as #to_s was overwritten
32
34
  def inspect
33
- vars = self.instance_variables.map { |v| "#{v}=#{instance_variable_get(v).inspect}" }.join(', ')
34
- insp = "#{self.class}:0x%08x" % (self.__id__ * 2)
35
+ vars = instance_variables.map { |v| "#{v}=#{instance_variable_get(v).inspect}" }.join(', ')
36
+ insp = Kernel.format("#{self.class}:0x%08x", __id__)
35
37
  "<#{insp} #{vars}>"
36
38
  end
37
39
 
@@ -44,19 +46,19 @@ module WebSocket
44
46
  # Is parsed data valid?
45
47
  # @return [Boolean] False if some errors occured. Reason for error could be found in error method
46
48
  def valid?
47
- finished? && @error == nil && @handler && @handler.valid?
49
+ finished? && @error.nil? && @handler && @handler.valid?
48
50
  end
49
51
  rescue_method :valid?, return: false
50
52
 
51
53
  # @abstract Should send data after parsing is finished?
52
54
  def should_respond?
53
- raise NotImplementedError
55
+ fail NotImplementedError
54
56
  end
55
57
 
56
58
  # Data left from parsing. Sometimes data that doesn't belong to handshake are added - use this method to retrieve them.
57
59
  # @return [String] String if some data are available. Nil otherwise
58
60
  def leftovers
59
- (@leftovers.to_s.split("\n", reserved_leftover_lines + 1)[reserved_leftover_lines] || "").strip
61
+ (@leftovers.to_s.split("\n", reserved_leftover_lines + 1)[reserved_leftover_lines] || '').strip
60
62
  end
61
63
 
62
64
  # URI of request.
@@ -82,7 +84,7 @@ module WebSocket
82
84
 
83
85
  # Changes state to error and sets error message
84
86
  # @param [String] message Error message to set
85
- def set_error(message)
87
+ def error=(message)
86
88
  @state = :error
87
89
  super
88
90
  end
@@ -108,7 +110,6 @@ module WebSocket
108
110
  @state = :finished
109
111
  true
110
112
  end
111
-
112
113
  end
113
114
  end
114
115
  end
@@ -32,7 +32,6 @@ module WebSocket
32
32
  # @handshake.valid?
33
33
  #
34
34
  class Client < Base
35
-
36
35
  attr_reader :origin, :headers
37
36
 
38
37
  # Initialize new WebSocket Client
@@ -55,28 +54,19 @@ module WebSocket
55
54
  def initialize(args = {})
56
55
  super
57
56
 
58
- @version = args[:version] || DEFAULT_VERSION
59
- @origin = args[:origin]
60
- @headers = args[:headers] || {}
61
-
62
- if args[:url] || args[:uri]
63
- uri = URI.parse(args[:url] || args[:uri])
64
- @secure = (uri.scheme == 'wss')
65
- @host = uri.host
66
- @port = uri.port
67
- @path = uri.path
68
- @query = uri.query
57
+ if @url || @uri
58
+ uri = URI.parse(@url || @uri)
59
+ @secure ||= (uri.scheme == 'wss')
60
+ @host ||= uri.host
61
+ @port ||= uri.port
62
+ @path ||= uri.path
63
+ @query ||= uri.query
69
64
  end
70
65
 
71
- @secure = args[:secure] if args[:secure]
72
- @host = args[:host] if args[:host]
73
- @port = args[:port] if args[:port]
74
- @path = args[:path] if args[:path]
75
- @query = args[:query] if args[:query]
66
+ @path = '/' if @path.nil? || @path.empty?
67
+ @version ||= DEFAULT_VERSION
76
68
 
77
- @path = '/' if @path.nil? || @path.empty?
78
-
79
- raise WebSocket::Error::Handshake::NoHostProvided unless @host
69
+ fail WebSocket::Error::Handshake::NoHostProvided unless @host
80
70
 
81
71
  include_version
82
72
  end
@@ -95,10 +85,8 @@ module WebSocket
95
85
  #
96
86
  # EOF
97
87
  def <<(data)
98
- @data << data
99
- if parse_data
100
-
101
- end
88
+ super
89
+ parse_data
102
90
  end
103
91
  rescue_method :<<
104
92
 
@@ -114,27 +102,26 @@ module WebSocket
114
102
  # @return [Boolean] false if protocol number is unknown, otherwise true
115
103
  def include_version
116
104
  @handler = case @version
117
- when 75 then Handler::Client75.new(self)
118
- when 76, 0 then Handler::Client76.new(self)
119
- when 1..3 then Handler::Client01.new(self)
120
- when 4..10 then Handler::Client04.new(self)
121
- when 11..17 then Handler::Client11.new(self)
122
- else raise WebSocket::Error::Handshake::UnknownVersion
123
- end
105
+ when 75 then Handler::Client75.new(self)
106
+ when 76, 0 then Handler::Client76.new(self)
107
+ when 1..3 then Handler::Client01.new(self)
108
+ when 4..10 then Handler::Client04.new(self)
109
+ when 11..17 then Handler::Client11.new(self)
110
+ else fail WebSocket::Error::Handshake::UnknownVersion
111
+ end
124
112
  end
125
113
 
126
- FIRST_LINE = /^HTTP\/1\.1 (\d{3})[\w\s]*$/
114
+ FIRST_LINE = %r{^HTTP\/1\.1 (\d{3})[\w\s]*$}
127
115
 
128
116
  # Parse first line of Server response.
129
117
  # @param [String] line Line to parse
130
118
  # @return [Boolean] True if parsed correctly. False otherwise
131
119
  def parse_first_line(line)
132
120
  line_parts = line.match(FIRST_LINE)
133
- raise WebSocket::Error::Handshake::InvalidHeader unless line_parts
121
+ fail WebSocket::Error::Handshake::InvalidHeader unless line_parts
134
122
  status = line_parts[1]
135
- raise WebSocket::Error::Handshake::InvalidStatusCode unless status == '101'
123
+ fail WebSocket::Error::Handshake::InvalidStatusCode unless status == '101'
136
124
  end
137
-
138
125
  end
139
126
  end
140
127
  end
@@ -1,7 +1,6 @@
1
1
  module WebSocket
2
2
  module Handshake
3
3
  module Handler
4
-
5
4
  autoload :Base, "#{::WebSocket::ROOT}/websocket/handshake/handler/base"
6
5
 
7
6
  autoload :Client, "#{::WebSocket::ROOT}/websocket/handshake/handler/client"
@@ -15,7 +14,6 @@ module WebSocket
15
14
  autoload :Server04, "#{::WebSocket::ROOT}/websocket/handshake/handler/server04"
16
15
  autoload :Server75, "#{::WebSocket::ROOT}/websocket/handshake/handler/server75"
17
16
  autoload :Server76, "#{::WebSocket::ROOT}/websocket/handshake/handler/server76"
18
-
19
17
  end
20
18
  end
21
19
  end