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