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