Sha256: 62f64b9e4a46ecce5dafb5799054742c7e3b8360b2991f765f689c44af70c5b7

Contents?: true

Size: 1.86 KB

Versions: 6

Compression:

Stored size: 1.86 KB

Contents

require 'uri'

module Dragonfly
  class Response

    DEFAULT_FILENAME = proc{|job, request|
      if job.basename
        extname = job.encoded_extname || (".#{job.ext}" if job.ext)
        "#{job.basename}#{extname}"
      end
    }

    def initialize(job, env)
      @job, @env = job, env
      @app = @job.app
    end

    def to_response
      if etag_matches?
        # Not Modified
        [304, cache_headers, []]
      else
        # Success
        [200, success_headers.merge(cache_headers), job.result]
      end
    rescue DataStorage::DataNotFound => e
      [404, {"Content-Type" => 'text/plain'}, [e.message]]
    end

    private

    attr_reader :job, :env, :app

    def request
      @request ||= Rack::Request.new(env)
    end

    def cache_headers
      {
        "Cache-Control" => "public, max-age=#{app.cache_duration}",
        "ETag" => %("#{job.unique_signature}")
      }
    end

    def etag_matches?
      if_none_match = env['HTTP_IF_NONE_MATCH']
      if if_none_match
        if_none_match.tr!('"','')
        if_none_match.split(',').include?(job.unique_signature) || if_none_match == '*'
      else
        false
      end
    end

    def success_headers
      {
        "Content-Type" => job.resolve_mime_type,
        "Content-Length" => job.size.to_s
      }.merge(content_disposition_header)
    end

    def content_disposition_header
      parts = []
      parts << content_disposition if content_disposition
      parts << %(filename="#{URI.encode(filename)}") if filename
      parts.any? ? {"Content-Disposition" => parts.join('; ')} : {}
    end

    def content_disposition
      @content_disposition ||= evaluate(app.content_disposition)
    end

    def filename
      @filename ||= evaluate(app.content_filename)
    end

    def evaluate(attribute)
      attribute.respond_to?(:call) ? attribute.call(job, request) : attribute
    end

  end
end

Version data entries

6 entries across 6 versions & 2 rubygems

Version Path
fog-dragonfly-0.8.2 lib/dragonfly/response.rb
fog-dragonfly-0.8.1 lib/dragonfly/response.rb
dragonfly-0.8.1 lib/dragonfly/response.rb
dragonfly-0.8.0 lib/dragonfly/response.rb
dragonfly-0.7.7 lib/dragonfly/response.rb
dragonfly-0.7.6 lib/dragonfly/response.rb