class Kwipper::HttpParser

Constants

HEADER_DELIMITER

Public Instance Methods

parse(raw_request) click to toggle source
# File lib/kwipper/http_parser.rb, line 5
def parse(raw_request)
  @first_line = raw_request.gets

  if @first_line.nil?
    raise Kwipper::EmptyRequest, 'could not get first line'
  else
    Request.new do |r|
      r.http_method = @first_line.split(' ').first
      r.path      = parse_path
      r.query     = parse_query
      r.headers   = parse_headers raw_request
      r.post_data = parse_query_string raw_request.read(r.content_length) if r.post_data?
    end
  end
end

Private Instance Methods

parse_headers(raw_request) click to toggle source
# File lib/kwipper/http_parser.rb, line 34
def parse_headers(raw_request)
  lines = []

  while (line = raw_request.gets) != HEADER_DELIMITER
    lines << line.chomp
  end

  lines.each_with_object RequestHeaders.new do |line, request_headers|
    key, val = line.split(/:\s?/)
    request_headers[key] = val
  end
end
parse_path() click to toggle source
# File lib/kwipper/http_parser.rb, line 23
def parse_path
  p = @first_line.split(' ')[1]
  p ? p.split('?').first : '/'
end
parse_query() click to toggle source
# File lib/kwipper/http_parser.rb, line 28
def parse_query
  p = @first_line.split(' ')[1]
  q = p && !p['?'].nil? ? p.split('?').last.chomp : nil
  parse_query_string q
end
parse_query_string(s) click to toggle source
# File lib/kwipper/http_parser.rb, line 47
def parse_query_string(s)
  Rack::Utils.parse_nested_query s.to_s
end