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