class WebSocket::Extensions::Parser
Constants
- EXT
- EXT_LIST
- NOTOKEN
- NUMBER
- PARAM
- ParseError
- QUOTED
- TOKEN
Public Class Methods
parse_header(header)
click to toggle source
# File lib/websocket/extensions/parser.rb, line 17 def self.parse_header(header) offers = Offers.new return offers if header == '' or header.nil? unless header =~ EXT_LIST raise ParseError, "Invalid Sec-WebSocket-Extensions header: #{ header }" end scanner = StringScanner.new(header) value = scanner.scan(EXT) until value.nil? params = value.scan(PARAM) name = params.shift.first offer = {} params.each do |key, unquoted, quoted| if unquoted data = unquoted elsif quoted data = quoted.gsub(/\\/, '') else data = true end if data != true and data =~ NUMBER data = data =~ /\./ ? data.to_f : data.to_i(10) end if offer.has_key?(key) offer[key] = [*offer[key]] + [data] else offer[key] = data end end offers.push(name, offer) scanner.scan(/ *, */) value = scanner.scan(EXT) end offers end
serialize_params(name, params)
click to toggle source
# File lib/websocket/extensions/parser.rb, line 60 def self.serialize_params(name, params) values = [] print = lambda do |key, value| case value when Array then value.each { |v| print[key, v] } when true then values.push(key) when Numeric then values.push(key + '=' + value.to_s) else if value =~ NOTOKEN values.push(key + '="' + value.gsub(/"/, '\"') + '"') else values.push(key + '=' + value) end end end params.keys.sort.each { |key| print[key, params[key]] } ([name] + values).join('; ') end