module WebSocket::HTTP::Headers
def complete
def complete @stage = 2 end
def complete?
def complete? @stage == 2 end
def error
def error @stage = -1 end
def error?
def error? @stage == -1 end
def header_line(line)
def header_line(line) return false unless parsed = line.scan(HEADER_LINE).first @headers[HTTP.normalize_header(parsed[0])] = parsed[1].strip true end
def initialize
def initialize @buffer = [] @headers = {} @stage = 0 end
def parse(data)
def parse(data) data.each_byte do |byte| if byte == LF and @stage < 2 @buffer.pop if @buffer.last == CR if @buffer.empty? complete if @stage == 1 else result = case @stage when 0 then start_line(string_buffer) when 1 then header_line(string_buffer) end if result @stage = 1 else error end end @buffer = [] else @buffer << byte if @stage >= 0 error if @stage < 2 and @buffer.size > MAX_LINE_LENGTH end end @env['rack.input'] = StringIO.new(string_buffer) if @env end
def string_buffer
def string_buffer @buffer.pack('C*') end