Class: Luna::Middleware::Static
- Inherits:
-
Protocol::HTTP::Middleware
- Object
- Protocol::HTTP::Middleware
- Luna::Middleware::Static
- Defined in:
- lib/luna/middleware/static.rb
Overview
Serve static files from a root directory, with optional index and directory listing.
Constant Summary collapse
- MIME_TYPES =
{ ".html" => "text/html; charset=utf-8", ".css" => "text/css", ".js" => "application/javascript", ".json" => "application/json", ".xml" => "application/xml", ".txt" => "text/plain; charset=utf-8", ".md" => "text/markdown; charset=utf-8", ".png" => "image/png", ".jpg" => "image/jpeg", ".jpeg" => "image/jpeg", ".gif" => "image/gif", ".svg" => "image/svg+xml", ".ico" => "image/x-icon", ".pdf" => "application/pdf", ".zip" => "application/zip", }.freeze
Instance Attribute Summary collapse
-
#directory_listing ⇒ Object
readonly
Returns the value of attribute directory_listing.
-
#index ⇒ Object
readonly
Returns the value of attribute index.
-
#root ⇒ Object
readonly
Returns the value of attribute root.
Instance Method Summary collapse
- #call(request) ⇒ Object
-
#initialize(app, root: Dir.pwd, index: "index.html", directory_listing: true) ⇒ Static
constructor
A new instance of Static.
- #mime_type_for_extension(ext) ⇒ Object
- #safe_join(path) ⇒ Object
Constructor Details
#initialize(app, root: Dir.pwd, index: "index.html", directory_listing: true) ⇒ Static
Returns a new instance of Static.
32 33 34 35 36 37 |
# File 'lib/luna/middleware/static.rb', line 32 def initialize(app, root: Dir.pwd, index: "index.html", directory_listing: true) super(app) @root = File.(root) @index = index @directory_listing = directory_listing end |
Instance Attribute Details
#directory_listing ⇒ Object (readonly)
Returns the value of attribute directory_listing.
41 42 43 |
# File 'lib/luna/middleware/static.rb', line 41 def directory_listing @directory_listing end |
#index ⇒ Object (readonly)
Returns the value of attribute index.
40 41 42 |
# File 'lib/luna/middleware/static.rb', line 40 def index @index end |
#root ⇒ Object (readonly)
Returns the value of attribute root.
39 40 41 |
# File 'lib/luna/middleware/static.rb', line 39 def root @root end |
Instance Method Details
#call(request) ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/luna/middleware/static.rb', line 53 def call(request) return super unless request.method == "GET" || request.method == "HEAD" # Remove query and decode percent-encoding carefully: request_path = request.path.split("?", 2).first file_path = safe_join(request_path) return super unless file_path if File.exist?(file_path) if File.directory?(file_path) index_path = File.join(file_path, @index) if File.file?(index_path) return serve_file(index_path, head: request.method == "HEAD") elsif @directory_listing return serve_directory_listing(file_path, request_path) else return super end elsif File.file?(file_path) return serve_file(file_path, head: request.method == "HEAD") end end super end |
#mime_type_for_extension(ext) ⇒ Object
43 44 45 |
# File 'lib/luna/middleware/static.rb', line 43 def mime_type_for_extension(ext) MIME_TYPES[ext.downcase] || "application/octet-stream" end |
#safe_join(path) ⇒ Object
47 48 49 50 51 |
# File 'lib/luna/middleware/static.rb', line 47 def safe_join(path) full = File.(File.join(@root, path)) return nil unless full.start_with?(@root) full end |