misc_rbtools/fake_tunnel_connector/fake_tunnel_connector.rb

68 lines
No EOL
1.7 KiB
Ruby

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