2015-05-05 15:50:13 +10:00
class StylesheetsController < ApplicationController
skip_before_filter :preload_json , :redirect_to_login_if_required , :check_xhr , :verify_authenticity_token , only : [ :show ]
def show
2015-05-22 16:15:46 +10:00
no_cookies
2015-05-23 15:25:05 +10:00
target , digest = params [ :name ] . split ( / _([a-f0-9]{40}) / )
2015-05-21 16:09:23 +10:00
2015-05-21 17:05:22 +10:00
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
2015-05-22 11:21:16 +10:00
query = query . where ( digest : digest )
2015-05-21 17:05:22 +10:00
else
query = query . order ( 'id desc' )
2015-05-21 16:09:23 +10:00
end
2015-05-22 11:21:16 +10:00
# Security note, safe due to route constraint
underscore_digest = digest ? " _ " + digest : " "
location = " #{ Rails . root } / #{ DiscourseStylesheets :: CACHE_PATH } / #{ target } #{ underscore_digest } .css "
2015-05-21 17:05:22 +10:00
stylesheet_time = query . pluck ( :created_at ) . first
2015-05-22 11:21:16 +10:00
2015-05-21 17:05:22 +10:00
if ! stylesheet_time
2015-05-22 11:21:16 +10:00
handle_missing_cache ( location , target , digest )
2015-05-21 17:05:22 +10:00
end
if cache_time && stylesheet_time && stylesheet_time < = cache_time
return render nothing : true , status : 304
end
2015-05-05 15:50:13 +10:00
unless File . exist? ( location )
if current = query . first
File . write ( location , current . content )
else
2015-05-22 11:21:16 +10:00
raise Discourse :: NotFound
2015-05-05 15:50:13 +10:00
end
end
2015-05-22 11:21:16 +10:00
response . headers [ 'Last-Modified' ] = stylesheet_time . httpdate if stylesheet_time
2015-05-05 15:50:13 +10:00
expires_in 1 . year , public : true unless Rails . env == " development "
send_file ( location , disposition : :inline )
2015-05-22 11:21:16 +10:00
end
protected
2015-05-05 15:50:13 +10:00
2015-05-22 11:21:16 +10:00
def handle_missing_cache ( location , name , digest )
existing = File . read ( location ) rescue nil
if existing && digest
StylesheetCache . add ( name , digest , existing )
end
2015-05-05 15:50:13 +10:00
end
2015-05-22 11:21:16 +10:00
2015-05-05 15:50:13 +10:00
end