Class: Insight::SpeedTracer::TraceApp

Inherits:
Object
  • Object
show all
Includes:
Database::RequestDataClient
Defined in:
lib/insight/panels/speedtracer_panel/trace-app.rb

Constant Summary

CONTENT_TYPE =
'application/json;charset=UTF-8'.freeze
FourOhFour =
[404, {"Content-Type" => "text/html"}, "App tracker doesn't know that path or id"].freeze

Instance Method Summary (collapse)

Methods included from Database::RequestDataClient

#key_sql_template, #retrieve, #store, #table_length, #table_setup

Constructor Details

- (TraceApp) initialize

A new instance of TraceApp



10
11
12
13
# File 'lib/insight/panels/speedtracer_panel/trace-app.rb', line 10

def initialize
  table_setup("speedtracer", "uuid")
  key_sql_template = "'%s'"
end

Instance Method Details

- (Object) call(env)



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/insight/panels/speedtracer_panel/trace-app.rb', line 15

def call(env)
  resp = Rack::Response.new('', 200)
  resp['Content-Type'] = CONTENT_TYPE

  case env['REQUEST_METHOD']
  when 'HEAD' then
    # SpeedTracer dispatches HEAD requests to verify the
    # tracer endpoint when it detects the X-TraceUrl
    # header for the first time. After the initial load
    # the verification is cached by the extension.
    #
    # By default, we'll return 200.

  when 'GET' then
    # GET requests for specific trace are generated by
    # the extension when the user expands the network
    # resource tab. Hence, server-side tracer data is
    # request on-demand, and we need to store it for
    # some time.
    #

    qs = Rack::Utils.parse_query(env['QUERY_STRING'])
    if qs['id'] && (trace = @table.retrieve("uuid = '#{qs['id']}'"))
      resp.write trace.to_json
    else
      # Invalid request or missing request trace id
      return FourOhFour
    end
  else
    # SpeedTracer should only issue GET & HEAD requests
    resp.status = 400
  end

  return resp.finish
end