Class: Slimmer::App
- Inherits:
-
Object
- Object
- Slimmer::App
- Defined in:
- lib/slimmer/app.rb
Instance Attribute Summary collapse
-
#logger ⇒ Object
Returns the value of attribute logger.
Instance Method Summary collapse
- #call(env) ⇒ Object
- #content_length(rewritten_body) ⇒ Object
- #in_development? ⇒ Boolean
-
#initialize(app, *args, &block) ⇒ App
constructor
A new instance of App.
- #response_can_be_rewritten?(status, headers) ⇒ Boolean
- #rewrite_response(env, response) ⇒ Object
- #s(body) ⇒ Object
- #skip_slimmer?(env, response) ⇒ Boolean
- #skip_slimmer_header?(response) ⇒ Boolean
- #skip_slimmer_param?(env) ⇒ Boolean
- #strip_slimmer_headers(headers) ⇒ Object
Constructor Details
#initialize(app, *args, &block) ⇒ App
Returns a new instance of App.
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/slimmer/app.rb', line 7 def initialize(app, *args, &block) = args.first || {} @app = app logger = [:logger] || NullLogger.instance self.logger = logger begin if logger.level == 0 # Log set to debug level unless [:enable_debugging] self.logger = logger.dup self.logger.level = 1 # info end end rescue NoMethodError # In case logger doesn't respond_to? :level end if .key? :template_path raise "Template path should not be used. Use asset_host instead." end unless [:asset_host] [:asset_host] = Plek.current.find("static") end cache = Cache.instance cache.use_cache = [:use_cache] if [:use_cache] @skin = Skin.new .merge(logger: self.logger, cache: cache) end |
Instance Attribute Details
#logger ⇒ Object
Returns the value of attribute logger.
5 6 7 |
# File 'lib/slimmer/app.rb', line 5 def logger @logger end |
Instance Method Details
#call(env) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/slimmer/app.rb', line 37 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) if !skip_slimmer?(env, response) status, headers, body = rewrite_response(env, response) end end [status, strip_slimmer_headers(headers), body] end |
#content_length(rewritten_body) ⇒ Object
80 81 82 83 84 |
# File 'lib/slimmer/app.rb', line 80 def content_length(rewritten_body) size = 0 rewritten_body.each { |part| size += part.bytesize } size.to_s end |
#in_development? ⇒ Boolean
60 61 62 |
# File 'lib/slimmer/app.rb', line 60 def in_development? ENV['RAILS_ENV'] == 'development' end |
#response_can_be_rewritten?(status, headers) ⇒ Boolean
52 53 54 |
# File 'lib/slimmer/app.rb', line 52 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) ⇒ Object
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/slimmer/app.rb', line 86 def rewrite_response(env, response) request = Rack::Request.new(env) # Store the request id so it can be passed on with any template requests GovukRequestId.value = env['HTTP_GOVUK_REQUEST_ID'] rewritten_body = case response.status when 200 @skin.success request, response, s(response.body) when 403 @skin.error '403', s(response.body), request.env when 404 @skin.error '404', s(response.body), request.env when 410 @skin.error '410', s(response.body), request.env else @skin.error '500', s(response.body), request.env end 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) ⇒ Object
73 74 75 76 77 78 |
# File 'lib/slimmer/app.rb', line 73 def s(body) return body.to_s unless body.respond_to?(:each) b = "" body.each {|a| b << a } b end |
#skip_slimmer?(env, response) ⇒ Boolean
56 57 58 |
# File 'lib/slimmer/app.rb', line 56 def skip_slimmer?(env, response) (in_development? && skip_slimmer_param?(env)) || skip_slimmer_header?(response) end |
#skip_slimmer_header?(response) ⇒ Boolean
69 70 71 |
# File 'lib/slimmer/app.rb', line 69 def skip_slimmer_header?(response) !!response.headers[Headers::SKIP_HEADER] end |
#skip_slimmer_param?(env) ⇒ Boolean
64 65 66 67 |
# File 'lib/slimmer/app.rb', line 64 def skip_slimmer_param?(env) skip = Rack::Request.new(env).params['skip_slimmer'] skip and skip.to_i > 0 end |
#strip_slimmer_headers(headers) ⇒ Object
112 113 114 |
# File 'lib/slimmer/app.rb', line 112 def strip_slimmer_headers(headers) headers.reject {|k, v| k =~ /\A#{Headers::HEADER_PREFIX}/ } end |