require 'socket' require './http.rb' require 'time' class FakeTunnelConnector attr_accessor :port, :server def initialize(port) @port = port @server = TCPServer.open(port) end def listen_and_respond tcp_socket = server.accept read_socket(tcp_socket) write_response(tcp_socket) tcp_socket.close end def read_socket(tcp_socket) headers = [] puts "Request Incoming:" puts "-------------------" # read lines from socket while (line = tcp_socket.gets) && (line.chomp.length > 0) # check for a valid http verb sent puts parse_http_start_request_line(line) if Http::METHODS.include?(line.split.first) header_line = parse_http_header_request_line(line) headers << header_line unless header_line.nil? end puts "Request Headers:" puts "-------------------" puts headers puts "\r\n" end def parse_http_start_request_line(line) split_request = line.split verb = split_request.first location = split_request.select { |l| l if l.start_with?('/') }.first protocol = split_request.last { verb: verb, location: location, protocol: protocol } end def parse_http_header_request_line(line) if line.split.first.end_with?(':') split_request = line.split(':') key = split_request[0] value = if split_request.count >= 3 split_request[1] + ':' + split_request[2] else split_request[1] end Hash[key, value] end end def write_response(tcp_socket) tcp_socket.sendmsg(ok) end def ok "HTTP/1.1 200 OK\r\nDate: #{Time.now.utc}\r\n\r\nSuccess!\r\n" end end