adsf
adsf (A Dead Simple Fileserver) is a tiny static web server that you can launch instantly in any directory, like this:
▸ ls -l
total 0
drwxr-xr-x 2 ddfreyne staff 68 May 29 10:04 about
drwxr-xr-x 2 ddfreyne staff 68 May 29 10:04 contact
-rw-r--r-- 1 ddfreyne staff 0 May 29 10:04 index.html
drwxr-xr-x 2 ddfreyne staff 68 May 29 10:04 projects
▸ adsf
[2017-11-19 11:49:20] INFO WEBrick 1.3.1
[2017-11-19 11:49:20] INFO ruby 2.4.2 (2017-09-14) [x86_64-darwin17]
[2017-11-19 11:49:20] INFO WEBrick::HTTPServer#start: pid=95218 port=3000
… and now you can go to http://localhost:3000/ and start browsing.
See adsf --help
for details.
To use adsf --live-reload
, please install the separate adsf-live
gem. (The live-reload support is not part of adsf itself, because the dependencies of adsf-live
make it difficult to install under some circumstances.)
Using adsf programmatically
Server
Adsf::Server
runs a web server programmatically. For example:
server = Adsf::Server.new(root: 'public')
%w[INT TERM].each do |s|
Signal.trap(s) { server.stop }
end
server.run
It takes the following options:
-
root
(required): the path to the web root -
index_filenames
(optional; defaults to['index.html']
): (see below) -
auto_extensions
(optional; defaults to[]
; can be a string or an array of strings): If present, the server will automatically append the given extensions when searching for files. For example,auto_extensions: ".html"
would cause a request for/foo
to serve/foo.html
if there is no file or directory named/foo
. -
host
(optional; defaults to'127.0.0.1'
): the address of the network interface to listen on -
port
(optional; defaults to3000
): the port to listen on -
handler
(optional): the Rack handler to use
IndexFileFinder
If you are assembling your own Rack configuration, you can use adsf’s Adsf::Rack::IndexFileFinder
middleware to make Rack load an index file (e.g. index.html
) when requesting a directory. For example, the following runs a web server with the 'public' directory as its web root:
use Adsf::Rack::IndexFileFinder, root: 'public'
run Rack::Files.new('public')
It takes the following options:
-
root
(required): the path to the web root -
index_filenames
(optional; defaults to['index.html']
): contains the names of the index filenames that will be served when a directory containing an index file is requested. Usually, this will simply be['index.html']
, but under different circumstances (when using IIS, for example), the array may have to be modified to include index filenames such asdefault.html
orindex.xml
. Here’s an example middleware/application stack that uses custom index filenames:use Adsf::Rack::IndexFileFinder, root: 'public', index_filenames: %w[index.html index.xhtml] run Rack::Files.new('public')
Why not use Rack::Static
? Rack comes with Rack::Static
, whose purpose is similar to, but not the same as, Adsf::Rack::IndexFileFinder
. In particular:
-
Adsf::Rack::IndexFileFinder
does not serve files, unlikeRack::Static
.IndexFileFinder
only rewrites the incoming request and passes it on (usually toRack::Files
). -
Adsf::Rack::IndexFileFinder
supports multiple index files, whileRack::Static
only supports one (you could have multipleRack::Static
middlewares, one for each index filenames, though). -
Rack::Static
will report the wrong filename on 404 pages: when requesting a directory without an index file, it will e.g. report “File not found: /index.html” rather than “File not found: /”. -
When requesting a directory without specifying the trailing slash,
Adsf::Rack::IndexFileFinder
will redirect to the URL with a trailing slash, unlikeRack::Static
. This mimics the behavior of typical HTTP servers. For example, when requesting/foo
, when afoo
directory exists and it containsindex.html
,IndexFileFinder
will redirect to/foo/
.
Contributors
- Daniel Aleksandersen
- Ed Brannin
- Chris Chapman
- Jan M. Faber
- Larissa Reis
- Mark Meves
- Vipul Amler
- Paul Cantrell