diff --git a/fake_tunnel_connector/fake_tunnel_connector.rb b/fake_tunnel_connector/fake_tunnel_connector.rb new file mode 100644 index 0000000..96cd361 --- /dev/null +++ b/fake_tunnel_connector/fake_tunnel_connector.rb @@ -0,0 +1,68 @@ +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 \ No newline at end of file diff --git a/fake_tunnel_connector/http.rb b/fake_tunnel_connector/http.rb new file mode 100644 index 0000000..c6827d8 --- /dev/null +++ b/fake_tunnel_connector/http.rb @@ -0,0 +1,3 @@ +class Http + METHODS = %w[options get head post put delete trace connect].map(&:upcase) +end