Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Static Server based on Sinatra

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...
commit 423e8ecbda0394d4c77e2ea659768a8f30c35018 1 parent 23f05c1
Scott Watermasysk scottwater authored
Showing with 35 additions and 36 deletions.
  1. +15 −11 Gemfile
  2. +5 −0 Gemfile.lock
  3. +15 −25 config.ru
26 Gemfile
View
@@ -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 Gemfile.lock
View
@@ -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
@@ -57,4 +61,5 @@ DEPENDENCIES
rb-fsevent
rdiscount
rubypants
+ sinatra (= 1.2.6)
stringex
40 config.ru
View
@@ -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
Please sign in to comment.
Something went wrong with that request. Please try again.