Class: Slimmer::App
- Inherits:
-
Object
- Object
- Slimmer::App
- Defined in:
- lib/slimmer/app.rb
Instance Method Summary collapse
- #admin(request, body) ⇒ Object
- #call(env) ⇒ Object
- #content_length(rewritten_body) ⇒ Object
- #in_development? ⇒ Boolean
-
#initialize(app, *args, &block) ⇒ App
constructor
A new instance of App.
- #on_404(request, body) ⇒ Object
- #on_error(request, status, body) ⇒ Object
- #on_success(source_request, request, body) ⇒ Object
- #rewrite_response(env, response_to_skin) ⇒ Object
- #s(body) ⇒ Object
- #skip_slimmer_header?(backend_response) ⇒ Boolean
- #skip_slimmer_param?(env) ⇒ Boolean
Constructor Details
#initialize(app, *args, &block) ⇒ App
Returns a new instance of App.
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# File 'lib/slimmer/app.rb', line 8 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 [:asset_host], [:cache_templates], [:prefix], :logger => logger end |
Instance Method Details
#admin(request, body) ⇒ Object
58 59 60 |
# File 'lib/slimmer/app.rb', line 58 def admin(request,body) @skin.admin(request,body) end |
#call(env) ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/slimmer/app.rb', line 26 def call(env) logger.debug "Slimmer: capturing response" backend_response = @app.call(env) if in_development? and skip_slimmer_param?(env) logger.debug "Slimmer: Asked to skip slimmer via skip_slimmer param" return backend_response elsif skip_slimmer_header?(backend_response) logger.debug "Slimmer: Asked to skip slimmer via HTTP header" return backend_response else rewrite_response(env, backend_response) end end |
#content_length(rewritten_body) ⇒ Object
77 78 79 80 81 |
# File 'lib/slimmer/app.rb', line 77 def content_length(rewritten_body) size = 0 rewritten_body.each { |part| size += part.bytesize } size.to_s end |
#in_development? ⇒ Boolean
41 42 43 |
# File 'lib/slimmer/app.rb', line 41 def in_development? ENV['RAILS_ENV'] == 'development' end |
#on_404(request, body) ⇒ Object
66 67 68 |
# File 'lib/slimmer/app.rb', line 66 def on_404(request,body) @skin.error(request, '404', body) end |
#on_error(request, status, body) ⇒ Object
62 63 64 |
# File 'lib/slimmer/app.rb', line 62 def on_error(request, status, body) @skin.error(request, '500', body) end |
#on_success(source_request, request, body) ⇒ Object
54 55 56 |
# File 'lib/slimmer/app.rb', line 54 def on_success(source_request, request, body) @skin.success(source_request, request, body) end |
#rewrite_response(env, response_to_skin) ⇒ Object
83 84 85 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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/slimmer/app.rb', line 83 def rewrite_response(env, response_to_skin) status, headers, app_body = response_to_skin logger.debug "Slimmer: constructing request object" source_request = Rack::Request.new(env) logger.debug "Slimmer: constructing request headers object" request = Rack::Request.new(headers) content_type = headers['Content-Type'] || headers['content-type'] logger.debug "Slimmer: Content-Type: #{content_type}" if content_type =~ /text\/html/ logger.debug "Slimmer: Status code = #{status}" case status.to_i when 200 logger.debug "Slimmer: I will rewrite this request" logger.debug "Slimmer: #{TEMPLATE_HEADER} = #{headers[TEMPLATE_HEADER].inspect}" logger.debug "Slimmer: Request path = #{source_request.path.inspect}" if headers[TEMPLATE_HEADER] == 'admin' || source_request.path =~ /^\/admin(\/|$)/ logger.debug "Slimmer: Rewriting this request as an admin request" rewritten_body = admin(request,s(app_body)) else logger.debug "Slimmer: Rewriting this request as a public request" rewritten_body = on_success(source_request, request, s(app_body)) end when 301, 302, 304 logger.debug "Slimmer: I will not rewrite this request" rewritten_body = app_body when 404 logger.debug "Slimmer: Rewriting this request as a 404 error" rewritten_body = on_404(request,s(app_body)) else logger.debug "Slimmer: Rewriting this request as a generic error" rewritten_body = on_error(request,status,s(app_body)) end else logger.debug "Slimmer: I will not rewrite this request" rewritten_body = app_body end rewritten_body = [rewritten_body] unless rewritten_body.respond_to?(:each) headers['Content-Length'] = content_length(rewritten_body) logger.debug "Slimmer: Returning final status, headers and body" [status, headers, rewritten_body] rescue GdsApi::TimedOutException [503, {"Content-Type" => "text/plain"}, ["GDS API request timed out."]] end |
#s(body) ⇒ Object
70 71 72 73 74 75 |
# File 'lib/slimmer/app.rb', line 70 def s(body) return body.to_s unless body.respond_to?(:each) b = "" body.each {|a| b << a } b end |
#skip_slimmer_header?(backend_response) ⇒ Boolean
50 51 52 |
# File 'lib/slimmer/app.rb', line 50 def skip_slimmer_header?(backend_response) !! backend_response[1][SKIP_HEADER] end |
#skip_slimmer_param?(env) ⇒ Boolean
45 46 47 48 |
# File 'lib/slimmer/app.rb', line 45 def skip_slimmer_param?(env) skip = Rack::Request.new(env).params['skip_slimmer'] skip and skip.to_i > 0 end |