Class: Slimmer::App
- Inherits:
-
Object
- Object
- Slimmer::App
- Defined in:
- lib/slimmer/app.rb
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?(response) ⇒ 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.
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# File 'lib/slimmer/app.rb', line 6 def initialize(app, *args, &block) = args.first || {} @app = app logger = [:logger] || NullLogger.instance self.logger = logger if .key? :template_path raise "Template path should not be used. Use asset_host instead." end unless [:asset_host] [:asset_host] = Plek.current.find("assets") end @skin = Skin.new .merge(logger: logger) end |
Instance Method Details
#call(env) ⇒ Object
24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/slimmer/app.rb', line 24 def call(env) logger.debug "Slimmer: capturing response" status, headers, body = @app.call(env) response = Rack::Response.new(body, status, headers) if response_can_be_rewritten?(response) && !skip_slimmer?(env, response) status, headers, body = rewrite_response(env, response) end [status, strip_slimmer_headers(headers), body] end |
#content_length(rewritten_body) ⇒ Object
64 65 66 67 68 |
# File 'lib/slimmer/app.rb', line 64 def content_length(rewritten_body) size = 0 rewritten_body.each { |part| size += part.bytesize } size.to_s end |
#in_development? ⇒ Boolean
44 45 46 |
# File 'lib/slimmer/app.rb', line 44 def in_development? ENV['RAILS_ENV'] == 'development' end |
#response_can_be_rewritten?(response) ⇒ Boolean
36 37 38 |
# File 'lib/slimmer/app.rb', line 36 def response_can_be_rewritten?(response) response.content_type =~ /text\/html/ && ![301, 302, 304].include?(response.status) end |
#rewrite_response(env, response) ⇒ Object
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/slimmer/app.rb', line 70 def rewrite_response(env, response) request = Rack::Request.new(env) rewritten_body = case response.status when 200 if response.headers[Headers::TEMPLATE_HEADER] == 'admin' || request.path =~ /^\/admin(\/|$)/ @skin.admin s(response.body) else @skin.success request, response, s(response.body) end when 404 @skin.error '404', s(response.body) else @skin.error '500', s(response.body) 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
57 58 59 60 61 62 |
# File 'lib/slimmer/app.rb', line 57 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
40 41 42 |
# File 'lib/slimmer/app.rb', line 40 def skip_slimmer?(env, response) (in_development? && skip_slimmer_param?(env)) || skip_slimmer_header?(response) end |
#skip_slimmer_header?(response) ⇒ Boolean
53 54 55 |
# File 'lib/slimmer/app.rb', line 53 def skip_slimmer_header?(response) !!response.headers[Headers::SKIP_HEADER] end |
#skip_slimmer_param?(env) ⇒ Boolean
48 49 50 51 |
# File 'lib/slimmer/app.rb', line 48 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
93 94 95 |
# File 'lib/slimmer/app.rb', line 93 def strip_slimmer_headers(headers) headers.reject {|k, v| k =~ /\A#{Headers::HEADER_PREFIX}/ } end |