diff --git a/lib/mini_profiler/profiler.rb b/lib/mini_profiler/profiler.rb
index 96d518d7..ea9a1902 100644
--- a/lib/mini_profiler/profiler.rb
+++ b/lib/mini_profiler/profiler.rb
@@ -285,10 +285,12 @@ def call(env)
unless defined?(MemoryProfiler) && MemoryProfiler.respond_to?(:report)
message = "Please install the memory_profiler gem and require it: add gem 'memory_profiler' to your Gemfile"
- _, _, body = @app.call(env)
+ status, headers, body = @app.call(env)
body.close if body.respond_to? :close
- return client_settings.handle_cookie(text_result(message))
+ return client_settings.handle_cookie(
+ text_result(message, status: status, headers: headers)
+ )
end
query_params = Rack::Utils.parse_nested_query(query_string)
@@ -347,7 +349,15 @@ def call(env)
env['HTTP_ACCEPT_ENCODING'] = 'identity' if config.suppress_encoding
if query_string =~ /pp=(async-)?flamegraph/ || env['HTTP_REFERER'] =~ /pp=async-flamegraph/
- if defined?(StackProf) && StackProf.respond_to?(:run)
+ unless defined?(StackProf) && StackProf.respond_to?(:run)
+ message = "Please install the stackprof gem and require it: add gem 'stackprof' to your Gemfile"
+ status, headers, body = @app.call(env)
+ body.close if body.respond_to? :close
+
+ return client_settings.handle_cookie(
+ text_result(message, status: status, headers: headers)
+ )
+ else
# do not sully our profile with mini profiler timings
current.measure = false
match_data = query_string.match(/flamegraph_sample_rate=([\d\.]+)/)
@@ -638,9 +648,9 @@ def analyze_memory
text_result(body)
end
- def text_result(body)
- headers = { 'Content-Type' => 'text/plain; charset=utf-8' }
- [200, headers, [body]]
+ def text_result(body, status: 200, headers: nil)
+ headers = (headers || {}).merge('Content-Type' => 'text/plain; charset=utf-8')
+ [status, headers, [body]]
end
def make_link(postfix, env)
diff --git a/spec/integration/middleware_spec.rb b/spec/integration/middleware_spec.rb
index dfd6e5e8..7f916596 100644
--- a/spec/integration/middleware_spec.rb
+++ b/spec/integration/middleware_spec.rb
@@ -43,7 +43,15 @@ def app
def app
Rack::Builder.new do
use Rack::MiniProfiler
- run lambda { |_env| [200, { 'Content-Type' => 'text/html' }, [+'
Hi
']] }
+ run(
+ lambda do |_env|
+ [
+ 201,
+ { 'Content-Type' => 'text/html', 'X-CUSTOM' => "1" },
+ [+'Hi
'],
+ ]
+ end
+ )
end
end
@@ -59,29 +67,37 @@ def app
describe 'with profile-memory query' do
it 'should return memory_profiler error message' do
do_get(pp: 'profile-memory')
+
expect(last_response.body).to eq(
'Please install the memory_profiler gem and require it: add gem \'memory_profiler\' to your Gemfile'
)
+ expect(last_response.headers['Content-Type']).to eq('text/plain; charset=utf-8')
+ expect(last_response.headers['X-CUSTOM']).to eq('1')
+ expect(last_response.status).to eq(201)
end
end
describe 'with flamegraph query' do
it 'should return stackprof error message' do
- Rack::MiniProfiler.config.enable_advanced_debugging_tools = true
do_get(pp: 'flamegraph')
expect(last_response.body).to eq(
'Please install the stackprof gem and require it: add gem \'stackprof\' to your Gemfile'
)
+ expect(last_response.headers['Content-Type']).to eq('text/plain; charset=utf-8')
+ expect(last_response.headers['X-CUSTOM']).to eq('1')
+ expect(last_response.status).to eq(201)
end
end
describe 'with async-flamegraph query' do
it 'should return stackprof error message' do
- Rack::MiniProfiler.config.enable_advanced_debugging_tools = true
do_get(pp: 'async-flamegraph')
expect(last_response.body).to eq(
'Please install the stackprof gem and require it: add gem \'stackprof\' to your Gemfile'
)
+ expect(last_response.headers['Content-Type']).to eq('text/plain; charset=utf-8')
+ expect(last_response.headers['X-CUSTOM']).to eq('1')
+ expect(last_response.status).to eq(201)
end
end
end
diff --git a/spec/lib/profiler_spec.rb b/spec/lib/profiler_spec.rb
index 0a4d351b..11953f05 100644
--- a/spec/lib/profiler_spec.rb
+++ b/spec/lib/profiler_spec.rb
@@ -198,4 +198,35 @@ def self.bar(baz, boo)
expect(Rack::MiniProfiler.snapshots_transporter?).to eq(true)
end
end
+
+ describe '#call' do
+ let(:app) { lambda { |env| [200, {}, ["OK"]] } }
+ let(:profiler) { Rack::MiniProfiler.new(app) }
+
+ it "returns error response when stackprof isn't installed" do
+ response = profiler.call({ "PATH_INFO" => "/", "QUERY_STRING" => "pp=flamegraph" })
+
+ expect(response).to eq([
+ 200,
+ { "Content-Type" => "text/plain; charset=utf-8", "Set-Cookie"=>"__profilin=p%3Dt; path=/; HttpOnly; SameSite=Lax" },
+ ["Please install the stackprof gem and require it: add gem 'stackprof' to your Gemfile"],
+ ])
+ end
+
+ it "returns error response when memory_profiler isn't installed" do
+ original_enable_advanced_debugging_tools = Rack::MiniProfiler.config.enable_advanced_debugging_tools
+ Rack::MiniProfiler.config.enable_advanced_debugging_tools = true
+
+ response = profiler.call({ "PATH_INFO" => "/", "QUERY_STRING" => "pp=profile-memory" })
+
+ expect(response).to eq([
+ 200,
+ { "Content-Type" => "text/plain; charset=utf-8", "Set-Cookie"=>"__profilin=p%3Dt; path=/; HttpOnly; SameSite=Lax" },
+ ["Please install the memory_profiler gem and require it: add gem 'memory_profiler' to your Gemfile"],
+ ])
+
+ ensure
+ Rack::MiniProfiler.config.enable_advanced_debugging_tools = original_enable_advanced_debugging_tools
+ end
+ end
end