You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
889 B
Ruby

#!/usr/bin/ruby
require 'net/http'
require 'socket'
PORT = 8081
HTTP_GET = "GET"
HTTP_POST = "POST"
HTTP_QUERY = "QUERY"
QDIR = ARGV[0]
class Request
attr_reader :method
attr_reader :data
attr_reader :uri
attr_reader :version
attr_reader :headers
def parse_request(str)
@method = @data[0].split(" ")[0]
@uri = @data[0].split(" ")[1]
@version = @data[0].split(" ")[2]
@headers = @data.map.drop(1) { |header|
{header.split(": ")[0] => header.split(": ")[1]}
}
end
def initialize(cli)
@data = [cli.gets]
parse_request(@data)
end
end
TCPServer.open("127.0.0.1", PORT) { |srv|
mutex = Mutex.new
loop do
Thread.start(srv.accept) { |cli|
mutex.synchronize do
h = Request.new(cli)
case h.method
when HTTP_QUERY
cli.write Dir.children(QDIR).join("\n")
else
cli.write("unknown method: #{h.method}")
end
cli.close
end
}
end
}