59 lines
1.6 KiB
Ruby
59 lines
1.6 KiB
Ruby
class StylesheetsController < ApplicationController
|
|
skip_before_filter :preload_json, :redirect_to_login_if_required, :check_xhr, :verify_authenticity_token, only: [:show]
|
|
|
|
def show
|
|
|
|
no_cookies
|
|
|
|
target,digest = params[:name].split(/_([a-f0-9]{40})/)
|
|
|
|
cache_time = request.env["HTTP_IF_MODIFIED_SINCE"]
|
|
cache_time = Time.rfc2822(cache_time) rescue nil if cache_time
|
|
|
|
query = StylesheetCache.where(target: target)
|
|
if digest
|
|
query = query.where(digest: digest)
|
|
else
|
|
query = query.order('id desc')
|
|
end
|
|
|
|
# Security note, safe due to route constraint
|
|
underscore_digest = digest ? "_" + digest : ""
|
|
location = "#{Rails.root}/#{DiscourseStylesheets::CACHE_PATH}/#{target}#{underscore_digest}.css"
|
|
|
|
stylesheet_time = query.pluck(:created_at).first
|
|
|
|
if !stylesheet_time
|
|
handle_missing_cache(location, target, digest)
|
|
end
|
|
|
|
if cache_time && stylesheet_time && stylesheet_time <= cache_time
|
|
return render nothing: true, status: 304
|
|
end
|
|
|
|
|
|
unless File.exist?(location)
|
|
if current = query.first
|
|
File.write(location, current.content)
|
|
else
|
|
raise Discourse::NotFound
|
|
end
|
|
end
|
|
|
|
response.headers['Last-Modified'] = stylesheet_time.httpdate if stylesheet_time
|
|
immutable_for(1.year) unless Rails.env == "development"
|
|
send_file(location, disposition: :inline)
|
|
end
|
|
|
|
protected
|
|
|
|
def handle_missing_cache(location, name, digest)
|
|
existing = File.read(location) rescue nil
|
|
if existing && digest
|
|
StylesheetCache.add(name, digest, existing)
|
|
end
|
|
end
|
|
|
|
end
|
|
|