class Propshaft::Server

Public Class Methods

new(assembly) click to toggle source
# File lib/propshaft/server.rb, line 4
def initialize(assembly)
  @assembly = assembly
end

Public Instance Methods

call(env) click to toggle source
# File lib/propshaft/server.rb, line 8
def call(env)
  path, digest = extract_path_and_digest(env)

  if (asset = @assembly.load_path.find(path)) && asset.fresh?(digest)
    compiled_content = @assembly.compilers.compile(asset)

    [ 
      200, 
      {
        "Content-Length"  => compiled_content.length.to_s,
        "Content-Type"    => asset.content_type.to_s,
        "Accept-Encoding" => "Vary",
        "ETag"            => asset.digest,
        "Cache-Control"   => "public, max-age=31536000, immutable"
      },
      [ compiled_content ]
    ]
  else
    [ 404, { "Content-Type" => "text/plain", "Content-Length" => "9" }, [ "Not found" ] ]
  end
end
inspect() click to toggle source
# File lib/propshaft/server.rb, line 30
def inspect
  self.class.inspect
end

Private Instance Methods

extract_path_and_digest(env) click to toggle source
# File lib/propshaft/server.rb, line 35
def extract_path_and_digest(env)
  full_path = Rack::Utils.unescape(env["PATH_INFO"].to_s.sub(/^\//, ""))
  digest    = full_path[/-([0-9a-zA-Z]{7,128})\.(?!digested)[^.]+\z/, 1]
  path      = digest ? full_path.sub("-#{digest}", "") : full_path

  [ path, digest ]
end