def call(env)
start_time = Time.now.to_f
time_elapsed = lambda { ((Time.now.to_f - start_time) * 1000).to_i }
msg = "Served asset #{env['PATH_INFO']} -"
env['rack.session.options'] ||= {}
env['rack.session.options'][:defer] = true
env['rack.session.options'][:skip] = true
path = unescape(env['PATH_INFO'].to_s.sub(/^\//, ''))
if fingerprint = path_fingerprint(path)
path = path.sub("-#{fingerprint}", '')
end
if forbidden_request?(path)
return forbidden_response
end
asset = find_asset(path, :bundle => !body_only?(env))
if asset.nil?
logger.info "#{msg} 404 Not Found (#{time_elapsed.call}ms)"
not_found_response
elsif etag_match?(asset, env)
logger.info "#{msg} 304 Not Modified (#{time_elapsed.call}ms)"
not_modified_response(asset, env)
else
logger.info "#{msg} 200 OK (#{time_elapsed.call}ms)"
ok_response(asset, env)
end
rescue Exception => e
logger.error "Error compiling asset #{path}:"
logger.error "#{e.class.name}: #{e.message}"
case content_type_of(path)
when "application/javascript"
logger.info "#{msg} 500 Internal Server Error\n\n"
return javascript_exception_response(e)
when "text/css"
logger.info "#{msg} 500 Internal Server Error\n\n"
return css_exception_response(e)
else
raise
end
end