class Rack::GridServe

Constants

CACHE_CONTROL
CONTENT_LENGTH
CONTENT_TYPE
CONTENT_TYPE_KEY
DEFAULT_CACHE_CONTROL
DEFAULT_PREFIX
EDGE_SLASHES_RE
EMPTY_STRING
ETAG
HTTP_IF_NONE_MATCH
ID_KEY
LAST_MODIFIED
MD5_KEY
NOT_FOUND
NOT_FOUND_RESPONSE
OR
PATH_INFO
READ_METHODS
REQUEST_METHOD
TEXT_PLAIN
UPLOAD_DATE_KEY
VERSION

Public Class Methods

new(app, opts={}) click to toggle source
# File lib/rack/grid_serve.rb, line 14
def initialize app, opts={}
  @app = app
  @db = opts[:db]
  @prefix = (opts[:prefix] || DEFAULT_PREFIX).gsub(EDGE_SLASHES_RE, EMPTY_STRING)
  @prefix = "/#{@prefix}/".freeze
  @cache_control = opts[:cache_control] || DEFAULT_CACHE_CONTROL
end

Public Instance Methods

call(env) click to toggle source
# File lib/rack/grid_serve.rb, line 42
def call env
  path_info = env[PATH_INFO].to_s
  if under_prefix? path_info
    file = find_file path_info
    if file.nil?
      NOT_FOUND_RESPONSE
    else
      last_modified = Time.at file[UPLOAD_DATE_KEY].to_i
      headers = {
        CONTENT_TYPE => file[CONTENT_TYPE_KEY],
        ETAG => file[MD5_KEY],
        LAST_MODIFIED => last_modified.httpdate,
        CACHE_CONTROL => @cache_control
      }
      if can_use_cached?(env, file[MD5_KEY])
        headers.delete(CONTENT_TYPE)
        headers.delete(CONTENT_LENGTH)
        [304, headers, []]
      else
        [200, headers, @db.fs.open_download_stream(file[ID_KEY])]
      end
    end
  else
    @app.call env
  end
end

Private Instance Methods

can_use_cached?(env, md5) click to toggle source
# File lib/rack/grid_serve.rb, line 104
def can_use_cached? env, md5
  READ_METHODS.include?(env[REQUEST_METHOD]) and 
    env[HTTP_IF_NONE_MATCH] and 
    env[HTTP_IF_NONE_MATCH] == md5
end
find_file(path_info) click to toggle source
# File lib/rack/grid_serve.rb, line 86
def find_file path_info
  str = id_or_filename path_info
  if str.is_a? BSON::ObjectId
    @db.fs.find({_id: str}).first
  else
    @db.fs.find({
      OR => [
        {filename: str},
        {filename: "/#{str}"}
      ]
    }).first
  end
end
id_or_filename(path_info) click to toggle source
# File lib/rack/grid_serve.rb, line 75
def id_or_filename path_info
  str = path_info.sub @prefix, EMPTY_STRING
  if BSON::ObjectId.legal? str
    BSON::ObjectId.from_string str
  else
    Rack::Utils.unescape str
  end
end
under_prefix?(path_info) click to toggle source
# File lib/rack/grid_serve.rb, line 71
def under_prefix? path_info
  path_info.start_with?(@prefix) and path_info.size > @prefix.size 
end