rack-webprofiler 0.1.0.pre.beta2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/CHANGELOG.md +36 -12
- data/README.md +16 -12
- data/docs/DSL.md +152 -0
- data/docs/GettingStarted.md +51 -0
- data/docs/README.md +6 -0
- 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/_variables.scss +21 -2
- data/lib/rack/templates/assets/sass/profiler.scss +73 -61
- data/lib/rack/templates/assets/sass/rwpt.scss +2 -2
- data/lib/rack/templates/panel/show.erb +4 -4
- data/lib/rack/templates/profiler.erb +4 -0
- data/lib/rack/web_profiler/collector.rb +197 -125
- data/lib/rack/web_profiler/collectors/rack_collector.rb +74 -0
- data/lib/rack/web_profiler/{collector/rack → collectors}/request_collector.rb +43 -60
- data/lib/rack/web_profiler/{collector → collectors}/ruby_collector.rb +4 -3
- data/lib/rack/web_profiler/{collector → collectors}/time_collector.rb +12 -6
- data/lib/rack/web_profiler/collectors.rb +21 -27
- data/lib/rack/web_profiler/config.rb +4 -9
- data/lib/rack/web_profiler/controller.rb +131 -126
- data/lib/rack/web_profiler/engine.rb +10 -14
- data/lib/rack/web_profiler/model.rb +74 -23
- data/lib/rack/web_profiler/request.rb +22 -7
- data/lib/rack/web_profiler/response.rb +27 -0
- data/lib/rack/web_profiler/rouge/html_formatter.rb +25 -0
- data/lib/rack/web_profiler/router.rb +11 -6
- data/lib/rack/web_profiler/version.rb +1 -1
- data/lib/rack/web_profiler/view.rb +255 -139
- data/lib/rack/web_profiler.rb +47 -4
- data/rack-webprofiler.gemspec +1 -3
- metadata +32 -32
- data/lib/rack/web_profiler/collector/debug_collector.rb +0 -31
- data/lib/rack/web_profiler/collector/erb_collector.rb +0 -0
- data/lib/rack/web_profiler/collector/performance_collector.rb +0 -1
- data/lib/rack/web_profiler/collector/rack/rack_collector.rb +0 -23
- data/lib/rack/web_profiler/collector/view.rb +0 -44
- data/lib/rack/web_profiler/model/collection_record.rb +0 -46
@@ -217,7 +217,8 @@ body {
|
|
217
217
|
-webkit-user-select: none;
|
218
218
|
user-select: none;
|
219
219
|
|
220
|
-
&:hover
|
220
|
+
&:hover,
|
221
|
+
&.active {
|
221
222
|
background-color: $profiler_panel__sidebar_item_hover;
|
222
223
|
}
|
223
224
|
&.sidebar__item--blank {
|
@@ -263,7 +264,6 @@ body {
|
|
263
264
|
width: 100%;
|
264
265
|
min-height: calc(100% - 80px);
|
265
266
|
padding: 20px;
|
266
|
-
margin-bottom: 50px;
|
267
267
|
}
|
268
268
|
.wrapper__container {
|
269
269
|
box-sizing: border-box;
|
@@ -7,13 +7,13 @@
|
|
7
7
|
<% content_for :sidebar do %>
|
8
8
|
<% @collectors.each do |_k, collector| %>
|
9
9
|
<% if collector_has_panel?(collector, @collection) %>
|
10
|
-
<div class="sidebar__item">
|
10
|
+
<div class="sidebar__item<%= collector == @collector ? " active" : nil %>">
|
11
11
|
<div class="sidebar__item-inner">
|
12
|
-
<a href="<%=h WebProfiler::Router.url_for_profiler(@collection.token, collector.
|
12
|
+
<a href="<%=h WebProfiler::Router.url_for_profiler(@collection.token, collector.identifier) %>">
|
13
13
|
<i class="icn">
|
14
14
|
<% unless collector.icon.nil? %><img alt="" src="<%=h collector.icon %>" /><% end %>
|
15
15
|
</i>
|
16
|
-
<span><%=h collector.
|
16
|
+
<span><%=h collector.label %></span>
|
17
17
|
</a>
|
18
18
|
</div>
|
19
19
|
</div>
|
@@ -21,6 +21,6 @@
|
|
21
21
|
<% end %>
|
22
22
|
<% end %>
|
23
23
|
|
24
|
-
<div class="rack-webprofiler_collectors_<%=h @collector.
|
24
|
+
<div class="rack-webprofiler_collectors_<%=h @collector.identifier.to_s %>">
|
25
25
|
<%= collector_panel(@collector, @collection) %>
|
26
26
|
</div>
|
@@ -9,6 +9,8 @@
|
|
9
9
|
<div class="rack-webprofiler__item rack-webprofiler_collectors_<%=h name.to_s %>">
|
10
10
|
<% if collector_has_panel?(collector, @collection) %>
|
11
11
|
<a href="<%=h WebProfiler::Router.url_for_profiler(@collection.token, name) %>">
|
12
|
+
<% else %>
|
13
|
+
<span class="rack-webprofiler__item-content">
|
12
14
|
<% end %>
|
13
15
|
<% unless collector.icon.nil? %>
|
14
16
|
<i class="icn"><img alt="" src="<%=h collector.icon %>" /></i>
|
@@ -19,6 +21,8 @@
|
|
19
21
|
<span class="rack-webprofiler__item__status-color <%=h status.to_s %>"></span>
|
20
22
|
<% if collector_has_panel?(collector, @collection) %>
|
21
23
|
</a>
|
24
|
+
<% else %>
|
25
|
+
</span>
|
22
26
|
<% end %>
|
23
27
|
</div>
|
24
28
|
<% end %>
|
@@ -1,155 +1,227 @@
|
|
1
1
|
require "docile"
|
2
2
|
|
3
3
|
module Rack
|
4
|
+
class WebProfiler
|
5
|
+
# Collector
|
6
|
+
class Collector
|
7
|
+
# DSL
|
8
|
+
module DSL
|
9
|
+
def self.included(base)
|
10
|
+
base.extend(ClassMethods)
|
11
|
+
base.class_eval do
|
12
|
+
@definition = Definition.new
|
13
|
+
@definition.position = 1
|
14
|
+
@definition.is_enabled = true
|
15
|
+
@definition.klass = self
|
16
|
+
end
|
17
|
+
end
|
4
18
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
19
|
+
module ClassMethods
|
20
|
+
attr_reader :definition
|
21
|
+
|
22
|
+
# Set the icon of the {Rack::WebProfiler::Collector}.
|
23
|
+
#
|
24
|
+
# @param icon [String, nil]
|
25
|
+
def icon(icon = nil); definition.icon = icon; end
|
26
|
+
|
27
|
+
# Set the identifier of the {Rack::WebProfiler::Collector}.
|
28
|
+
#
|
29
|
+
# @param identifier [String, nil]
|
30
|
+
def identifier(identifier = nil); definition.identifier = identifier; end
|
31
|
+
|
32
|
+
# Set the label of the {Rack::WebProfiler::Collector}.
|
33
|
+
#
|
34
|
+
# @param label [String, nil]
|
35
|
+
def label(label = nil); definition.label = label; end
|
36
|
+
|
37
|
+
#
|
38
|
+
def position(position = nil); definition.position = position.to_i; end
|
39
|
+
|
40
|
+
#
|
41
|
+
def collect(&block); definition.collect = block; end
|
42
|
+
|
43
|
+
# Set the template of the {Rack::WebProfiler::Collector}.
|
44
|
+
#
|
45
|
+
# @param template [String, nil]
|
46
|
+
# @option type [Symbol] :file or :DATA
|
47
|
+
def template(template = nil, type: :file)
|
48
|
+
template = get_data_contents(template) if type == :DATA
|
49
|
+
definition.template = template
|
50
|
+
end
|
10
51
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
52
|
+
# Tell if the {Rack::WebProfiler::Collector} is enabled.
|
53
|
+
#
|
54
|
+
# @param is_enabled [Boolean, Block]
|
55
|
+
def is_enabled?(is_enabled = true)
|
56
|
+
definition.is_enabled = Proc.new if block_given?
|
57
|
+
definition.is_enabled = is_enabled
|
58
|
+
end
|
15
59
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
60
|
+
private
|
61
|
+
|
62
|
+
def get_data_contents(path)
|
63
|
+
data = ""
|
64
|
+
::File.open(path, "rb") do |f|
|
65
|
+
begin
|
66
|
+
line = f.gets
|
67
|
+
end until line.nil? || /^__END__$/ === line
|
68
|
+
data << line while line = f.gets
|
69
|
+
end
|
70
|
+
data
|
71
|
+
end
|
25
72
|
end
|
26
73
|
end
|
27
74
|
|
28
|
-
|
29
|
-
|
75
|
+
# Definition
|
76
|
+
#
|
77
|
+
# Collector definition.
|
78
|
+
class Definition
|
79
|
+
attr_accessor :icon, :identifier, :label, :position, :collect, :template, :is_enabled, :klass
|
80
|
+
attr_reader :data_storage
|
81
|
+
|
82
|
+
# Collect the data who the Collector need.
|
83
|
+
#
|
84
|
+
# @param request [Rack::WebProfiler::Request]
|
85
|
+
# @param response [Rack::Response]
|
86
|
+
#
|
87
|
+
# @return [Rack::WebProfiler::Collector::DSL::DataStorage]
|
88
|
+
def collect!(request, response)
|
89
|
+
@data_storage = Docile.dsl_eval(DataStorage.new, request, response, &collect)
|
90
|
+
end
|
30
91
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
def
|
92
|
+
# Is the collector enabled.
|
93
|
+
#
|
94
|
+
# @return [Boolean]
|
95
|
+
def is_enabled?
|
96
|
+
return !!@is_enabled.call if @is_enabled.is_a?(Proc)
|
97
|
+
!!@is_enabled
|
98
|
+
end
|
99
|
+
end
|
35
100
|
|
36
|
-
|
37
|
-
|
38
|
-
|
101
|
+
# DataStorage
|
102
|
+
#
|
103
|
+
# Used to store datas who Collector needs.
|
104
|
+
#
|
105
|
+
# @todo do DataStorage compatible with Marshal
|
106
|
+
class DataStorage
|
107
|
+
attr_reader :datas
|
108
|
+
|
109
|
+
def initialize
|
110
|
+
@datas = Hash.new
|
111
|
+
@status = nil
|
112
|
+
@show_tab = true
|
113
|
+
@show_panel = true
|
39
114
|
end
|
40
115
|
|
41
|
-
|
42
|
-
|
43
|
-
|
116
|
+
# Store a value.
|
117
|
+
#
|
118
|
+
# @param k [String, Symbol]
|
119
|
+
# @param v
|
120
|
+
def store(k, v)
|
121
|
+
# @todo check data format (must be compatible with Marshal)
|
122
|
+
@datas[k.to_sym] = v
|
44
123
|
end
|
45
124
|
|
46
|
-
|
125
|
+
# Status.
|
126
|
+
#
|
127
|
+
# @param v [Symbol, nil]
|
128
|
+
#
|
129
|
+
# @return [Symbol, nil]
|
130
|
+
def status(v = nil)
|
131
|
+
# @todo check status?
|
132
|
+
# raise Exception, "" unless [:success, :warning, :danger].include?(v)
|
133
|
+
@status = v.to_sym unless v.nil?
|
134
|
+
@status
|
135
|
+
end
|
47
136
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
data
|
137
|
+
#
|
138
|
+
#
|
139
|
+
# @param b [Boolean, nil]
|
140
|
+
#
|
141
|
+
# @return [Boolean]
|
142
|
+
def show_panel(b = nil)
|
143
|
+
@show_panel = !!b unless b.nil?
|
144
|
+
@show_panel
|
57
145
|
end
|
58
|
-
end
|
59
|
-
end
|
60
146
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
147
|
+
#
|
148
|
+
#
|
149
|
+
# @param b [Boolean, nil]
|
150
|
+
#
|
151
|
+
# @return [Boolean]
|
152
|
+
def show_tab(b = nil)
|
153
|
+
@show_tab = !!b unless b.nil?
|
154
|
+
@show_tab
|
155
|
+
end
|
67
156
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
157
|
+
# Transform DataStorage to an Hash
|
158
|
+
#
|
159
|
+
# @return [Hash<Symbol, Object>]
|
160
|
+
def to_h
|
161
|
+
{
|
162
|
+
datas: @datas,
|
163
|
+
status: @status,
|
164
|
+
show_panel: @show_panel,
|
165
|
+
show_tab: @show_tab,
|
166
|
+
}
|
167
|
+
end
|
76
168
|
end
|
77
169
|
|
78
|
-
#
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
end
|
85
|
-
end
|
170
|
+
# View
|
171
|
+
class View < WebProfiler::View
|
172
|
+
#
|
173
|
+
def context
|
174
|
+
@context ||= Context.new
|
175
|
+
end
|
86
176
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
@show_tab = true
|
99
|
-
@show_panel = true
|
100
|
-
end
|
177
|
+
# Read a template. Returns file content if template is a file path.
|
178
|
+
#
|
179
|
+
# @param template [String] template file path or content
|
180
|
+
#
|
181
|
+
# @return [String]
|
182
|
+
def read_template(template)
|
183
|
+
unless template.empty?
|
184
|
+
return ::File.read(template) if ::File.exist?(template)
|
185
|
+
end
|
186
|
+
template
|
187
|
+
end
|
101
188
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
189
|
+
# Helpers
|
190
|
+
module Helpers
|
191
|
+
# @todo comment
|
192
|
+
def tab_content
|
193
|
+
if block_given?
|
194
|
+
@tab_content ||= capture(&Proc.new)
|
195
|
+
elsif !@tab_content.nil?
|
196
|
+
@tab_content
|
197
|
+
end
|
198
|
+
end
|
110
199
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
@status = v.to_sym unless v.nil?
|
120
|
-
@status
|
121
|
-
end
|
200
|
+
# @todo comment
|
201
|
+
def panel_content
|
202
|
+
if block_given?
|
203
|
+
@panel_content ||= capture(&Proc.new)
|
204
|
+
elsif !@panel_content.nil?
|
205
|
+
@panel_content
|
206
|
+
end
|
207
|
+
end
|
122
208
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
#
|
127
|
-
# @return [Boolean]
|
128
|
-
def show_panel(b = nil)
|
129
|
-
@show_panel = !!b unless b.nil?
|
130
|
-
@show_panel
|
131
|
-
end
|
209
|
+
# @todo comment
|
210
|
+
def data(k, default = nil)
|
211
|
+
return nil if @collection.nil?
|
132
212
|
|
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
|
213
|
+
datas = @collection.datas[@collector.identifier.to_sym][:datas]
|
214
|
+
return datas[k] if datas.has_key?(k)
|
142
215
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
}
|
216
|
+
default
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
# @todo comment
|
221
|
+
class Context
|
222
|
+
include WebProfiler::View::Helpers::Common
|
223
|
+
include Helpers
|
224
|
+
end
|
153
225
|
end
|
154
226
|
end
|
155
227
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Rack
|
2
|
+
class WebProfiler::Collectors::RackCollector
|
3
|
+
include Rack::WebProfiler::Collector::DSL
|
4
|
+
|
5
|
+
icon <<-'ICON'
|
6
|
+
data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiB2aWV3Qm94PSIwIDAgMjIgMjIiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+ICAgICAgICA8dGl0bGU+R3JvdXA8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4gICAgPGRlZnM+PC9kZWZzPiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4gICAgICAgIDxnIGlkPSJEZXYtYmFyLSstRHJvcCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTkuMDAwMDAwLCAtMTc2LjAwMDAwMCkiIHN0cm9rZT0iIzQ1NDI1QSI+ICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMC4wMDAwMDAsIDE3Ny4wMDAwMDApIj4gICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlJlY3RhbmdsZS0yNzgiIHBvaW50cz0iMCA0IDYgMCAyMCA1IDIwIDE2IDE0IDIwIDAgMTUiPjwvcG9seWdvbj4gICAgICAgICAgICAgICAgPHBhdGggZD0iTTE1Ljg2Njg2Miw4LjUxMzUwOTA5IEwyMCwxMCIgaWQ9IlJlY3RhbmdsZS0yNzgtQ29weS04Ij48L3BhdGg+ICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNS44NjY4NjIsMTMuNTEzNTA5MSBMMjAsMTUiIGlkPSJSZWN0YW5nbGUtMjc4LUNvcHktOSI+PC9wYXRoPiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCw5IEw1LDYiIGlkPSJSZWN0YW5nbGUtMjc4LUNvcHktNiI+PC9wYXRoPiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQsOSBMMTQsMTkuNTExODk4IiBpZD0iTGluZSIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSI+PC9wYXRoPiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwxNCBMNSwxMSIgaWQ9IlJlY3RhbmdsZS0yNzgtQ29weS03Ij48L3BhdGg+ICAgICAgICAgICAgICAgIDxwb2x5bGluZSBpZD0iUmVjdGFuZ2xlLTI3OC1Db3B5IiBwb2ludHM9IjIwIDUgMTQgOSAwIDQiPjwvcG9seWxpbmU+ICAgICAgICAgICAgICAgIDxwb2x5bGluZSBpZD0iUmVjdGFuZ2xlLTI3OC1Db3B5LTIiIHBvaW50cz0iMjAgMTUgMTQgMTkgMCAxNCI+PC9wb2x5bGluZT4gICAgICAgICAgICAgICAgPHBvbHlsaW5lIGlkPSJSZWN0YW5nbGUtMjc4LUNvcHktNCIgcG9pbnRzPSIyMCAxMSAxNCAxNSAwIDEwIj48L3BvbHlsaW5lPiAgICAgICAgICAgICAgICA8cG9seWxpbmUgaWQ9IlJlY3RhbmdsZS0yNzgtQ29weS01IiBwb2ludHM9IjIwIDEwIDE0IDE0IDAgOSI+PC9wb2x5bGluZT4gICAgICAgICAgICAgICAgPHBvbHlsaW5lIGlkPSJSZWN0YW5nbGUtMjc4LUNvcHktMyIgcG9pbnRzPSIyMCA2IDE0IDEwIDAgNSI+PC9wb2x5bGluZT4gICAgICAgICAgICA8L2c+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=
|
7
|
+
ICON
|
8
|
+
|
9
|
+
identifier "rack"
|
10
|
+
label "Rack"
|
11
|
+
position 1
|
12
|
+
|
13
|
+
collect do |request, _response|
|
14
|
+
store :rack_version, Rack.release
|
15
|
+
store :rack_env, hash_stringify_values(request.env)
|
16
|
+
end
|
17
|
+
|
18
|
+
template __FILE__, type: :DATA
|
19
|
+
|
20
|
+
class << self
|
21
|
+
def hash_stringify_values(hash)
|
22
|
+
return {} unless hash.kind_of?(Hash)
|
23
|
+
hash.collect do |k,v|
|
24
|
+
v = v.inspect unless v.kind_of?(String)
|
25
|
+
[k, v]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
__END__
|
33
|
+
<% tab_content do %>
|
34
|
+
<%=h data(:rack_version) %>
|
35
|
+
<% end %>
|
36
|
+
|
37
|
+
<% panel_content do %>
|
38
|
+
<div class="block">
|
39
|
+
<h3>Rack informations</h3>
|
40
|
+
|
41
|
+
<table>
|
42
|
+
<tbody>
|
43
|
+
<tr>
|
44
|
+
<th>Version</th>
|
45
|
+
<td><%=h data(:rack_version) %></td>
|
46
|
+
</tr>
|
47
|
+
</tbody>
|
48
|
+
</table>
|
49
|
+
</div>
|
50
|
+
|
51
|
+
<div class="block">
|
52
|
+
<h3>Env</h3>
|
53
|
+
<% if data(:rack_env) && !data(:rack_env).empty? %>
|
54
|
+
<table>
|
55
|
+
<thead>
|
56
|
+
<tr>
|
57
|
+
<th>Key</th>
|
58
|
+
<th>Value</th>
|
59
|
+
</tr>
|
60
|
+
<thead>
|
61
|
+
<tbody>
|
62
|
+
<% data(:rack_env).sort.each do |k, v| %>
|
63
|
+
<tr>
|
64
|
+
<th><%=h k %></th>
|
65
|
+
<td class="code"><%=h v %></td>
|
66
|
+
</tr>
|
67
|
+
<% end %>
|
68
|
+
</tbody>
|
69
|
+
</table>
|
70
|
+
<% else %>
|
71
|
+
<p><span class="text__no-value">No rack env datas</span></p>
|
72
|
+
<% end %>
|
73
|
+
</div>
|
74
|
+
<% end %>
|
@@ -1,66 +1,52 @@
|
|
1
1
|
module Rack
|
2
|
-
class WebProfiler::
|
2
|
+
class WebProfiler::Collectors::RequestCollector
|
3
3
|
include Rack::WebProfiler::Collector::DSL
|
4
4
|
|
5
5
|
icon <<-'ICON'
|
6
6
|
data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+ICAgICAgICA8dGl0bGU+T3ZhbCA3IENvcHkgMjwvdGl0bGU+ICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPiAgICA8ZGVmcz48L2RlZnM+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkRlc2t0b3AtMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwLjAwMDAwMCwgLTEzMC4wMDAwMDApIiBmaWxsPSIjNTg1NDczIj4gICAgICAgICAgICA8ZyBpZD0iUmVxdWVzdCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDEyMC4wMDAwMDApIj4gICAgICAgICAgICAgICAgPHBhdGggZD0iTTE3LjY3OTE5MTIsMTMuNDA2NDMyMiBDMTguMTAzNzAxMiwxMy4yNTUzNzMzIDE4LjU0NzA4OSwxMy4xNDQ1ODY0IDE5LjAwNDgzMTcsMTMuMDc4NjI3OCBMMTkuMDA0ODMxNywxMCBMMjAuOTk1MTY4MywxMCBMMjAuOTk1MTY4MywxMy4wNzg2Mjc4IEMyMS40NTI5MTEsMTMuMTQ0NTg2NCAyMS44OTYyOTg4LDEzLjI1NTM3MzMgMjIuMzIwODA4OCwxMy40MDY0MzIyIEwyMy43NjY1Mzg2LDEwLjY4NzQxIEwyNS41MjM5MDE1LDExLjYyMTgxNjUgTDI0LjA4MDM0MDcsMTQuMzM2NzU5NiBDMjQuNDU0NDUyLDE0LjYwOTU2NTUgMjQuODAwNTkwMywxNC45MTg5MDYzIDI1LjExMzU5ODIsMTUuMjU5NTg2NCBMMjcuNjI0NzkyLDEzLjUwMTIyOTYgTDI4Ljc2NjQwMjIsMTUuMTMxNjE3OSBMMjYuMjM5NDcyLDE2LjkwMDk5MzUgQzI2LjQ0Mjk1ODQsMTcuMzEyNjE1IDI2LjYwNzQ4OTQsMTcuNzQ3MjEzIDI2LjcyODIwMjgsMTguMTk5ODg5MyBMMjkuNzc1NjgxNCwxNy44MjU3MDU5IEwzMC4wMTgyNDI0LDE5LjgwMTIwNjkgTDI2Ljk2NDU5ODcsMjAuMTc2MTQ3MiBDMjYuOTU0Njg2MiwyMC42NDkzNjI3IDI2Ljg5ODI3NTUsMjEuMTExMDU1NiAyNi43OTk3ODQxLDIxLjU1Njc3NTkgTDI5LjY3NTIwODQsMjIuNjYwNTQ3OSBMMjguOTYxOTM1NiwyNC41MTg2ODcyIEwyNi4wOTg1NTE3LDIzLjQxOTUzNzEgQzI1Ljg3MzU5ODcsMjMuODI4ODI2IDI1LjYwOTIyNDgsMjQuMjEzMDczNSAyNS4zMTA1OTI0LDI0LjU2NzA3OTEgTDI3LjM2NTk4NjQsMjYuODQ5ODI1NCBMMjUuODg2ODc4LDI4LjE4MTYyMDYgTDIzLjgyNDc3MTQsMjUuODkxNDE5MSBDMjMuNDQ1Mzk3NywyNi4xNDI5NDcyIDIzLjA0MDE3MDgsMjYuMzU4MTMyMyAyMi42MTM5NzI3LDI2LjUzMjA1NjQgTDIzLjM1ODEzMTgsMjkuNTE2NzE1NCBMMjEuNDI2OTE2NiwyOS45OTgyMjE0IEwyMC42ODE3ODQ0LDI3LjAwOTY1OTQgQzIwLjQ1NzQ2NzgsMjcuMDMxNjA5MyAyMC4yMzAwMzYsMjcuMDQyODQxNiAyMCwyNy4wNDI4NDE2IEMxOS43Njk5NjQsMjcuMDQyODQxNiAxOS41NDI1MzIyLDI3LjAzMTYwOTMgMTkuMzE4MjE1NiwyNy4wMDk2NTk0IEwxOC41NzMwODM0LDI5Ljk5ODIyMTQgTDE2LjY0MTg2ODIsMjkuNTE2NzE1NCBMMTcuMzg2MDI3MywyNi41MzIwNTY0IEMxNi45NTk4MjkyLDI2LjM1ODEzMjMgMTYuNTU0NjAyMywyNi4xNDI5NDcyIDE2LjE3NTIyODYsMjUuODkxNDE5MSBMMTQuMTEzMTIyLDI4LjE4MTYyMDYgTDEyLjYzNDAxMzYsMjYuODQ5ODI1NCBMMTQuNjg5NDA3NiwyNC41NjcwNzkxIEMxNC4zOTA3NzUyLDI0LjIxMzA3MzUgMTQuMTI2NDAxMywyMy44Mjg4MjYgMTMuOTAxNDQ4MywyMy40MTk1MzcxIEwxMS4wMzgwNjQ0LDI0LjUxODY4NzIgTDEwLjMyNDc5MTYsMjIuNjYwNTQ3OSBMMTMuMjAwMjE1OSwyMS41NTY3NzU5IEMxMy4xMDE3MjQ1LDIxLjExMTA1NTYgMTMuMDQ1MzEzOCwyMC42NDkzNjI4IDEzLjAzNTQwMTMsMjAuMTc2MTQ3MyBMOS45ODE3NTc1OSwxOS44MDEyMDY5IEwxMC4yMjQzMTg2LDE3LjgyNTcwNTkgTDEzLjI3MTc5NzIsMTguMTk5ODg5MyBDMTMuMzkyNTEwNiwxNy43NDcyMTMgMTMuNTU3MDQxNiwxNy4zMTI2MTUgMTMuNzYwNTI4LDE2LjkwMDk5MzUgTDExLjIzMzU5NzgsMTUuMTMxNjE3OSBMMTIuMzc1MjA4LDEzLjUwMTIyOTYgTDE0Ljg4NjQwMTgsMTUuMjU5NTg2NCBDMTUuMTk5NDA5NywxNC45MTg5MDYzIDE1LjU0NTU0OCwxNC42MDk1NjU1IDE1LjkxOTY1OTMsMTQuMzM2NzU5NiBMMTQuNDc2MDk4NSwxMS42MjE4MTY1IEwxNi4yMzM0NjE0LDEwLjY4NzQxIEwxNy42NzkxOTEyLDEzLjQwNjQzMjIgWiBNMjAsMjMuMDMyNzYxMiBDMjEuNjQ4ODQ4OSwyMy4wMzI3NjEyIDIyLjk4NTUwNSwyMS42ODYyMzA2IDIyLjk4NTUwNSwyMC4wMjUyMDA5IEMyMi45ODU1MDUsMTguMzY0MTcxMyAyMS42NDg4NDg5LDE3LjAxNzY0MDYgMjAsMTcuMDE3NjQwNiBDMTguMzUxMTUxMSwxNy4wMTc2NDA2IDE3LjAxNDQ5NSwxOC4zNjQxNzEzIDE3LjAxNDQ5NSwyMC4wMjUyMDA5IEMxNy4wMTQ0OTUsMjEuNjg2MjMwNiAxOC4zNTExNTExLDIzLjAzMjc2MTIgMjAsMjMuMDMyNzYxMiBaIiBpZD0iT3ZhbC03LUNvcHktMiI+PC9wYXRoPiAgICAgICAgICAgIDwvZz4gICAgICAgIDwvZz4gICAgPC9nPjwvc3ZnPg==
|
7
7
|
ICON
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
position 2
|
9
|
+
identifier "rack.request"
|
10
|
+
label "Request"
|
11
|
+
position 2
|
13
12
|
|
14
13
|
collect do |request, response|
|
15
|
-
store :request_headers,
|
16
|
-
store :
|
17
|
-
store :request_method,
|
18
|
-
store :request_cookies,
|
19
|
-
store :request_get,
|
20
|
-
store :request_post,
|
21
|
-
store :request_session,
|
22
|
-
store :request_cookies,
|
23
|
-
store :request_body,
|
24
|
-
|
25
|
-
store :
|
14
|
+
store :request_headers, request.http_headers
|
15
|
+
store :request_fullpath, request.fullpath
|
16
|
+
store :request_method, request.request_method
|
17
|
+
store :request_cookies, request.cookies
|
18
|
+
store :request_get, request.GET
|
19
|
+
store :request_post, request_post(request)
|
20
|
+
store :request_session, hash_stringify_values(request.session)
|
21
|
+
store :request_cookies, request.cookies
|
22
|
+
store :request_body, request.body_string
|
23
|
+
store :request_mediatype, request.media_type
|
24
|
+
store :request_raw, request.raw
|
26
25
|
|
27
26
|
store :response_status, response.status
|
28
27
|
store :response_headers, response.headers
|
28
|
+
store :response_raw, response.raw
|
29
29
|
|
30
30
|
if response.successful?
|
31
31
|
status :success
|
32
32
|
elsif response.redirection?
|
33
33
|
status :warning
|
34
34
|
else
|
35
|
-
status :
|
35
|
+
status :danger
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
template __FILE__, type: :DATA
|
40
40
|
|
41
41
|
class << self
|
42
|
-
|
43
|
-
#
|
44
|
-
# @return [Hash]
|
45
|
-
def get_request_headers(request)
|
46
|
-
request.env.select {|k,v| k.start_with? 'HTTP_'}
|
47
|
-
.collect {|k,v| [k.sub(/^HTTP_/, ''), v]}
|
48
|
-
.collect {|k,v| [k.split('_').collect(&:capitalize).join('-'), v]}
|
49
|
-
end
|
50
|
-
|
51
|
-
def get_request_post(request)
|
42
|
+
def request_post(request)
|
52
43
|
request.POST if request.POST && !request.POST.empty?
|
53
44
|
rescue Exception
|
54
45
|
nil
|
55
46
|
end
|
56
47
|
|
57
|
-
def
|
58
|
-
return
|
59
|
-
body = request.body.dup
|
60
|
-
body.read
|
61
|
-
end
|
62
|
-
|
63
|
-
def hash_to_s(hash)
|
48
|
+
def hash_stringify_values(hash)
|
49
|
+
return {} unless hash.kind_of?(Hash)
|
64
50
|
hash.collect {|k,v| [k, v.to_s]}
|
65
51
|
end
|
66
52
|
end
|
@@ -70,6 +56,17 @@ end
|
|
70
56
|
__END__
|
71
57
|
<% tab_content do %>
|
72
58
|
<%=h data(:response_status) %>
|
59
|
+
|
60
|
+
<div class="details">
|
61
|
+
<div class="wrapper">
|
62
|
+
<dl>
|
63
|
+
<dt>Status</dt>
|
64
|
+
<dd><%=h data(:response_status) %> - <%=h Rack::Utils::HTTP_STATUS_CODES[data(:response_status).to_i] %></dd>
|
65
|
+
<dt>Path</dt>
|
66
|
+
<dd><%=h data(:request_method) %> <%=h data(:request_fullpath) %></dd>
|
67
|
+
</dl>
|
68
|
+
</div>
|
69
|
+
</div>
|
73
70
|
<% end %>
|
74
71
|
|
75
72
|
<% panel_content do %>
|
@@ -147,12 +144,22 @@ __END__
|
|
147
144
|
|
148
145
|
<div class="block">
|
149
146
|
<h3>Request content</h3>
|
150
|
-
<% unless data(:request_body).
|
151
|
-
<%=highlight code: data(:request_body) %>
|
147
|
+
<% unless data(:request_body).empty? %>
|
148
|
+
<%=highlight mimetype: data(:request_mediatype), code: data(:request_body) %>
|
152
149
|
<% else %>
|
153
150
|
<p><span class="text__no-value">No request content</span></p>
|
154
151
|
<% end %>
|
155
152
|
</div>
|
153
|
+
</div>
|
154
|
+
|
155
|
+
<div class="block">
|
156
|
+
<h3>Request raw</h3>
|
157
|
+
<% unless data(:request_raw).nil? %>
|
158
|
+
<%=highlight language: :http, code: data(:request_raw) %>
|
159
|
+
<% else %>
|
160
|
+
<p><span class="text__no-value">No request raw</span></p>
|
161
|
+
<% end %>
|
162
|
+
</div>
|
156
163
|
|
157
164
|
<div class="block">
|
158
165
|
<h3>Response headers</h3>
|
@@ -225,28 +232,4 @@ __END__
|
|
225
232
|
<p><span class="text__no-value">No cookies data</span></p>
|
226
233
|
<% end %>
|
227
234
|
</div>
|
228
|
-
|
229
|
-
<div class="block">
|
230
|
-
<h3>Env</h3>
|
231
|
-
<% if data(:rack_env) && !data(:rack_env).empty? %>
|
232
|
-
<table>
|
233
|
-
<thead>
|
234
|
-
<tr>
|
235
|
-
<th>Key</th>
|
236
|
-
<th>Value</th>
|
237
|
-
</tr>
|
238
|
-
<thead>
|
239
|
-
<tbody>
|
240
|
-
<% data(:rack_env).sort.each do |k, v| %>
|
241
|
-
<tr>
|
242
|
-
<th><%=h k %></th>
|
243
|
-
<td class="code"><%=h v %></td>
|
244
|
-
</tr>
|
245
|
-
<% end %>
|
246
|
-
</tbody>
|
247
|
-
</table>
|
248
|
-
<% else %>
|
249
|
-
<p><span class="text__no-value">No rack env datas</span></p>
|
250
|
-
<% end %>
|
251
|
-
</div>
|
252
235
|
<% end %>
|
@@ -1,13 +1,14 @@
|
|
1
1
|
module Rack
|
2
|
-
class WebProfiler::
|
2
|
+
class WebProfiler::Collectors::RubyCollector
|
3
3
|
include Rack::WebProfiler::Collector::DSL
|
4
4
|
|
5
5
|
icon <<-'ICON'
|
6
6
|
data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+ICAgICAgICA8dGl0bGU+VHJpYW5nbGUgMTwvdGl0bGU+ICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPiAgICA8ZGVmcz48L2RlZnM+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkRlc2t0b3AtMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcxLjAwMDAwMCwgLTEwLjAwMDAwMCkiIGZpbGw9IiM1ODU0NzMiPiAgICAgICAgICAgIDxwYXRoIGQ9Ik04MSwzMCBMNzEsMTUgTDkxLDE1IEw4MSwzMCBaIE05MSwxNCBMNzEsMTQgTDc1LDEwIEw4NywxMCBMOTEsMTQgWiIgaWQ9IlRyaWFuZ2xlLTEiPjwvcGF0aD4gICAgICAgIDwvZz4gICAgPC9nPjwvc3ZnPg==
|
7
7
|
ICON
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
identifier "ruby"
|
10
|
+
label "Ruby"
|
11
|
+
position 0
|
11
12
|
|
12
13
|
collect do |_request, _response|
|
13
14
|
store :ruby_version, RUBY_VERSION
|