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
Classes and Modules
Constants
ENCODING_EXTENSIONS | = | {'br'=>'.br', 'gzip'=>'.gz', 'zstd'=>'.zst'}.freeze | ||
ENCODING_MAP | = | {:zstd=>'zstd', :brotli=>'br', :gzip=>'gzip'}.freeze | ||
MATCH_METHOD | = | RUBY_VERSION >= '2.4' ? :match? : :match | ||
PARSER | = | defined?(::URI::RFC2396_PARSER) ? ::URI::RFC2396_PARSER : ::URI::DEFAULT_PARSER |
:nocov: |
|
RACK_FILES | = | defined?(Rack::Files) ? Rack::Files : Rack::File | ||
SPLIT | = | Regexp.union(*[File::SEPARATOR, File::ALT_SEPARATOR].compact) |
Public Class methods
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. |
# File lib/roda/plugins/public.rb 71 def self.configure(app, opts={}) 72 if opts[:root] 73 app.opts[:public_root] = app.expand_path(opts[:root]) 74 elsif !app.opts[:public_root] 75 app.opts[:public_root] = app.expand_path("public") 76 end 77 app.opts[:public_server] = RACK_FILES.new(app.opts[:public_root], opts[:headers]||{}, opts[:default_mime] || 'text/plain') 78 79 unless encodings = opts[:encodings] 80 if ENCODING_MAP.any?{|k,| opts.has_key?(k)} 81 encodings = ENCODING_MAP.map{|k, v| [v, ENCODING_EXTENSIONS[v]] if opts[k]}.compact 82 end 83 end 84 encodings = (encodings || app.opts[:public_encodings] || EMPTY_ARRAY).map(&:dup).freeze 85 encodings.each do |a| 86 a << /\b#{a[0]}\b/ 87 end 88 encodings.each(&:freeze) 89 app.opts[:public_encodings] = encodings 90 end