Web server that you can launch instantly in any directory
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
adsf-live Set version to 1.4.1 Feb 2, 2018
adsf Set version to 1.4.1 Feb 2, 2018
scripts feature: Add adsf-live Nov 26, 2017
.gitignore feature: Add adsf-live Nov 26, 2017
.rubocop.yml feature: Add adsf-live Nov 26, 2017
.travis.yml chore: Don’t test Ruby 2.2 on Travis CI Nov 26, 2017
Gemfile feature: Add adsf-live Nov 26, 2017
LICENSE doc: Upgrade copyright year Nov 26, 2017
NEWS.md Add release notes for 1.4.1 Feb 2, 2018
README.md Small typo Nov 28, 2017
Rakefile feature: Add adsf-live Nov 26, 2017

README.md

Gem version Gem downloads Build status Code Climate Code Coverage

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

IndexFileFinder

The Adsf::Rack::IndexFileFinder middleware makes 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::File.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 as default.html or index.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::File.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, unlike Rack::Static. IndexFileFinder only rewrites the incoming request and passes it on (usually to Rack::File).

  • Adsf::Rack::IndexFileFinder supports multiple index files, while Rack::Static only supports one (you could have multiple Rack::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, unlike Rack::Static. This mimics the behavior of typical HTTP servers. For example, when requesting /foo, when a foo directory exists and it contains index.html, IndexFileFinder will redirect to /foo/.

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 above)
  • host (optional; defaults to '127.0.0.1'): the address of the network interface to listen on
  • port (optional; defaults to 3000): the port ot listen on
  • handler (optional): the Rack handler to use

Contributors

  • Ed Brannin
  • Larissa Reis
  • Mark Meves
  • Vipul Amler