fs - simple file server

Diff
Login

Diff

Differences From Artifact [ff1867bb3f]:

To Artifact [9e83e4bd7a]:


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