class Merb::Rack::Static

Public Class Methods

new(app,directory) click to toggle source

:api: private

Calls superclass method Merb::Rack::Middleware.new
# File lib/merb-core/rack/middleware/static.rb, line 6
def initialize(app,directory)
  super(app)
  @static_server = ::Rack::File.new(directory)
end

Public Instance Methods

call(env) click to toggle source

:api: plugin

# File lib/merb-core/rack/middleware/static.rb, line 12
def call(env)        
  path = if env[Merb::Const::PATH_INFO]
           env[Merb::Const::PATH_INFO].chomp(Merb::Const::SLASH)
         else
           Merb::Const::EMPTY_STRING
         end
  cached_path = (path.empty? ? 'index' : path) + '.html'
  
  if file_exist?(path) && env[Merb::Const::REQUEST_METHOD] =~ /GET|HEAD/ # Serve the file if it's there and the request method is GET or HEAD
    serve_static(env)
  elsif file_exist?(cached_path) && env[Merb::Const::REQUEST_METHOD] =~ /GET|HEAD/ # Serve the page cache if it's there and the request method is GET or HEAD
    env[Merb::Const::PATH_INFO] = cached_path
    serve_static(env)
  elsif path =~ /favicon\.ico/
    return [404, { Merb::Const::CONTENT_TYPE => Merb::Const::TEXT_SLASH_HTML }, "404 Not Found."]
  else
    @app.call(env)
  end
end
file_exist?(path) click to toggle source

Parameters

path<String>

The path to the file relative to the server root.

Returns

Boolean

True if file exists under the server root and is readable.

:api: private

# File lib/merb-core/rack/middleware/static.rb, line 39
def file_exist?(path)
  full_path = ::File.join(@static_server.root, ::Merb::Parse.unescape(path))
  ::File.file?(full_path) && ::File.readable?(full_path)
end
serve_static(env) click to toggle source

Parameters

env<Hash>

Environment variables to pass on to the server.

:api: private

# File lib/merb-core/rack/middleware/static.rb, line 48
def serve_static(env)
  env[Merb::Const::PATH_INFO] = ::Merb::Parse.unescape(env[Merb::Const::PATH_INFO])
  @static_server.call(env)
end