Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-04-29 18:10:07 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-04-29 18:10:07 +0300
commitc5e4f06c597e7ef9b584595a55a82cb221804e4b (patch)
tree2db854553738bf601a40d427dbb9eaf5516be027 /lib/gitlab/middleware
parentdb36dea03b0e56ed242eb290c51be88ca4c61a65 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/middleware')
-rw-r--r--lib/gitlab/middleware/speedscope.rb36
1 files changed, 22 insertions, 14 deletions
diff --git a/lib/gitlab/middleware/speedscope.rb b/lib/gitlab/middleware/speedscope.rb
index 7eade40c47a..547aab9c797 100644
--- a/lib/gitlab/middleware/speedscope.rb
+++ b/lib/gitlab/middleware/speedscope.rb
@@ -8,35 +8,43 @@ module Gitlab
end
def call(env)
- request = Rack::Request.new(env)
+ request = ActionDispatch::Request.new(env)
- if request.params['performance_bar'] == 'flamegraph' && Gitlab::PerformanceBar.allowed_for_user?(request.env['warden'].user)
- body = nil
+ return @app.call(env) unless rendering_flamegraph?(request)
- Gitlab::SafeRequestStore[:capturing_flamegraph] = true
+ body = nil
- require 'stackprof'
+ ::Gitlab::SafeRequestStore[:capturing_flamegraph] = true
+ require 'stackprof'
+
+ begin
flamegraph = ::StackProf.run(
mode: :wall,
raw: true,
aggregate: false,
- interval: (0.5 * 1000).to_i
+ interval: ::Gitlab::StackProf::DEFAULT_INTERVAL_US
) do
_, _, body = @app.call(env)
end
-
- path = env['PATH_INFO'].sub('//', '/')
+ ensure
body.close if body.respond_to?(:close)
-
- return flamegraph(flamegraph, path)
end
- @app.call(env)
+ render_flamegraph(flamegraph, request)
end
- def flamegraph(graph, path)
+ private
+
+ def rendering_flamegraph?(request)
+ request.params['performance_bar'] == 'flamegraph' && ::Gitlab::PerformanceBar.allowed_for_user?(request.env['warden']&.user)
+ end
+
+ def render_flamegraph(graph, request)
headers = { 'Content-Type' => 'text/html' }
+ path = request.env['PATH_INFO'].sub('//', '/')
+
+ speedscope_url = ActionController::Base.helpers.asset_url('/-/speedscope/index.html')
html = <<~HTML
<!DOCTYPE html>
@@ -48,7 +56,7 @@ module Gitlab
</style>
</head>
<body>
- <script type="text/javascript">
+ <script type="text/javascript" nonce="#{request.content_security_policy_nonce}">
var graph = #{Gitlab::Json.generate(graph)};
var json = JSON.stringify(graph);
var blob = new Blob([json], { type: 'text/plain' });
@@ -56,7 +64,7 @@ module Gitlab
var iframe = document.createElement('IFRAME');
iframe.setAttribute('id', 'speedscope-iframe');
document.body.appendChild(iframe);
- var iframeUrl = '#{Gitlab.config.gitlab.relative_url_root}/assets/speedscope/index.html#profileURL=' + objUrl + '&title=' + 'Flamegraph for #{CGI.escape(path)}';
+ var iframeUrl = '#{speedscope_url}#profileURL=' + objUrl + '&title=' + 'Flamegraph for #{CGI.escape(path)}';
iframe.setAttribute('src', iframeUrl);
</script>
</body>