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