Class: Protocol::WebSocket::CloseFrame

Inherits:
Frame
  • Object
show all
Defined in:
lib/protocol/websocket/close_frame.rb

Overview

Represents a close frame that is sent or received by a WebSocket connection.

Constant Summary collapse

OPCODE =
0x8
FORMAT =
"na*"

Constants inherited from Frame

Frame::RESERVED, Frame::RSV1, Frame::RSV2, Frame::RSV3

Instance Attribute Summary

Attributes inherited from Frame

#finished, #flags, #mask, #opcode, #payload

Instance Method Summary collapse

Methods inherited from Frame

#<=>, #continued?, #control?, #data?, #finished?, #flag?, #initialize, #length, #to_ary

Constructor Details

This class inherits a constructor from Protocol::WebSocket::Frame

Instance Method Details

#apply(connection) ⇒ Object

Apply this frame to the specified connection.



71
72
73
# File 'lib/protocol/websocket/close_frame.rb', line 71

def apply(connection)
	connection.receive_close(self)
end

#pack(code = nil, reason = nil) ⇒ Object

Pack a close code and reason into the frame data. If code is missing, reason is ignored.



50
51
52
53
54
55
56
57
58
59
60
# File 'lib/protocol/websocket/close_frame.rb', line 50

def pack(code = nil, reason = nil)
	if code
		if reason and reason.encoding != Encoding::UTF_8
			reason = reason.encode(Encoding::UTF_8)
		end
		
		super([code, reason].pack(FORMAT))
	else
		super()
	end
end

#reply(code = Error::NO_ERROR, reason = "") ⇒ Object

Generate a suitable reply.



64
65
66
67
68
# File 'lib/protocol/websocket/close_frame.rb', line 64

def reply(code = Error::NO_ERROR, reason = "")
	frame = CloseFrame.new
	frame.pack(code, reason)
	return frame
end

#unpackObject

Unpack the frame data into a close code and reason.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/protocol/websocket/close_frame.rb', line 18

def unpack
	data = super
	
	case data.length
	when 0
		[nil, nil]
	when 1
		raise ProtocolError, "Invalid close frame length!"
	else
		code, reason = *data.unpack(FORMAT)
		
		case code
		when 0 .. 999, 1005 .. 1006, 1015, 5000 .. 0xFFFF
			raise ProtocolError, "Invalid close code!"
		when 1004, 1016 .. 2999
			raise ProtocolError, "Reserved close code!"
		end
		
		reason.force_encoding(Encoding::UTF_8)
		
		unless reason.valid_encoding?
			raise ProtocolError, "Invalid UTF-8 in close reason!"
		end
		
		[code, reason]
	end
end