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