Project

adsf

0.06
A long-lived project that still receives updates
A web server that can be spawned in any directory
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Runtime

>= 1.0.0, < 4.0.0
~> 2.1
 Project Readme

Gem version Gem downloads Build status Code Climate

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 to 3000): 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 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::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, unlike Rack::Static. IndexFileFinder only rewrites the incoming request and passes it on (usually to Rack::Files).

  • 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/.

Contributors

  • Daniel Aleksandersen
  • Ed Brannin
  • Chris Chapman
  • Jan M. Faber
  • Larissa Reis
  • Mark Meves
  • Vipul Amler
  • Paul Cantrell