Skip to content

Commit

Permalink
Static Server based on Sinatra
Browse files Browse the repository at this point in the history
Using Sinatra provides better handling of mime types and supports
304's/etc.

Also updated the Gemfile to exclude most gem outside of developemnt
(default).
  • Loading branch information
scottwater committed Aug 22, 2011
1 parent 23f05c1 commit 423e8ec
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 36 deletions.
26 changes: 15 additions & 11 deletions Gemfile
@@ -1,13 +1,17 @@
source "http://rubygems.org"

gem 'rake'
gem 'rack'
gem 'jekyll'
gem 'rdiscount'
gem 'pygments.rb'
gem 'RedCloth'
gem 'haml', '>= 3.1'
gem 'compass', '>= 0.11'
gem 'rubypants'
gem 'rb-fsevent'
gem 'stringex'
group :development do
gem 'rake'
gem 'rack'
gem 'jekyll'
gem 'rdiscount'
gem 'pygments.rb'
gem 'RedCloth'
gem 'haml', '>= 3.1'
gem 'compass', '>= 0.11'
gem 'rubypants'
gem 'rb-fsevent'
gem 'stringex'
end

gem 'sinatra', '1.2.6'
5 changes: 5 additions & 0 deletions Gemfile.lock
Expand Up @@ -40,8 +40,12 @@ GEM
blankslate (>= 2.1.2.3)
ffi (~> 1.0.7)
sass (3.1.5)
sinatra (1.2.6)
rack (~> 1.1)
tilt (>= 1.2.2, < 2.0)
stringex (1.3.0)
syntax (1.0.0)
tilt (1.3.2)

PLATFORMS
ruby
Expand All @@ -57,4 +61,5 @@ DEPENDENCIES
rb-fsevent
rdiscount
rubypants
sinatra (= 1.2.6)
stringex
40 changes: 15 additions & 25 deletions config.ru
@@ -1,35 +1,25 @@
require 'rubygems'
require 'bundler/setup'
require 'rack'
require 'sinatra/base'

# The project root directory
$root = ::File.dirname(__FILE__)

# Common Rack Middleware
use Rack::ShowStatus # Nice looking 404s and other messages
use Rack::ShowExceptions # Nice looking errors
class SinatraStaticServer < Sinatra::Base

#
# From Rack::DirectoryIndex:
# https://github.com/craigmarksmith/rack-directory-index/
#
module Rack
class DirectoryIndex
def initialize(app)
@app = app
end
def call(env)
index_path = ::File.join($root, 'public', Rack::Request.new(env).path.split('/'), 'index.html')
if ::File.exists?(index_path)
return [200, {"Content-Type" => "text/html"}, [::File.read(index_path)]]
else
@app.call(env)
end
end
get(/.+/) do
send_sinatra_file(request.path) {404}
end
end

use Rack::DirectoryIndex
not_found do
send_sinatra_file('404.html') {"Sorry, I cannot find #{request.path}"}
end

run Rack::Directory.new($root + '/public')
def send_sinatra_file(path, &missing_file_block)
file_path = File.join(File.dirname(__FILE__), 'public', path)
file_path = File.join(file_path, 'index.html') unless file_path =~ /\.[a-z]+$/i
File.exist?(file_path) ? send_file(file_path) : missing_file_block.call
end

end

run SinatraStaticServer

0 comments on commit 423e8ec

Please sign in to comment.