Sha256: dda8a8f2f92efa2c94b3c7a1589aa62efbd98558f8e903e268eeb48dd3a7d9e4

Contents?: true

Size: 1.61 KB

Versions: 4

Compression:

Stored size: 1.61 KB

Contents

require 'rack'

module NewRelic::Rack
  class BrowserMonitoring

    def initialize(app, options = {})
      @app = app
    end

    # method required by Rack interface
    def call(env)
      result = @app.call(env)   # [status, headers, response]

      if (NewRelic::Agent.browser_timing_header != "") && should_instrument?(result[0], result[1])
        response_string = autoinstrument_source(result[2], result[1])

        if (response_string)
          Rack::Response.new(response_string, result[0], result[1]).finish
        else
          result
        end
      else
        result
      end
    end

    def should_instrument?(status, headers)
      status == 200 && headers["Content-Type"] && headers["Content-Type"].include?("text/html")
    end

    def autoinstrument_source(response, headers)
      source = nil
      response.each {|fragment| (source) ? (source << f) : (source = fragment)}

      body_start = source.index("<body")
      body_close = source.rindex("</body>")

      if body_start && body_close
        footer = NewRelic::Agent.browser_timing_footer
        header = NewRelic::Agent.browser_timing_header

        head_open = source.index("<head")

        if head_open
          head_close = source.index(">", head_open)

          head_pos = head_close + 1
        else
          # put the header right above body start
          head_pos = body_start
        end

        source = source[0..(head_pos-1)] + header + source[head_pos..(body_close-1)] + footer + source[body_close..-1]

        headers['Content-Length'] = source.length.to_s if headers['Content-Length']
      end

      source
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
newrelic_rpm-3.1.0.beta1 lib/new_relic/rack/browser_monitoring.rb
newrelic_rpm-3.0.0 lib/new_relic/rack/browser_monitoring.rb
newrelic_rpm-3.0.0.beta2 lib/new_relic/rack/browser_monitoring.rb
newrelic_rpm-3.0.0.beta1 lib/new_relic/rack/browser_monitoring.rb