added a fake tunnel tcp server

This commit is contained in:
Brendan McDevitt 2020-07-20 15:12:09 -05:00
parent de91015f50
commit 60a9afeb06
2 changed files with 71 additions and 0 deletions

View file

@ -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

View file

@ -0,0 +1,3 @@
class Http
METHODS = %w[options get head post put delete trace connect].map(&:upcase)
end