Class: Honeybadger::Rack::UserFeedback

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/honeybadger/rack/user_feedback.rb

Overview

Middleware for Rack applications. Adds a feedback form to the Rack response when an error has occurred.

Instance Method Summary collapse

Constructor Details

#initialize(app, agent = nil) ⇒ UserFeedback

Returns a new instance of UserFeedback.



24
25
26
27
# File 'lib/honeybadger/rack/user_feedback.rb', line 24

def initialize(app, agent = nil)
  @app = app
  @agent = agent.is_a?(Agent) && agent
end

Instance Method Details

#actionObject

TODO:

Make this method and others actually private.



51
52
53
54
55
# File 'lib/honeybadger/rack/user_feedback.rb', line 51

def action
  URI.parse("#{config.connection_protocol}://#{config[:"connection.host"]}:#{config.connection_port}/v1/feedback/").to_s
rescue URI::InvalidURIError
  nil
end

#call(env) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/honeybadger/rack/user_feedback.rb', line 29

def call(env)
  status, headers, body = @app.call(env)
  if env["honeybadger.error_id"] && (form = render_form(env["honeybadger.error_id"]))
    new_body = []
    body.each do |chunk|
      new_body << chunk.gsub("<!-- HONEYBADGER FEEDBACK -->", form)
    end
    body.close if body.respond_to?(:close)
    # Delete both cases to handle Rack 2 (mixed case) and Rack 3 (lowercase) headers
    headers.delete("Transfer-Encoding")
    headers.delete("transfer-encoding")
    # Also normalize Content-Length - delete both cases before setting
    headers.delete("Content-Length")
    headers.delete("content-length")
    headers["content-length"] = new_body.reduce(0) { |a, e| a + e.bytesize }.to_s
    body = new_body
  end
  [status, headers, body]
end

#custom_template_fileObject



64
65
66
# File 'lib/honeybadger/rack/user_feedback.rb', line 64

def custom_template_file
  @custom_template_file ||= File.join(config[:root], "lib", "honeybadger", "templates", "feedback_form.erb")
end

#custom_template_file?Boolean

Returns:

  • (Boolean)


69
70
71
# File 'lib/honeybadger/rack/user_feedback.rb', line 69

def custom_template_file?
  custom_template_file && File.exist?(custom_template_file)
end

#render_form(error_id, action = action()) ⇒ Object



58
59
60
61
# File 'lib/honeybadger/rack/user_feedback.rb', line 58

def render_form(error_id, action = action())
  return unless action
  ERB.new(@template ||= File.read(template_file)).result(binding)
end

#template_fileObject



74
75
76
77
78
79
80
# File 'lib/honeybadger/rack/user_feedback.rb', line 74

def template_file
  if custom_template_file?
    custom_template_file
  else
    File.expand_path("../../templates/feedback_form.erb", __FILE__)
  end
end