class Pakyow::Application::Actions::Assets::Public

Public Class Methods

new(app) click to toggle source

Pipeline Action that serves files out of your public directory.

# File lib/pakyow/application/actions/assets/public.rb, line 16
def initialize(app)
  @asset_paths = app.state(:asset).map(&:public_path) + app.state(:pack).flat_map { |pack|
    [pack.public_css_path, pack.public_js_path]
  }

  @prefix = if app.is_a?(Plugin)
    Pathname.new(app.class.mount_path)
  else
    Pathname.new("/")
  end
end

Public Instance Methods

call(connection) click to toggle source
# File lib/pakyow/application/actions/assets/public.rb, line 28
def call(connection)
  if connection.app.config.assets.public
    public_path = public_path(connection)

    if public?(public_path)
      if mime = MiniMime.lookup_by_filename(public_path)
        connection.set_header("content-type", mime.content_type)
      end

      if connection.app.config.assets.cache && asset?(connection)
        set_cache_headers(connection, public_path)
      end

      connection.body = File.open(public_path)
      connection.halt
    end
  end
end

Private Instance Methods

asset?(connection) click to toggle source
# File lib/pakyow/application/actions/assets/public.rb, line 62
def asset?(connection)
  @asset_paths.include?(connection.path)
end
public?(path) click to toggle source
# File lib/pakyow/application/actions/assets/public.rb, line 49
def public?(path)
  File.file?(path)
end
public_path(connection) click to toggle source
# File lib/pakyow/application/actions/assets/public.rb, line 53
def public_path(connection)
  File.join(
    connection.app.config.assets.public_path,
    String.normalize_path(
      Pathname.new(connection.path).relative_path_from(@prefix).to_s
    )
  )
end
set_cache_headers(connection, public_path) click to toggle source
# File lib/pakyow/application/actions/assets/public.rb, line 66
def set_cache_headers(connection, public_path)
  mtime = File.mtime(public_path)
  connection.set_header("age", (Time.now - mtime).to_i.to_s)
  connection.set_header("cache-control", "public, max-age=31536000")
  connection.set_header("vary", "accept-encoding")
  connection.set_header("last-modified", mtime.httpdate)
end