class Slimmer::App
Attributes
logger[RW]
Public Class Methods
new(app, *args)
click to toggle source
# File lib/slimmer/app.rb, line 7 def initialize(app, *args) options = args.first || {} @app = app logger = options[:logger] || NullLogger.instance self.logger = logger if logger&.level&.zero? # Log set to debug level unless options[:enable_debugging] self.logger = logger.dup self.logger.level = 1 # info end end if options.key? :template_path raise "Template path should not be used. Use asset_host instead." end unless options[:asset_host] options[:asset_host] = Plek.current.find("static") end @skin = Skin.new options.merge(logger: self.logger) end
Public Instance Methods
call(env)
click to toggle source
# File lib/slimmer/app.rb, line 31 def call(env) logger.debug "Slimmer: capturing response" status, headers, body = @app.call(env) if response_can_be_rewritten?(status, headers) response = Rack::Response.new(body, status, headers) unless skip_slimmer?(env, response) status, headers, body = rewrite_response(env, response) end end [status, strip_slimmer_headers(headers), body] end
content_length(rewritten_body)
click to toggle source
# File lib/slimmer/app.rb, line 75 def content_length(rewritten_body) size = 0 rewritten_body.each { |part| size += part.bytesize } size.to_s end
in_development?()
click to toggle source
# File lib/slimmer/app.rb, line 54 def in_development? ENV["RAILS_ENV"] == "development" end
response_can_be_rewritten?(status, headers)
click to toggle source
# File lib/slimmer/app.rb, line 46 def response_can_be_rewritten?(status, headers) Rack::Utils::HeaderHash.new(headers)["Content-Type"] =~ /text\/html/ && ![301, 302, 304].include?(status) end
rewrite_response(env, response)
click to toggle source
# File lib/slimmer/app.rb, line 81 def rewrite_response(env, response) request = Rack::Request.new(env) return response.finish unless response.status == 200 # Store the request id so it can be passed on with any template requests GovukRequestId.value = env["HTTP_GOVUK_REQUEST_ID"] rewritten_body = @skin.success request, response, s(response.body) rewritten_body = [rewritten_body] unless rewritten_body.respond_to?(:each) response.body = rewritten_body response.headers["Content-Length"] = content_length(response.body) response.finish end
s(body)
click to toggle source
# File lib/slimmer/app.rb, line 67 def s(body) return body.to_s unless body.respond_to?(:each) b = "" body.each { |a| b << a } b end
skip_slimmer?(env, response)
click to toggle source
# File lib/slimmer/app.rb, line 50 def skip_slimmer?(env, response) (in_development? && skip_slimmer_param?(env)) || skip_slimmer_header?(response) end
skip_slimmer_header?(response)
click to toggle source
# File lib/slimmer/app.rb, line 63 def skip_slimmer_header?(response) response.headers.key?(Headers::SKIP_HEADER) end
skip_slimmer_param?(env)
click to toggle source
# File lib/slimmer/app.rb, line 58 def skip_slimmer_param?(env) skip = Rack::Request.new(env).params["skip_slimmer"] skip && skip.to_i.positive? end
strip_slimmer_headers(headers)
click to toggle source
# File lib/slimmer/app.rb, line 97 def strip_slimmer_headers(headers) headers.reject { |k, _v| k =~ /\A#{Headers::HEADER_PREFIX}/ } end