# File lib/rack/adapter/rails.rb, line 18 def initialize(options={}) @root = options[:root] || Dir.pwd @env = options[:environment] || 'development' @prefix = options[:prefix] load_application @rails_app = if self.class.rack_based? ActionController::Dispatcher.new else CgiApp.new end @file_app = Rack::File.new(::File.join(RAILS_ROOT, "public")) end
# File lib/rack/adapter/rails.rb, line 72 def self.rack_based? rails_version = ::Rails::VERSION return false if rails_version::MAJOR < 2 return false if rails_version::MAJOR == 2 && rails_version::MINOR < 2 return false if rails_version::MAJOR == 2 && rails_version::MINOR == 2 && rails_version::TINY < 3 true # >= 2.2.3 end
# File lib/rack/adapter/rails.rb, line 54 def call(env) path = env['PATH_INFO'].chomp('/') method = env['REQUEST_METHOD'] cached_path = (path.empty? ? 'index' : path) + ActionController::Base.page_cache_extension if FILE_METHODS.include?(method) if file_exist?(path) # Serve the file if it's there return @file_app.call(env) elsif file_exist?(cached_path) # Serve the page cache if it's there env['PATH_INFO'] = cached_path return @file_app.call(env) end end # No static file, let Rails handle it @rails_app.call(env) end
# File lib/rack/adapter/rails.rb, line 49 def file_exist?(path) full_path = ::File.join(@file_app.root, Utils.unescape(path)) ::File.file?(full_path) && ::File.readable_real?(full_path) end
# File lib/rack/adapter/rails.rb, line 34 def load_application ENV['RAILS_ENV'] = @env require "#{@root}/config/environment" require 'dispatcher' if @prefix if ActionController::Base.respond_to?(:relative_url_root=) ActionController::Base.relative_url_root = @prefix # Rails 2.1.1 else ActionController::AbstractRequest.relative_url_root = @prefix end end end