Module: Roda::RodaPlugins::Public
- Defined in:
- lib/roda/plugins/public.rb
Overview
The public plugin adds a r.public
routing method to serve static files from a directory.
The public plugin recognizes the application’s :root option, and defaults to using the public
subfolder of the application’s :root
option. If the application’s :root option is not set, it defaults to the public
folder in the working directory. Additionally, if a relative path is provided as the :root
option to the plugin, it will be considered relative to the application’s :root
option.
Examples:
# Use public folder as location of files
plugin :public
# Use /path/to/app/static as location of files
opts[:root] = '/path/to/app'
plugin :public, root: 'static'
# Assuming public is the location of files
route do
# Make GET /images/foo.png look for public/images/foo.png
r.public
# Make GET /static/images/foo.png look for public/images/foo.png
r.on(:static) do
r.public
end
end
Defined Under Namespace
Modules: RequestMethods
Constant Summary collapse
- SPLIT =
Regexp.union(*[File::SEPARATOR, File::ALT_SEPARATOR].compact)
- RACK_FILES =
defined?(Rack::Files) ? Rack::Files : Rack::File
- ENCODING_MAP =
{:zstd=>'zstd', :brotli=>'br', :gzip=>'gzip'}.freeze
- ENCODING_EXTENSIONS =
{'br'=>'.br', 'gzip'=>'.gz', 'zstd'=>'.zst'}.freeze
- PARSER =
:nocov:
defined?(::URI::RFC2396_PARSER) ? ::URI::RFC2396_PARSER : ::URI::DEFAULT_PARSER
- MATCH_METHOD =
RUBY_VERSION >= '2.4' ? :match? : :match
Class Method Summary collapse
-
.configure(app, opts = {}) ⇒ Object
Use options given to setup a Rack::File instance for serving files.
Class Method Details
.configure(app, opts = {}) ⇒ Object
Use options given to setup a Rack::File instance for serving files. Options:
- :brotli
-
Whether to serve already brotli-compressed files with a .br extension for clients supporting “br” transfer encoding.
- :default_mime
-
The default mime type to use if the mime type is not recognized.
- :encodings
-
An enumerable of pairs to handle accepted encodings. The first element of the pair is the accepted encoding name (e.g. ‘gzip’), and the second element of the pair is the file extension (e.g. ‘.gz’). This allows configuration of the order in which encodings are tried, to prefer brotli to zstd for example, or to support encodings other than zstd, brotli, and gzip. This takes precedence over the :brotli, :gzip, and :zstd options if given.
- :gzip
-
Whether to serve already gzipped files with a .gz extension for clients supporting “gzip” transfer encoding.
- :headers
-
A hash of headers to use for statically served files
- :root
-
Use this option for the root of the public directory (default: “public”)
- :zstd
-
Whether to serve already zstd-compressed files with a .zst extension for clients supporting “zstd” transfer encoding.
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/roda/plugins/public.rb', line 71 def self.configure(app, opts={}) if opts[:root] app.opts[:public_root] = app.(opts[:root]) elsif !app.opts[:public_root] app.opts[:public_root] = app.("public") end app.opts[:public_server] = RACK_FILES.new(app.opts[:public_root], opts[:headers]||{}, opts[:default_mime] || 'text/plain') unless encodings = opts[:encodings] if ENCODING_MAP.any?{|k,| opts.has_key?(k)} encodings = ENCODING_MAP.map{|k, v| [v, ENCODING_EXTENSIONS[v]] if opts[k]}.compact end end encodings = (encodings || app.opts[:public_encodings] || EMPTY_ARRAY).map(&:dup).freeze encodings.each do |a| a << /\b#{a[0]}\b/ end encodings.each(&:freeze) app.opts[:public_encodings] = encodings end |