Index: src/fs.cr ================================================================== --- src/fs.cr +++ src/fs.cr @@ -89,37 +89,44 @@ # Simple HTTP server for static files. class Server def initialize(config : Config) @config = config + @root = config.root @server = uninitialized HTTP::Server end def process_request(context : HTTP::Server::Context) request = context.request request_path = request.path method = request.method - root = @config.root MyLog.debug "process_request: got path #{request_path}, method #{method}" - path = File.join(root, request_path) + path = File.join(@root, request_path) if Dir.exists?(path) path = File.join(path, "index.html") end if File.exists?(path) - context.response.content_type = `file -b --mime-type #{path}`.strip + content_type = `file -b --mime-type #{path}`.strip + context.response.content_type = content_type + MyLog.info "Serving #{path}, content type #{content_type}" File.open(path) { |file| IO.copy(file, context.response) } else + MyLog.error "No such file #{path}" context.response.respond_with_status(404, "No such file #{request_path}") end end def start - @server = HTTP::Server.new do |context| - process_request(context) - end + @server = HTTP::Server.new([ + HTTP::ErrorHandler.new, + HTTP::LogHandler.new, + HTTP::StaticFileHandler.new(@root, directory_listing: false) + ]) do |context| + process_request(context) + end if @server address = @server.bind_tcp @config.host, @config.port puts "Listening on http://#{address}"