module WebSocket::HTTP::Headers

Constants

CR
HEADER_LINE

RFC 2616 grammar rules:

  CHAR           = <any US-ASCII character (octets 0 - 127)>

  CTL            = <any US-ASCII control character
                   (octets 0 - 31) and DEL (127)>

  SP             = <US-ASCII SP, space (32)>

  HT             = <US-ASCII HT, horizontal-tab (9)>

  token          = 1*<any CHAR except CTLs or separators>

  separators     = "(" | ")" | "<" | ">" | "@"
                 | "," | ";" | ":" | "\" | <">
                 | "/" | "[" | "]" | "?" | "="
                 | "{" | "}" | SP | HT

Or, as redefined in RFC 7230:

  token          = 1*tchar

  tchar          = "!" / "#" / "$" / "%" / "&" / "'" / "*"
                 / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
                 / DIGIT / ALPHA
                 ; any VCHAR, except delimiters
LF
MAX_LINE_LENGTH

Attributes

headers[R]

Public Class Methods

new() click to toggle source
# File lib/websocket/http/headers.rb, line 40
def initialize
  @buffer  = []
  @headers = {}
  @stage   = 0
end

Public Instance Methods

complete?() click to toggle source
# File lib/websocket/http/headers.rb, line 46
def complete?
  @stage == 2
end
error?() click to toggle source
# File lib/websocket/http/headers.rb, line 50
def error?
  @stage == -1
end
parse(data) click to toggle source
# File lib/websocket/http/headers.rb, line 54
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

Private Instance Methods

complete() click to toggle source
# File lib/websocket/http/headers.rb, line 83
def complete
  @stage = 2
end
error() click to toggle source
# File lib/websocket/http/headers.rb, line 87
def error
  @stage = -1
end
header_line(line) click to toggle source
# File lib/websocket/http/headers.rb, line 91
def header_line(line)
  return false unless parsed = line.scan(HEADER_LINE).first
  @headers[HTTP.normalize_header(parsed[0])] = parsed[1].strip
  true
end
string_buffer() click to toggle source
# File lib/websocket/http/headers.rb, line 97
def string_buffer
  @buffer.pack('C*')
end