rack-webprofiler 0.1.0.pre.beta2 → 0.1.0
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 +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
|