class WebSocket::Handshake::Base
@abstract Subclass and override to implement custom handshakes
def <<(data)
- Abstract: - Add data to handshake
def <<(data) @data << data end
def default_port
def default_port secure ? 443 : 80 end
def default_port?
def default_port? port == default_port end
def error=(message)
-
message
(String
) -- Error message to set
def error=(message) @state = :error super end
def finished?
-
(Boolena)
- True if request was completely parsed or error occured. False otherwise
def finished? @state == :finished || @state == :error end
def initialize(args = {})
def initialize(args = {}) args.each do |k, v| value = begin v.dup rescue TypeError v end instance_variable_set("@#{k}", value) end @state = :new @handler = nil @data = String.new('') @headers ||= {} @protocols ||= [] end
def leftovers
-
(String)
- String if some data are available. Nil otherwise
def leftovers (@leftovers.to_s.split("\n", reserved_leftover_lines + 1)[reserved_leftover_lines] || '').strip end
def parse_data
-
(Boolean)
- True if finished parsing. False if not all data received yet.
def parse_data header, @leftovers = @data.split("\r\n\r\n", 2) return false unless @leftovers # The whole header has not been received yet. lines = header.split("\r\n") first_line = lines.shift parse_first_line(first_line) lines.each do |line| h = HEADER.match(line) next unless h # Skip any invalid headers key = h[1].strip.downcase val = h[2].strip # If the header is already set and refers to the websocket protocol, append the new value if @headers.key?(key) && key =~ /^(sec-)?websocket-protocol$/ @headers[key] << ", #{val}" else @headers[key] = val end end @state = :finished true end
def port
def port @port || default_port end
def reserved_leftover_lines
-
(Integer)
- Number of lines
def reserved_leftover_lines 0 end
def should_respond?
- Abstract: - Should send data after parsing is finished?
def should_respond? raise NotImplementedError end
def to_s
-
(String)
- text of response
def to_s @handler ? @handler.to_s : '' end
def uri
-
(String)
- Full URI with protocol
def uri uri = String.new(secure ? 'wss://' : 'ws://') uri << host uri << ":#{port}" unless default_port? uri << path uri << "?#{query}" if query uri end
def valid?
-
(Boolean)
- False if some errors occured. Reason for error could be found in error method
def valid? finished? && @error.nil? && @handler && @handler.valid? end