rack-webprofiler 0.1.0.pre.beta1 → 0.1.0.pre.beta2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/README.md +7 -17
- data/lib/rack/templates/assets/css/profiler.css +1 -1
- data/lib/rack/templates/assets/css/rwpt.css +1 -1
- data/lib/rack/templates/assets/sass/_highlight.scss +63 -0
- data/lib/rack/templates/assets/sass/_variables.scss +1 -0
- data/lib/rack/templates/assets/sass/profiler.scss +1 -1
- data/lib/rack/templates/assets/sass/rwpt.scss +27 -9
- data/lib/rack/templates/async.erb +8 -8
- data/lib/rack/templates/panel/_sidebar.erb +3 -23
- data/lib/rack/templates/panel/index.erb +18 -6
- data/lib/rack/templates/panel/layout.erb +9 -5
- data/lib/rack/templates/panel/show.erb +25 -7
- data/lib/rack/templates/profiler.erb +15 -12
- data/lib/rack/web_profiler/collector/rack/request_collector.rb +38 -35
- data/lib/rack/web_profiler/collector/ruby_collector.rb +9 -7
- data/lib/rack/web_profiler/collector/time_collector.rb +2 -2
- data/lib/rack/web_profiler/collector/view.rb +44 -0
- data/lib/rack/web_profiler/collector.rb +29 -16
- data/lib/rack/web_profiler/config.rb +0 -10
- data/lib/rack/web_profiler/controller.rb +69 -64
- data/lib/rack/web_profiler/engine.rb +15 -6
- data/lib/rack/web_profiler/model/collection_record.rb +1 -0
- data/lib/rack/web_profiler/request.rb +5 -1
- data/lib/rack/web_profiler/router.rb +1 -1
- data/lib/rack/web_profiler/version.rb +1 -1
- data/lib/rack/web_profiler/view.rb +236 -0
- data/lib/rack/web_profiler.rb +34 -17
- data/rack-webprofiler.gemspec +1 -0
- metadata +19 -10
- data/lib/rack/web_profiler/auto_configure/rails.rb +0 -12
- data/lib/rack/web_profiler/collector/rails/active_record_collector.rb +0 -25
- data/lib/rack/web_profiler/collector/rails/logger_collector.rb +0 -22
- data/lib/rack/web_profiler/collector/rails/rails_collector.rb +0 -25
- data/lib/rack/web_profiler/collector/rails/request_collector.rb +0 -50
- data/lib/rack/web_profiler/collector/sinatra/request_collector.rb +0 -216
- data/lib/rack/web_profiler/collector/sinatra/sinatra_collector.rb +0 -25
- data/lib/rack/web_profiler/erb.rb +0 -9
@@ -18,11 +18,11 @@ ICON
|
|
18
18
|
store :request_cookies, request.cookies
|
19
19
|
store :request_get, request.GET
|
20
20
|
store :request_post, get_request_post(request)
|
21
|
-
store :request_session, request.session
|
21
|
+
store :request_session, hash_to_s(request.session)
|
22
22
|
store :request_cookies, request.cookies
|
23
23
|
store :request_body, get_request_body(request)
|
24
24
|
|
25
|
-
store :rack_env,
|
25
|
+
store :rack_env, hash_to_s(request.env)
|
26
26
|
|
27
27
|
store :response_status, response.status
|
28
28
|
store :response_headers, response.headers
|
@@ -38,8 +38,6 @@ ICON
|
|
38
38
|
|
39
39
|
template __FILE__, type: :DATA
|
40
40
|
|
41
|
-
is_enabled? -> { defined?(Rack) && !defined?(Rails) && !defined?(Sinatra) }
|
42
|
-
|
43
41
|
class << self
|
44
42
|
# Get request headers.
|
45
43
|
#
|
@@ -57,22 +55,27 @@ ICON
|
|
57
55
|
end
|
58
56
|
|
59
57
|
def get_request_body(request)
|
60
|
-
return nil if request.body.nil?
|
61
|
-
request.body.
|
58
|
+
return nil if request.body.nil? || request.get?
|
59
|
+
body = request.body.dup
|
60
|
+
body.read
|
61
|
+
end
|
62
|
+
|
63
|
+
def hash_to_s(hash)
|
64
|
+
hash.collect {|k,v| [k, v.to_s]}
|
62
65
|
end
|
63
66
|
end
|
64
67
|
end
|
65
68
|
end
|
66
69
|
|
67
70
|
__END__
|
68
|
-
<%
|
69
|
-
<%= data
|
71
|
+
<% tab_content do %>
|
72
|
+
<%=h data(:response_status) %>
|
70
73
|
<% end %>
|
71
74
|
|
72
|
-
<%
|
75
|
+
<% panel_content do %>
|
73
76
|
<div class="block">
|
74
77
|
<h3>GET</h3>
|
75
|
-
<% unless data
|
78
|
+
<% unless data(:request_get).empty? %>
|
76
79
|
<table>
|
77
80
|
<thead>
|
78
81
|
<tr>
|
@@ -81,10 +84,10 @@ __END__
|
|
81
84
|
</tr>
|
82
85
|
<thead>
|
83
86
|
<tbody>
|
84
|
-
<% data
|
87
|
+
<% data(:request_get).each do |k, v| %>
|
85
88
|
<tr>
|
86
|
-
<th><%= k %></th>
|
87
|
-
<td class="code"><%= v %></td>
|
89
|
+
<th><%=h k %></th>
|
90
|
+
<td class="code"><%=h v %></td>
|
88
91
|
</tr>
|
89
92
|
<% end %>
|
90
93
|
</tbody>
|
@@ -96,7 +99,7 @@ __END__
|
|
96
99
|
|
97
100
|
<div class="block">
|
98
101
|
<h3>POST</h3>
|
99
|
-
<% if data
|
102
|
+
<% if data(:request_post) && !data(:request_post).empty? %>
|
100
103
|
<table>
|
101
104
|
<thead>
|
102
105
|
<tr>
|
@@ -105,10 +108,10 @@ __END__
|
|
105
108
|
</tr>
|
106
109
|
<thead>
|
107
110
|
<tbody>
|
108
|
-
<% data
|
111
|
+
<% data(:request_post).each do |k, v| %>
|
109
112
|
<tr>
|
110
|
-
<th><%= k %></th>
|
111
|
-
<td class="code"><%= v %></td>
|
113
|
+
<th><%=h k %></th>
|
114
|
+
<td class="code"><%=h v %></td>
|
112
115
|
</tr>
|
113
116
|
<% end %>
|
114
117
|
</tbody>
|
@@ -120,7 +123,7 @@ __END__
|
|
120
123
|
|
121
124
|
<div class="block">
|
122
125
|
<h3>Request headers</h3>
|
123
|
-
<% unless data
|
126
|
+
<% unless data(:request_headers).empty? %>
|
124
127
|
<table>
|
125
128
|
<thead>
|
126
129
|
<tr>
|
@@ -129,10 +132,10 @@ __END__
|
|
129
132
|
</tr>
|
130
133
|
<thead>
|
131
134
|
<tbody>
|
132
|
-
<% data
|
135
|
+
<% data(:request_headers).sort.each do |k, v| %>
|
133
136
|
<tr>
|
134
|
-
<th><%= k %></th>
|
135
|
-
<td class="code"><%= v %></td>
|
137
|
+
<th><%=h k %></th>
|
138
|
+
<td class="code"><%=h v %></td>
|
136
139
|
</tr>
|
137
140
|
<% end %>
|
138
141
|
</tbody>
|
@@ -144,8 +147,8 @@ __END__
|
|
144
147
|
|
145
148
|
<div class="block">
|
146
149
|
<h3>Request content</h3>
|
147
|
-
<% unless data
|
148
|
-
|
150
|
+
<% unless data(:request_body).nil? %>
|
151
|
+
<%=highlight code: data(:request_body) %>
|
149
152
|
<% else %>
|
150
153
|
<p><span class="text__no-value">No request content</span></p>
|
151
154
|
<% end %>
|
@@ -153,7 +156,7 @@ __END__
|
|
153
156
|
|
154
157
|
<div class="block">
|
155
158
|
<h3>Response headers</h3>
|
156
|
-
<% unless data
|
159
|
+
<% unless data(:response_headers).empty? %>
|
157
160
|
<table>
|
158
161
|
<thead>
|
159
162
|
<tr>
|
@@ -162,7 +165,7 @@ __END__
|
|
162
165
|
</tr>
|
163
166
|
<thead>
|
164
167
|
<tbody>
|
165
|
-
<% data
|
168
|
+
<% data(:response_headers).sort.each do |k, v| %>
|
166
169
|
<tr>
|
167
170
|
<th><%= k %></th>
|
168
171
|
<td class="code"><%= v %></td>
|
@@ -177,7 +180,7 @@ __END__
|
|
177
180
|
|
178
181
|
<div class="block">
|
179
182
|
<h3>Session</h3>
|
180
|
-
<% unless data
|
183
|
+
<% unless data(:request_session).empty? %>
|
181
184
|
<table>
|
182
185
|
<thead>
|
183
186
|
<tr>
|
@@ -186,7 +189,7 @@ __END__
|
|
186
189
|
</tr>
|
187
190
|
<thead>
|
188
191
|
<tbody>
|
189
|
-
<% data
|
192
|
+
<% data(:request_session).each do |k, v| %>
|
190
193
|
<tr>
|
191
194
|
<th><%= k %></th>
|
192
195
|
<td class="code"><%= v %></td>
|
@@ -201,7 +204,7 @@ __END__
|
|
201
204
|
|
202
205
|
<div class="block">
|
203
206
|
<h3>Cookies</h3>
|
204
|
-
<% unless data
|
207
|
+
<% unless data(:request_cookies).empty? %>
|
205
208
|
<table>
|
206
209
|
<thead>
|
207
210
|
<tr>
|
@@ -210,10 +213,10 @@ __END__
|
|
210
213
|
</tr>
|
211
214
|
<thead>
|
212
215
|
<tbody>
|
213
|
-
<% data
|
216
|
+
<% data(:request_cookies).each do |k, v| %>
|
214
217
|
<tr>
|
215
|
-
<th><%= k %></th>
|
216
|
-
<td class="code"><%= v %></td>
|
218
|
+
<th><%=h k %></th>
|
219
|
+
<td class="code"><%=h v %></td>
|
217
220
|
</tr>
|
218
221
|
<% end %>
|
219
222
|
</tbody>
|
@@ -225,7 +228,7 @@ __END__
|
|
225
228
|
|
226
229
|
<div class="block">
|
227
230
|
<h3>Env</h3>
|
228
|
-
<% if data
|
231
|
+
<% if data(:rack_env) && !data(:rack_env).empty? %>
|
229
232
|
<table>
|
230
233
|
<thead>
|
231
234
|
<tr>
|
@@ -234,10 +237,10 @@ __END__
|
|
234
237
|
</tr>
|
235
238
|
<thead>
|
236
239
|
<tbody>
|
237
|
-
<% data
|
240
|
+
<% data(:rack_env).sort.each do |k, v| %>
|
238
241
|
<tr>
|
239
|
-
<th><%= k %></th>
|
240
|
-
<td class="code"><%= v %></td>
|
242
|
+
<th><%=h k %></th>
|
243
|
+
<td class="code"><%=h v %></td>
|
241
244
|
</tr>
|
242
245
|
<% end %>
|
243
246
|
</tbody>
|
@@ -41,21 +41,21 @@ ICON
|
|
41
41
|
end
|
42
42
|
|
43
43
|
__END__
|
44
|
-
<%
|
45
|
-
<%= data
|
44
|
+
<% tab_content do %>
|
45
|
+
<%=h data(:ruby_version) %>
|
46
46
|
<% end %>
|
47
47
|
|
48
|
-
<%
|
48
|
+
<% panel_content do %>
|
49
49
|
<div class="block">
|
50
50
|
<h3>Ruby informations</h3>
|
51
51
|
<table>
|
52
52
|
<tr>
|
53
53
|
<th>Version</th>
|
54
|
-
<td><%= "#{data
|
54
|
+
<td><%=h "#{data(:ruby_version)}p#{data(:ruby_patchlevel)} (#{data(:ruby_release_date)} revision #{data(:ruby_revision)}) [#{data(:ruby_platform)}]" %></td>
|
55
55
|
</tr>
|
56
56
|
<tr>
|
57
57
|
<th>Documentation</th>
|
58
|
-
<td><a href="<%= data
|
58
|
+
<td><a href="<%=h data(:ruby_doc_url) %>"><%= data(:ruby_doc_url) %></a></td>
|
59
59
|
</tr>
|
60
60
|
</table>
|
61
61
|
</div>
|
@@ -67,13 +67,15 @@ __END__
|
|
67
67
|
<tr>
|
68
68
|
<th>Name</th>
|
69
69
|
<th>Version</th>
|
70
|
+
<th>Summary</th>
|
70
71
|
</tr>
|
71
72
|
<thead>
|
72
73
|
<tbody>
|
73
|
-
<% data
|
74
|
+
<% data(:gems_list).sort!{|a,b| a[:name] <=> b[:name] }.each do |g| %>
|
74
75
|
<tr>
|
75
|
-
<th><%= g[:name] %></th>
|
76
|
+
<th><a href="<%= g[:homepage] %>"><%= g[:name] %></a></th>
|
76
77
|
<td><%= g[:version] %></td>
|
78
|
+
<td><%= g[:summary] %></td>
|
77
79
|
</tr>
|
78
80
|
<% end %>
|
79
81
|
</tbody>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Rack
|
2
|
+
class WebProfiler::Collector::View < WebProfiler::View
|
3
|
+
|
4
|
+
def context
|
5
|
+
@context ||= Context.new
|
6
|
+
end
|
7
|
+
|
8
|
+
# Helpers
|
9
|
+
module Helpers
|
10
|
+
|
11
|
+
def tab_content
|
12
|
+
if block_given?
|
13
|
+
@tab_content ||= capture(&Proc.new)
|
14
|
+
elsif !@tab_content.nil?
|
15
|
+
@tab_content
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def panel_content
|
20
|
+
if block_given?
|
21
|
+
@panel_content ||= capture(&Proc.new)
|
22
|
+
elsif !@panel_content.nil?
|
23
|
+
@panel_content
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def data(k)
|
28
|
+
return nil if @collection.nil?
|
29
|
+
|
30
|
+
datas = @collection.datas[@collector.name.to_sym][:datas]
|
31
|
+
return datas[k] if datas.has_key?(k)
|
32
|
+
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
protected
|
38
|
+
|
39
|
+
class Context
|
40
|
+
include WebProfiler::View::CommonHelpers
|
41
|
+
include Helpers
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -6,24 +6,13 @@ module Rack
|
|
6
6
|
class WebProfiler::Collector
|
7
7
|
autoload :RubyCollector, "rack/web_profiler/collector/ruby_collector"
|
8
8
|
autoload :TimeCollector, "rack/web_profiler/collector/time_collector"
|
9
|
+
autoload :View, "rack/web_profiler/collector/view"
|
9
10
|
|
10
11
|
module Rack
|
11
12
|
autoload :RackCollector, "rack/web_profiler/collector/rack/rack_collector"
|
12
13
|
autoload :RequestCollector, "rack/web_profiler/collector/rack/request_collector"
|
13
14
|
end
|
14
15
|
|
15
|
-
module Rails
|
16
|
-
autoload :ActiveRecordCollector, "rack/web_profiler/collector/rails/active_record_collector"
|
17
|
-
autoload :LoggerCollector, "rack/web_profiler/collector/rails/logger_collector"
|
18
|
-
autoload :RailsCollector, "rack/web_profiler/collector/rails/rails_collector"
|
19
|
-
autoload :RequestCollector, "rack/web_profiler/collector/rails/request_collector"
|
20
|
-
end
|
21
|
-
|
22
|
-
module Sinatra
|
23
|
-
autoload :RequestCollector, "rack/web_profiler/collector/sinatra/request_collector"
|
24
|
-
autoload :SinatraCollector, "rack/web_profiler/collector/sinatra/sinatra_collector"
|
25
|
-
end
|
26
|
-
|
27
16
|
# DSL
|
28
17
|
module DSL
|
29
18
|
def self.included(base)
|
@@ -104,8 +93,10 @@ module Rack
|
|
104
93
|
attr_reader :datas
|
105
94
|
|
106
95
|
def initialize
|
107
|
-
@datas
|
108
|
-
@status
|
96
|
+
@datas = Hash.new
|
97
|
+
@status = nil
|
98
|
+
@show_tab = true
|
99
|
+
@show_panel = true
|
109
100
|
end
|
110
101
|
|
111
102
|
# Store a value.
|
@@ -129,13 +120,35 @@ module Rack
|
|
129
120
|
@status
|
130
121
|
end
|
131
122
|
|
123
|
+
#
|
124
|
+
#
|
125
|
+
# @param b [Boolean, nil]
|
126
|
+
#
|
127
|
+
# @return [Boolean]
|
128
|
+
def show_panel(b = nil)
|
129
|
+
@show_panel = !!b unless b.nil?
|
130
|
+
@show_panel
|
131
|
+
end
|
132
|
+
|
133
|
+
#
|
134
|
+
#
|
135
|
+
# @param b [Boolean, nil]
|
136
|
+
#
|
137
|
+
# @return [Boolean]
|
138
|
+
def show_tab(b = nil)
|
139
|
+
@show_tab = !!b unless b.nil?
|
140
|
+
@show_tab
|
141
|
+
end
|
142
|
+
|
132
143
|
# Transform DataStorage to an Hash
|
133
144
|
#
|
134
145
|
# @return [Hash<Symbol, Object>]
|
135
146
|
def to_h
|
136
147
|
{
|
137
|
-
datas:
|
138
|
-
status:
|
148
|
+
datas: @datas,
|
149
|
+
status: @status,
|
150
|
+
show_panel: @show_panel,
|
151
|
+
show_tab: @show_tab,
|
139
152
|
}
|
140
153
|
end
|
141
154
|
end
|
@@ -13,16 +13,6 @@ module Rack
|
|
13
13
|
# Rack
|
14
14
|
# Rack::WebProfiler::Collector::Rack::RackCollector,
|
15
15
|
Rack::WebProfiler::Collector::Rack::RequestCollector,
|
16
|
-
|
17
|
-
# Rails
|
18
|
-
# Rack::WebProfiler::Collector::Rails::ActiveRecordCollector,
|
19
|
-
# Rack::WebProfiler::Collector::Rails::LoggerCollector,
|
20
|
-
Rack::WebProfiler::Collector::Rails::RailsCollector,
|
21
|
-
Rack::WebProfiler::Collector::Rails::RequestCollector,
|
22
|
-
|
23
|
-
# Sinatra
|
24
|
-
Rack::WebProfiler::Collector::Sinatra::RequestCollector,
|
25
|
-
Rack::WebProfiler::Collector::Sinatra::SinatraCollector,
|
26
16
|
].freeze
|
27
17
|
def initialize
|
28
18
|
@collectors = Rack::WebProfiler::Collectors.new
|
@@ -10,55 +10,61 @@ module Rack
|
|
10
10
|
#
|
11
11
|
# @param request [Rack::WebProfiler::Request]
|
12
12
|
def initialize(request)
|
13
|
-
@request
|
14
|
-
@contents_for = {}
|
13
|
+
@request = request
|
15
14
|
end
|
16
15
|
|
17
16
|
# List the webprofiler history.
|
17
|
+
#
|
18
|
+
# @return [Rack::Response]
|
18
19
|
def index
|
19
20
|
@collections = Rack::WebProfiler::Model::CollectionRecord.order(Sequel.desc(:created_at))
|
20
21
|
.limit(20)
|
21
22
|
|
23
|
+
return json(@collections, 200, {only: [:token, :http_method, :http_status, :url, :ip]}) if prefer_json?
|
24
|
+
return json(@collections, to_json_opts: {only: [:token, :http_method, :http_status, :url, :ip]}) if prefer_json?
|
22
25
|
erb "panel/index.erb", layout: "panel/layout.erb"
|
23
26
|
end
|
24
27
|
|
25
28
|
# Show the webprofiler panel.
|
29
|
+
#
|
30
|
+
# @param token [String] The collection token
|
31
|
+
#
|
32
|
+
# @return [Rack::Response]
|
26
33
|
def show(token)
|
27
34
|
@collection = Rack::WebProfiler::Model::CollectionRecord[token: token]
|
28
|
-
return
|
35
|
+
return not_found if @collection.nil?
|
29
36
|
|
30
37
|
@collectors = Rack::WebProfiler.config.collectors.all
|
31
38
|
@collector = nil
|
32
39
|
|
33
40
|
unless @request.params['panel'].nil?
|
34
41
|
@collector = @collectors[@request.params['panel'].to_sym]
|
35
|
-
|
36
|
-
|
37
|
-
if @collector.nil?
|
42
|
+
else
|
38
43
|
@collector = @collectors.values.first
|
39
44
|
end
|
45
|
+
return not_found if @collector.nil?
|
40
46
|
|
41
|
-
@
|
42
|
-
|
43
|
-
# @todo return json if request.content_type ask json (same for xml?)
|
44
|
-
# @example json(@collectors) if @request.media_type.include? "json"
|
45
|
-
|
47
|
+
return json(@collection) if prefer_json?
|
46
48
|
erb "panel/show.erb", layout: "panel/layout.erb"
|
47
49
|
end
|
48
50
|
|
49
|
-
# Print the webprofiler toolbar
|
51
|
+
# Print the webprofiler toolbar.
|
52
|
+
#
|
53
|
+
# @param token [String] The collection token
|
54
|
+
#
|
55
|
+
# @return [Rack::Response]
|
50
56
|
def show_toolbar(token)
|
51
57
|
@collection = Rack::WebProfiler::Model::CollectionRecord[token: token]
|
52
58
|
return erb nil, status: 404 if @collection.nil?
|
53
59
|
|
54
60
|
@collectors = Rack::WebProfiler.config.collectors.all
|
55
|
-
# @todo process the callector views
|
56
|
-
# @collectors = Rack::WebProfiler::Collector.render_tabs(@record)
|
57
61
|
|
58
62
|
erb "profiler.erb"
|
59
63
|
end
|
60
64
|
|
61
65
|
# Clean the webprofiler.
|
66
|
+
#
|
67
|
+
# @return [Rack::Response]
|
62
68
|
def delete
|
63
69
|
Rack::WebProfiler::Model.clean
|
64
70
|
|
@@ -67,30 +73,62 @@ module Rack
|
|
67
73
|
|
68
74
|
private
|
69
75
|
|
76
|
+
# Is "application/json" reponse is prefered?
|
77
|
+
#
|
78
|
+
# @return [Boolean]
|
79
|
+
#
|
80
|
+
# @private
|
81
|
+
def prefer_json?
|
82
|
+
prefered_http_accept == "application/json"
|
83
|
+
end
|
84
|
+
|
85
|
+
# Returns the prefered Content-Type response between html and json.
|
86
|
+
#
|
87
|
+
# @return [String]
|
88
|
+
#
|
89
|
+
# @private
|
90
|
+
def prefered_http_accept
|
91
|
+
Rack::Utils.best_q_match(@request.env["HTTP_ACCEPT"], %w[text/html application/json])
|
92
|
+
end
|
93
|
+
|
94
|
+
# Redirection.
|
95
|
+
#
|
96
|
+
# @param path [string]
|
97
|
+
#
|
98
|
+
# @return [Rack::Response]
|
99
|
+
#
|
100
|
+
# @private
|
70
101
|
def redirect(path)
|
71
102
|
Rack::Response.new([], 302, {
|
72
103
|
"Location" => "#{@request.base_url}#{path}",
|
73
104
|
})
|
74
105
|
end
|
75
106
|
|
107
|
+
# 404 page.
|
108
|
+
#
|
109
|
+
# @return [Rack::Response]
|
110
|
+
#
|
111
|
+
# @private
|
112
|
+
def not_found
|
113
|
+
erb "404.erb", layout: "panel/layout.erb", status: 404
|
114
|
+
end
|
115
|
+
|
76
116
|
# Render a HTML reponse from an ERB template.
|
77
117
|
#
|
78
118
|
# @param path [String] Path to the ERB template
|
119
|
+
# @option layout [String, nil] Path to the ERB layout
|
120
|
+
# @option variables [Hash, nil] List of variables to the view
|
121
|
+
# @option status [Integer] HTTP status code
|
79
122
|
#
|
80
123
|
# @return [Rack::Response]
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
templates = [read_template(path)]
|
86
|
-
templates << read_template(layout) unless layout.nil?
|
124
|
+
#
|
125
|
+
# @private
|
126
|
+
def erb(path, layout: nil, variables: nil, status: 200)
|
127
|
+
v = WebProfiler::View.new(path, layout: layout)
|
87
128
|
|
88
|
-
|
89
|
-
_render_erb(temp) { prev }
|
90
|
-
end
|
91
|
-
end
|
129
|
+
variables ||= binding
|
92
130
|
|
93
|
-
Rack::Response.new(
|
131
|
+
Rack::Response.new(v.result(variables), status, {
|
94
132
|
"Content-Type" => "text/html",
|
95
133
|
})
|
96
134
|
end
|
@@ -98,49 +136,16 @@ module Rack
|
|
98
136
|
# Render a JSON response from an Array or a Hash.
|
99
137
|
#
|
100
138
|
# @param data [Array, Hash] Data
|
139
|
+
# @param status [Integer]
|
140
|
+
# @param opts [Hash]
|
101
141
|
#
|
102
142
|
# @return [Rack::Response]
|
103
|
-
|
104
|
-
|
143
|
+
#
|
144
|
+
# @private
|
145
|
+
def json(data = {}, status: 200, to_json_opts: {})
|
146
|
+
Rack::Response.new(data.send(:to_json, opts), status, {
|
105
147
|
"Content-Type" => "application/json",
|
106
148
|
})
|
107
149
|
end
|
108
|
-
|
109
|
-
def error404
|
110
|
-
erb "404.erb", layout: "panel/layout.erb", status: 404
|
111
|
-
end
|
112
|
-
|
113
|
-
def _render_erb(template)
|
114
|
-
ERB.new(template).result(binding)
|
115
|
-
end
|
116
|
-
|
117
|
-
def partial(path)
|
118
|
-
return "" if path.nil?
|
119
|
-
ERB.new(read_template(path)).result(binding)
|
120
|
-
end
|
121
|
-
|
122
|
-
def render_collector(collector, data)
|
123
|
-
@data = data
|
124
|
-
return "" if collector.nil?
|
125
|
-
ERB.new(read_template(collector.template)).result(binding)
|
126
|
-
end
|
127
|
-
|
128
|
-
def content_for(name)
|
129
|
-
name = name.to_sym
|
130
|
-
|
131
|
-
if block_given?
|
132
|
-
@contents_for[name] = Proc.new
|
133
|
-
elsif @contents_for[name].respond_to?(:call)
|
134
|
-
@contents_for[name].call
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
def read_template(template)
|
139
|
-
unless template.empty?
|
140
|
-
path = ::File.expand_path("../../templates/#{template}", __FILE__)
|
141
|
-
return ::File.read(path) if ::File.exist?(path)
|
142
|
-
end
|
143
|
-
template
|
144
|
-
end
|
145
150
|
end
|
146
151
|
end
|
@@ -2,7 +2,7 @@ module Rack
|
|
2
2
|
#
|
3
3
|
class WebProfiler::Engine
|
4
4
|
class << self
|
5
|
-
# Process
|
5
|
+
# Process request.
|
6
6
|
#
|
7
7
|
# @param request [Rack::WebProfiler::Request]
|
8
8
|
# @param body
|
@@ -22,7 +22,7 @@ module Rack
|
|
22
22
|
response = Rack::Response.new([], status, headers)
|
23
23
|
|
24
24
|
response.header["X-RackWebProfiler-Token"] = @token
|
25
|
-
response.header["X-RackWebProfiler-Url"] =
|
25
|
+
response.header["X-RackWebProfiler-Url"] = WebProfiler::Router.url_for_profiler(record.token)
|
26
26
|
|
27
27
|
if defined? Rails and body.is_a? ActionDispatch::Response::RackBody
|
28
28
|
body = body.body
|
@@ -37,12 +37,21 @@ module Rack
|
|
37
37
|
response
|
38
38
|
end
|
39
39
|
|
40
|
+
# Process an exception.
|
41
|
+
#
|
42
|
+
# @param request [Rack::WebProfiler::Request]
|
43
|
+
#
|
44
|
+
# @return [Rack::Response]
|
45
|
+
def process_exception(request)
|
46
|
+
process(request, [], 500, {})
|
47
|
+
end
|
48
|
+
|
40
49
|
private
|
41
50
|
|
42
51
|
# Collect
|
43
52
|
#
|
44
|
-
# @param request
|
45
|
-
# @param response
|
53
|
+
# @param request [Rack::WebProfiler::Request]
|
54
|
+
# @param response [Rack::Response]
|
46
55
|
def collect!(request, response)
|
47
56
|
processor = Processor.new(request, response)
|
48
57
|
processor.save!
|
@@ -61,7 +70,7 @@ module Rack
|
|
61
70
|
#
|
62
71
|
# @return [String]
|
63
72
|
def template
|
64
|
-
@template ||=
|
73
|
+
@template ||= WebProfiler::View.new("async.erb")
|
65
74
|
end
|
66
75
|
|
67
76
|
class Processor
|
@@ -85,7 +94,7 @@ module Rack
|
|
85
94
|
|
86
95
|
def create_record!
|
87
96
|
@record ||= WebProfiler::Model::CollectionRecord.create({
|
88
|
-
url: @request.
|
97
|
+
url: @request.url,
|
89
98
|
ip: @request.ip,
|
90
99
|
http_method: @request.request_method,
|
91
100
|
http_status: @response.status,
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Rack
|
2
2
|
#
|
3
3
|
class WebProfiler::Request < Rack::Request
|
4
|
-
attr_reader :runtime
|
4
|
+
attr_reader :runtime, :exception
|
5
5
|
|
6
6
|
def start_runtime!
|
7
7
|
@request_start ||= Time.now.to_f
|
@@ -10,5 +10,9 @@ module Rack
|
|
10
10
|
def save_runtime!
|
11
11
|
@runtime ||= Time.now.to_f - @request_start
|
12
12
|
end
|
13
|
+
|
14
|
+
def save_exception(e)
|
15
|
+
@exception = e
|
16
|
+
end
|
13
17
|
end
|
14
18
|
end
|