Class: Luna::Middleware::Static

Inherits:
Protocol::HTTP::Middleware
  • Object
show all
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

Instance Method Summary collapse

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.expand_path(root)
	@index = index
	@directory_listing = directory_listing
end

Instance Attribute Details

#directory_listingObject (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

#indexObject (readonly)

Returns the value of attribute index.



40
41
42
# File 'lib/luna/middleware/static.rb', line 40

def index
  @index
end

#rootObject (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.expand_path(File.join(@root, path))
	return nil unless full.start_with?(@root)
	full
end