module Roda::RodaPlugins::Public

  1. lib/roda/plugins/public.rb

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

Methods

Public Class

  1. configure

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

configure(app, opts={})

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.

[show source]
   # 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