class Dragonfly::Response

Attributes

app[R]
env[R]
job[R]

Public Class Methods

new(job, env) click to toggle source
# File lib/dragonfly/response.rb, line 7
def initialize(job, env)
  @job, @env = job, env
  @app = @job.app
end

Public Instance Methods

to_response() click to toggle source
# File lib/dragonfly/response.rb, line 12
def to_response
  response = begin
    if !(request.head? || request.get?)
      [405, method_not_allowed_headers, ["method not allowed"]]
    elsif etag_matches?
      [304, cache_headers, []]
    else
      job.apply
      env['dragonfly.job'] = job
      [
        200,
        success_headers,
        (request.head? ? [] : job)
      ]
    end
  rescue Job::Fetch::NotFound => e
    Dragonfly.warn(e.message)
    [404, {"Content-Type" => "text/plain"}, ["Not found"]]
  rescue RuntimeError => e
    Dragonfly.warn("caught error - #{e.message}")
    [500, {"Content-Type" => "text/plain"}, ["Internal Server Error"]]
  end
  log_response(response)
  response
end
will_be_served?() click to toggle source
# File lib/dragonfly/response.rb, line 38
def will_be_served?
  request.get? && !etag_matches?
end

Private Instance Methods

cache_headers() click to toggle source
# File lib/dragonfly/response.rb, line 87
def cache_headers
  {
    "Cache-Control" => "public, max-age=31536000", # (1 year)
    "ETag" => %Q("#{job.signature}")
  }
end
customize_headers(headers) click to toggle source
# File lib/dragonfly/response.rb, line 94
def customize_headers(headers)
  app.response_headers.each do |k, v|
    headers[k] = v.respond_to?(:call) ? v.call(job, request, headers) : v
  end
end
etag_matches?() click to toggle source
# File lib/dragonfly/response.rb, line 55
def etag_matches?
  return @etag_matches unless @etag_matches.nil?
  if_none_match = env['HTTP_IF_NONE_MATCH']
  @etag_matches = if if_none_match
    if_none_match.tr!('"','')
    if_none_match.split(',').include?(job.signature) || if_none_match == '*'
  else
    false
  end
end
filename_string() click to toggle source
# File lib/dragonfly/response.rb, line 100
def filename_string
  return unless job.name
  filename = request_from_msie? ? URI.encode(job.name) : job.name
  %Q(filename="#{filename}")
end
log_response(response) click to toggle source
# File lib/dragonfly/response.rb, line 50
def log_response(response)
  r = request
  Dragonfly.info [r.request_method, r.fullpath, response[0]].join(' ')
end
method_not_allowed_headers() click to toggle source
# File lib/dragonfly/response.rb, line 66
def method_not_allowed_headers
  {
    'Content-Type' => 'text/plain',
    'Allow' => 'GET, HEAD'
  }
end
request() click to toggle source
# File lib/dragonfly/response.rb, line 46
def request
  @request ||= Rack::Request.new(env)
end
request_from_msie?() click to toggle source
# File lib/dragonfly/response.rb, line 106
def request_from_msie?
  env["HTTP_USER_AGENT"] =~ /MSIE/
end
standard_headers() click to toggle source
# File lib/dragonfly/response.rb, line 79
def standard_headers
  {
    "Content-Type" => job.mime_type,
    "Content-Length" => job.size.to_s,
    "Content-Disposition" => filename_string
  }
end
success_headers() click to toggle source
# File lib/dragonfly/response.rb, line 73
def success_headers
  headers = standard_headers.merge(cache_headers)
  customize_headers(headers)
  headers.delete_if{|k, v| v.nil? }
end