class Minver::Parser

Public Class Methods

new(stream_or_string) click to toggle source
# File lib/minver/parser.rb, line 5
def initialize(stream_or_string)
  @stream = if stream_or_string.is_a? String
    StringIO.new(stream_or_string)
  else
    stream_or_string
  end
end

Public Instance Methods

[](key) click to toggle source
# File lib/minver/parser.rb, line 27
def [](key)
  headers[key]
end
body() click to toggle source
# File lib/minver/parser.rb, line 35
def body
  @body ||= @stream.read(headers["Content-Length"].to_i)
end
data() click to toggle source
# File lib/minver/parser.rb, line 31
def data
  @data ||= [*head, body].join
end
headers() click to toggle source
# File lib/minver/parser.rb, line 21
def headers
  @headers ||= header_lines.inject({}) do |h, line|
    h.merge(Hash[[line.rstrip.split(': ', 2)]])
  end
end
http_method() click to toggle source
# File lib/minver/parser.rb, line 13
def http_method
  @http_method ||= request_match[1]
end
path() click to toggle source
# File lib/minver/parser.rb, line 39
def path
  @path ||= request_uri.first
end
query_string() click to toggle source
# File lib/minver/parser.rb, line 43
def query_string
  @query_string ||= request_uri[1] || ''
end
request_http_version() click to toggle source
# File lib/minver/parser.rb, line 17
def request_http_version
  @request_http_version ||= request_match[3]
end

Protected Instance Methods

head() click to toggle source
# File lib/minver/parser.rb, line 64
def head
  @head ||= "".tap do |h|
    begin
      h << line = @stream.readline # TODO: non-blocking
    end until ["\r\n", "\n"].include? line
  end
end
header_lines() click to toggle source
# File lib/minver/parser.rb, line 60
def header_lines
  @header_lines ||= head.lines[1...-1]
end
request_line() click to toggle source
# File lib/minver/parser.rb, line 56
def request_line
  @request_line ||= head.lines.first
end
request_match() click to toggle source
# File lib/minver/parser.rb, line 52
def request_match
  @request_match ||= request_line.match(/(\S+)\s+(\S+)(?:\s+HTTP\/(\S+)?)/)
end
request_uri() click to toggle source
# File lib/minver/parser.rb, line 48
def request_uri
  @request_uri ||= request_match[2].split('?', 2)
end