class WebSocket::Extensions::Parser

def self.parse_header(header)

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

def self.serialize_params(name, params)

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