Class: Slimmer::App

Inherits:
Object
  • Object
show all
Defined in:
lib/slimmer/app.rb

Instance Method Summary collapse

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)
  options = args.first || {}
  @app = app

  logger = options[:logger] || NullLogger.instance
  self.logger = logger

  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("assets")
  end

  @skin = Skin.new options[:asset_host], options[:cache_templates], options[:prefix], :logger => logger
end

Instance Method Details

#admin(request, body) ⇒ Object



39
40
41
# File 'lib/slimmer/app.rb', line 39

def admin(request,body)
  @skin.admin(request,body)
end

#call(env) ⇒ Object



24
25
26
27
28
29
30
31
32
33
# File 'lib/slimmer/app.rb', line 24

def call(env)
  logger.debug "Slimmer: capturing response"
  response_array = @app.call(env)
  if response_array[1][SKIP_HEADER]
    logger.debug "Slimmer: Asked to skip slimmer via HTTP header"
    response_array
  else
    rewrite_response(env, response_array)
  end
end

#on_404(request, body) ⇒ Object



47
48
49
# File 'lib/slimmer/app.rb', line 47

def on_404(request,body)
  @skin.error(request, '404', body)
end

#on_error(request, status, body) ⇒ Object



43
44
45
# File 'lib/slimmer/app.rb', line 43

def on_error(request, status, body)
  @skin.error(request, '500', body)
end

#on_success(source_request, request, body) ⇒ Object



35
36
37
# File 'lib/slimmer/app.rb', line 35

def on_success(source_request, request, body)
  @skin.success(source_request, request, body)
end

#rewrite_response(env, response_to_skin) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/slimmer/app.rb', line 58

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'] = rewritten_body.join("").bytesize.to_s

  logger.debug "Slimmer: Returning final status, headers and body"
  [status, headers, rewritten_body]
end

#s(body) ⇒ Object



51
52
53
54
55
56
# File 'lib/slimmer/app.rb', line 51

def s(body)
  return body.to_s unless body.respond_to?(:each)
  b = ""
  body.each {|a| b << a }
  b
end