68 lines
No EOL
1.7 KiB
Ruby
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 |