1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# fs - Crystal implementation of a simple static file server
require "uri"
require "http"
require "option_parser"
require "yaml"
require "logger"
# Class for reading configuration information from fs.yml.
class Config
# Required settings
getter host : String # 127.0.0.1 for localhost, 0.0.0.0 for all hosts
getter port : Int32
|
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# fs - Crystal implementation of a simple static file server
require "uri"
require "http"
require "option_parser"
require "yaml"
require "logger"
require "mime"
# Class for reading configuration information from fs.yml.
class Config
# Required settings
getter host : String # 127.0.0.1 for localhost, 0.0.0.0 for all hosts
getter port : Int32
|
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
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
MyLog.debug "process_request: got path #{request_path}, method #{method}"
path = File.join(@root, request_path)
if Dir.exists?(path)
path = File.join(path, "index.html")
end
if File.exists?(path)
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
|
>
>
>
|
|
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
class Server
def initialize(config : Config)
@config = config
@root = config.root
@server = uninitialized HTTP::Server
end
# This gets called if HTTP::StaticFileHandler can't find a file.
# The most common case is a directory path, in which case
# we look for index.html in that directory.
def process_request(context : HTTP::Server::Context)
request = context.request
request_path = request.path
method = request.method
MyLog.debug "process_request: got path #{request_path}, method #{method}"
path = File.join(@root, request_path)
if Dir.exists?(path)
path = File.join(path, "index.html")
end
if File.exists?(path)
content_type = MIME.from_filename(path)
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
|