Class: Rack::PerftoolsProfiler::ProfilerMiddleware

Inherits:
Object
  • Object
show all
Includes:
Utils
Defined in:
lib/rack/perftools_profiler/profiler_middleware.rb

Constant Summary collapse

PRINTER_CONTENT_TYPE =
{
  :text => 'text/plain',
  :gif => 'image/gif',
  :pdf => 'application/pdf',
  :callgrind => 'text/plain',
  :raw => 'application/octet-stream'
}
PRINTERS =
PRINTER_CONTENT_TYPE.keys

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ ProfilerMiddleware

Returns a new instance of ProfilerMiddleware.



18
19
20
21
# File 'lib/rack/perftools_profiler/profiler_middleware.rb', line 18

def initialize(app, options = {})
  @app = app
  @profiler = Profiler.new(@app, options.clone)
end

Instance Method Details

#call(env) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/rack/perftools_profiler/profiler_middleware.rb', line 23

def call(env)
  # I used to clone the env, but it broke any apps that used Warden
  # ex) @env = env.clone
  @env = env
  action = Action.for_env(@env, @profiler, self)
  action.act
  action.response
rescue ProfilerArgumentError => err
  @env['rack.errors'].write(err.message)
  [400, {'Content-Type' => 'text/plain'}, [err.message]]
rescue ProfilingError => err
  @env['rack.errors'].write(err.message + "\n" + err.stderr)
  [500, {'Content-Type' => 'text/plain'}, [err.message+"\n\n", "Standard error:\n"+err.stderr+"\n"]]
end

#call_app(env) ⇒ Object



38
39
40
# File 'lib/rack/perftools_profiler/profiler_middleware.rb', line 38

def call_app(env)
  @app.call(env)
end

#force_stopObject



42
43
44
# File 'lib/rack/perftools_profiler/profiler_middleware.rb', line 42

def force_stop
  @profiler.stop
end

#profiler_data_response(profiling_data) ⇒ Object



46
47
48
49
50
51
52
53
54
55
# File 'lib/rack/perftools_profiler/profiler_middleware.rb', line 46

def profiler_data_response(profiling_data)
  format, body = profiling_data
  body = Array(body)
  if format==:none
    message = 'No profiling data available. Visit /__stop__ and then visit /__data__'
    [404, {'Content-Type' => 'text/plain'}, [message]]
  else
    [200, headers(format, body), Array(body)]
   end
end