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
r.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)
PARSER =
URI::DEFAULT_PARSER
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
MATCH_METHOD =

:nocov:

RUBY_VERSION >= '2.4' ? :match? : :match

Class Method Summary collapse

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.expand_path(opts[:root])
  elsif !app.opts[:public_root]
    app.opts[:public_root] = app.expand_path("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