omg-actionpack 8.0.0.alpha1
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 +7 -0
- data/CHANGELOG.md +129 -0
- data/MIT-LICENSE +21 -0
- data/README.rdoc +57 -0
- data/lib/abstract_controller/asset_paths.rb +14 -0
- data/lib/abstract_controller/base.rb +299 -0
- data/lib/abstract_controller/caching/fragments.rb +149 -0
- data/lib/abstract_controller/caching.rb +68 -0
- data/lib/abstract_controller/callbacks.rb +265 -0
- data/lib/abstract_controller/collector.rb +44 -0
- data/lib/abstract_controller/deprecator.rb +9 -0
- data/lib/abstract_controller/error.rb +8 -0
- data/lib/abstract_controller/helpers.rb +243 -0
- data/lib/abstract_controller/logger.rb +16 -0
- data/lib/abstract_controller/railties/routes_helpers.rb +25 -0
- data/lib/abstract_controller/rendering.rb +126 -0
- data/lib/abstract_controller/translation.rb +42 -0
- data/lib/abstract_controller/url_for.rb +37 -0
- data/lib/abstract_controller.rb +36 -0
- data/lib/action_controller/api/api_rendering.rb +18 -0
- data/lib/action_controller/api.rb +155 -0
- data/lib/action_controller/base.rb +332 -0
- data/lib/action_controller/caching.rb +49 -0
- data/lib/action_controller/deprecator.rb +9 -0
- data/lib/action_controller/form_builder.rb +55 -0
- data/lib/action_controller/log_subscriber.rb +96 -0
- data/lib/action_controller/metal/allow_browser.rb +123 -0
- data/lib/action_controller/metal/basic_implicit_render.rb +17 -0
- data/lib/action_controller/metal/conditional_get.rb +341 -0
- data/lib/action_controller/metal/content_security_policy.rb +86 -0
- data/lib/action_controller/metal/cookies.rb +20 -0
- data/lib/action_controller/metal/data_streaming.rb +154 -0
- data/lib/action_controller/metal/default_headers.rb +21 -0
- data/lib/action_controller/metal/etag_with_flash.rb +22 -0
- data/lib/action_controller/metal/etag_with_template_digest.rb +59 -0
- data/lib/action_controller/metal/exceptions.rb +106 -0
- data/lib/action_controller/metal/flash.rb +67 -0
- data/lib/action_controller/metal/head.rb +67 -0
- data/lib/action_controller/metal/helpers.rb +129 -0
- data/lib/action_controller/metal/http_authentication.rb +565 -0
- data/lib/action_controller/metal/implicit_render.rb +67 -0
- data/lib/action_controller/metal/instrumentation.rb +120 -0
- data/lib/action_controller/metal/live.rb +398 -0
- data/lib/action_controller/metal/logging.rb +22 -0
- data/lib/action_controller/metal/mime_responds.rb +337 -0
- data/lib/action_controller/metal/parameter_encoding.rb +84 -0
- data/lib/action_controller/metal/params_wrapper.rb +312 -0
- data/lib/action_controller/metal/permissions_policy.rb +38 -0
- data/lib/action_controller/metal/rate_limiting.rb +62 -0
- data/lib/action_controller/metal/redirecting.rb +251 -0
- data/lib/action_controller/metal/renderers.rb +181 -0
- data/lib/action_controller/metal/rendering.rb +260 -0
- data/lib/action_controller/metal/request_forgery_protection.rb +667 -0
- data/lib/action_controller/metal/rescue.rb +33 -0
- data/lib/action_controller/metal/streaming.rb +183 -0
- data/lib/action_controller/metal/strong_parameters.rb +1546 -0
- data/lib/action_controller/metal/testing.rb +25 -0
- data/lib/action_controller/metal/url_for.rb +65 -0
- data/lib/action_controller/metal.rb +339 -0
- data/lib/action_controller/railtie.rb +149 -0
- data/lib/action_controller/railties/helpers.rb +26 -0
- data/lib/action_controller/renderer.rb +161 -0
- data/lib/action_controller/template_assertions.rb +13 -0
- data/lib/action_controller/test_case.rb +691 -0
- data/lib/action_controller.rb +80 -0
- data/lib/action_dispatch/constants.rb +34 -0
- data/lib/action_dispatch/deprecator.rb +9 -0
- data/lib/action_dispatch/http/cache.rb +249 -0
- data/lib/action_dispatch/http/content_disposition.rb +47 -0
- data/lib/action_dispatch/http/content_security_policy.rb +365 -0
- data/lib/action_dispatch/http/filter_parameters.rb +80 -0
- data/lib/action_dispatch/http/filter_redirect.rb +50 -0
- data/lib/action_dispatch/http/headers.rb +134 -0
- data/lib/action_dispatch/http/mime_negotiation.rb +187 -0
- data/lib/action_dispatch/http/mime_type.rb +389 -0
- data/lib/action_dispatch/http/mime_types.rb +54 -0
- data/lib/action_dispatch/http/parameters.rb +119 -0
- data/lib/action_dispatch/http/permissions_policy.rb +189 -0
- data/lib/action_dispatch/http/rack_cache.rb +67 -0
- data/lib/action_dispatch/http/request.rb +498 -0
- data/lib/action_dispatch/http/response.rb +556 -0
- data/lib/action_dispatch/http/upload.rb +107 -0
- data/lib/action_dispatch/http/url.rb +344 -0
- data/lib/action_dispatch/journey/formatter.rb +226 -0
- data/lib/action_dispatch/journey/gtg/builder.rb +149 -0
- data/lib/action_dispatch/journey/gtg/simulator.rb +50 -0
- data/lib/action_dispatch/journey/gtg/transition_table.rb +217 -0
- data/lib/action_dispatch/journey/nfa/dot.rb +27 -0
- data/lib/action_dispatch/journey/nodes/node.rb +208 -0
- data/lib/action_dispatch/journey/parser.rb +103 -0
- data/lib/action_dispatch/journey/path/pattern.rb +209 -0
- data/lib/action_dispatch/journey/route.rb +189 -0
- data/lib/action_dispatch/journey/router/utils.rb +105 -0
- data/lib/action_dispatch/journey/router.rb +151 -0
- data/lib/action_dispatch/journey/routes.rb +82 -0
- data/lib/action_dispatch/journey/scanner.rb +70 -0
- data/lib/action_dispatch/journey/visitors.rb +267 -0
- data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
- data/lib/action_dispatch/journey/visualizer/fsm.js +159 -0
- data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
- data/lib/action_dispatch/journey.rb +7 -0
- data/lib/action_dispatch/log_subscriber.rb +25 -0
- data/lib/action_dispatch/middleware/actionable_exceptions.rb +46 -0
- data/lib/action_dispatch/middleware/assume_ssl.rb +27 -0
- data/lib/action_dispatch/middleware/callbacks.rb +38 -0
- data/lib/action_dispatch/middleware/cookies.rb +719 -0
- data/lib/action_dispatch/middleware/debug_exceptions.rb +206 -0
- data/lib/action_dispatch/middleware/debug_locks.rb +129 -0
- data/lib/action_dispatch/middleware/debug_view.rb +73 -0
- data/lib/action_dispatch/middleware/exception_wrapper.rb +350 -0
- data/lib/action_dispatch/middleware/executor.rb +32 -0
- data/lib/action_dispatch/middleware/flash.rb +318 -0
- data/lib/action_dispatch/middleware/host_authorization.rb +171 -0
- data/lib/action_dispatch/middleware/public_exceptions.rb +64 -0
- data/lib/action_dispatch/middleware/reloader.rb +16 -0
- data/lib/action_dispatch/middleware/remote_ip.rb +199 -0
- data/lib/action_dispatch/middleware/request_id.rb +50 -0
- data/lib/action_dispatch/middleware/server_timing.rb +78 -0
- data/lib/action_dispatch/middleware/session/abstract_store.rb +112 -0
- data/lib/action_dispatch/middleware/session/cache_store.rb +66 -0
- data/lib/action_dispatch/middleware/session/cookie_store.rb +129 -0
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +34 -0
- data/lib/action_dispatch/middleware/show_exceptions.rb +88 -0
- data/lib/action_dispatch/middleware/ssl.rb +180 -0
- data/lib/action_dispatch/middleware/stack.rb +194 -0
- data/lib/action_dispatch/middleware/static.rb +192 -0
- data/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb +13 -0
- data/lib/action_dispatch/middleware/templates/rescues/_actions.text.erb +0 -0
- data/lib/action_dispatch/middleware/templates/rescues/_message_and_suggestions.html.erb +22 -0
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +17 -0
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
- data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +36 -0
- data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +62 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/blocked_host.html.erb +12 -0
- data/lib/action_dispatch/middleware/templates/rescues/blocked_host.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +35 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +24 -0
- data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +16 -0
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +284 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.html.erb +23 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +19 -0
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +232 -0
- data/lib/action_dispatch/railtie.rb +77 -0
- data/lib/action_dispatch/request/session.rb +283 -0
- data/lib/action_dispatch/request/utils.rb +109 -0
- data/lib/action_dispatch/routing/endpoint.rb +19 -0
- data/lib/action_dispatch/routing/inspector.rb +323 -0
- data/lib/action_dispatch/routing/mapper.rb +2372 -0
- data/lib/action_dispatch/routing/polymorphic_routes.rb +363 -0
- data/lib/action_dispatch/routing/redirection.rb +218 -0
- data/lib/action_dispatch/routing/route_set.rb +958 -0
- data/lib/action_dispatch/routing/routes_proxy.rb +66 -0
- data/lib/action_dispatch/routing/url_for.rb +244 -0
- data/lib/action_dispatch/routing.rb +262 -0
- data/lib/action_dispatch/system_test_case.rb +206 -0
- data/lib/action_dispatch/system_testing/browser.rb +75 -0
- data/lib/action_dispatch/system_testing/driver.rb +85 -0
- data/lib/action_dispatch/system_testing/server.rb +33 -0
- data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +164 -0
- data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +23 -0
- data/lib/action_dispatch/testing/assertion_response.rb +48 -0
- data/lib/action_dispatch/testing/assertions/response.rb +114 -0
- data/lib/action_dispatch/testing/assertions/routing.rb +343 -0
- data/lib/action_dispatch/testing/assertions.rb +25 -0
- data/lib/action_dispatch/testing/integration.rb +694 -0
- data/lib/action_dispatch/testing/request_encoder.rb +60 -0
- data/lib/action_dispatch/testing/test_helpers/page_dump_helper.rb +35 -0
- data/lib/action_dispatch/testing/test_process.rb +57 -0
- data/lib/action_dispatch/testing/test_request.rb +73 -0
- data/lib/action_dispatch/testing/test_response.rb +58 -0
- data/lib/action_dispatch.rb +147 -0
- data/lib/action_pack/gem_version.rb +19 -0
- data/lib/action_pack/version.rb +12 -0
- data/lib/action_pack.rb +27 -0
- metadata +375 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
function tokenize(input, callback) {
|
|
2
|
+
while(input.length > 0) {
|
|
3
|
+
callback(input.match(/^[\/\.\?]|[^\/\.\?]+/)[0]);
|
|
4
|
+
input = input.replace(/^[\/\.\?]|[^\/\.\?]+/, '');
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
var graph = d3.select("#chart-2 svg");
|
|
9
|
+
var svg_edges = {};
|
|
10
|
+
var svg_nodes = {};
|
|
11
|
+
|
|
12
|
+
graph.selectAll("g.edge").each(function() {
|
|
13
|
+
var node = d3.select(this);
|
|
14
|
+
var index = node.select("title").text().split("->");
|
|
15
|
+
var left = parseInt(index[0]);
|
|
16
|
+
var right = parseInt(index[1]);
|
|
17
|
+
|
|
18
|
+
if(!svg_edges[left]) { svg_edges[left] = {} }
|
|
19
|
+
svg_edges[left][right] = node;
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
graph.selectAll("g.node").each(function() {
|
|
23
|
+
var node = d3.select(this);
|
|
24
|
+
var index = parseInt(node.select("title").text());
|
|
25
|
+
svg_nodes[index] = node;
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
function reset_graph() {
|
|
29
|
+
for(var key in svg_edges) {
|
|
30
|
+
for(var mkey in svg_edges[key]) {
|
|
31
|
+
var node = svg_edges[key][mkey];
|
|
32
|
+
var path = node.select("path");
|
|
33
|
+
var arrow = node.select("polygon");
|
|
34
|
+
path.style("stroke", "black");
|
|
35
|
+
arrow.style("stroke", "black").style("fill", "black");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
for(var key in svg_nodes) {
|
|
40
|
+
var node = svg_nodes[key];
|
|
41
|
+
node.select('ellipse').style("fill", "white");
|
|
42
|
+
node.select('polygon').style("fill", "white");
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function highlight_edge(from, to) {
|
|
48
|
+
var node = svg_edges[from][to];
|
|
49
|
+
var path = node.select("path");
|
|
50
|
+
var arrow = node.select("polygon");
|
|
51
|
+
|
|
52
|
+
path
|
|
53
|
+
.transition().duration(500)
|
|
54
|
+
.style("stroke", "green");
|
|
55
|
+
|
|
56
|
+
arrow
|
|
57
|
+
.transition().duration(500)
|
|
58
|
+
.style("stroke", "green").style("fill", "green");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function highlight_state(index, color) {
|
|
62
|
+
if(!color) { color = "green"; }
|
|
63
|
+
|
|
64
|
+
svg_nodes[index].select('ellipse')
|
|
65
|
+
.style("fill", "white")
|
|
66
|
+
.transition().duration(500)
|
|
67
|
+
.style("fill", color);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function highlight_finish(index) {
|
|
71
|
+
svg_nodes[index].select('ellipse')
|
|
72
|
+
.style("fill", "while")
|
|
73
|
+
.transition().duration(500)
|
|
74
|
+
.style("fill", "blue");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function match(input) {
|
|
78
|
+
reset_graph();
|
|
79
|
+
var table = tt();
|
|
80
|
+
var states = [[0, null]];
|
|
81
|
+
var regexp_states = table['regexp_states'];
|
|
82
|
+
var string_states = table['string_states'];
|
|
83
|
+
var stdparam_states = table['stdparam_states'];
|
|
84
|
+
var accepting = table['accepting'];
|
|
85
|
+
var default_re = new RegExp("^[^.\/?]+$");
|
|
86
|
+
var start_index = 0;
|
|
87
|
+
|
|
88
|
+
highlight_state(0);
|
|
89
|
+
|
|
90
|
+
tokenize(input, function(token) {
|
|
91
|
+
var end_index = start_index + token.length;
|
|
92
|
+
|
|
93
|
+
var new_states = [];
|
|
94
|
+
for(var key in states) {
|
|
95
|
+
var state_parts = states[key];
|
|
96
|
+
var state = state_parts[0];
|
|
97
|
+
var previous_start = state_parts[1];
|
|
98
|
+
|
|
99
|
+
if(previous_start == null) {
|
|
100
|
+
if(string_states[state] && string_states[state][token]) {
|
|
101
|
+
var new_state = string_states[state][token];
|
|
102
|
+
highlight_edge(state, new_state);
|
|
103
|
+
highlight_state(new_state);
|
|
104
|
+
new_states.push([new_state, null]);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if(stdparam_states[state] && default_re.test(token)) {
|
|
108
|
+
for(var key in stdparam_states[state]) {
|
|
109
|
+
var new_state = stdparam_states[state][key];
|
|
110
|
+
highlight_edge(state, new_state);
|
|
111
|
+
highlight_state(new_state);
|
|
112
|
+
new_states.push([new_state, null]);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if(regexp_states[state]) {
|
|
118
|
+
var slice_start = previous_start != null ? previous_start : start_index;
|
|
119
|
+
|
|
120
|
+
for(var key in regexp_states[state]) {
|
|
121
|
+
var re = new RegExp("^" + key + "$");
|
|
122
|
+
|
|
123
|
+
var accumulation = input.slice(slice_start, end_index);
|
|
124
|
+
|
|
125
|
+
if(re.test(accumulation)) {
|
|
126
|
+
var new_state = regexp_states[state][key];
|
|
127
|
+
highlight_edge(state, new_state);
|
|
128
|
+
highlight_state(new_state);
|
|
129
|
+
new_states.push([new_state, null]);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// retry the same regexp with the accumulated data either way
|
|
133
|
+
new_states.push([state, slice_start]);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
states = new_states;
|
|
139
|
+
start_index = end_index;
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
for(var key in states) {
|
|
143
|
+
var state_parts = states[key];
|
|
144
|
+
var state = state_parts[0];
|
|
145
|
+
var slice_start = state_parts[1];
|
|
146
|
+
|
|
147
|
+
// we must ignore ones that are still accepting more data
|
|
148
|
+
if (slice_start != null) continue;
|
|
149
|
+
|
|
150
|
+
if(accepting[state]) {
|
|
151
|
+
highlight_finish(state);
|
|
152
|
+
} else {
|
|
153
|
+
highlight_state(state, "red");
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title><%= title %></title>
|
|
5
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.css" type="text/css">
|
|
6
|
+
<style>
|
|
7
|
+
<% stylesheets.each do |style| %>
|
|
8
|
+
<%= style %>
|
|
9
|
+
<% end %>
|
|
10
|
+
</style>
|
|
11
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.8/d3.min.js"></script>
|
|
12
|
+
</head>
|
|
13
|
+
<body>
|
|
14
|
+
<div id="wrapper">
|
|
15
|
+
<h1>Routes FSM with NFA simulation</h1>
|
|
16
|
+
<div class="instruction form">
|
|
17
|
+
<p>
|
|
18
|
+
Type a route in to the box and click "simulate".
|
|
19
|
+
</p>
|
|
20
|
+
<form onsubmit="return match(this.route.value);">
|
|
21
|
+
<input type="text" size="30" name="route" value="/articles/new" />
|
|
22
|
+
<button>simulate</button>
|
|
23
|
+
<input type="reset" value="reset" onclick="return reset_graph();"/>
|
|
24
|
+
</form>
|
|
25
|
+
<p class="fun_routes">
|
|
26
|
+
Some fun routes to try:
|
|
27
|
+
<% fun_routes.each do |path| %>
|
|
28
|
+
<a href="#" onclick="document.forms[0].elements[0].value=this.text.replace(/^\s+|\s+$/g,''); return match(this.text.replace(/^\s+|\s+$/g,''));">
|
|
29
|
+
<%= path %>
|
|
30
|
+
</a>
|
|
31
|
+
<% end %>
|
|
32
|
+
</p>
|
|
33
|
+
</div>
|
|
34
|
+
<div class='chart' id='chart-2'>
|
|
35
|
+
<%= svg %>
|
|
36
|
+
</div>
|
|
37
|
+
<div class="instruction">
|
|
38
|
+
<p>
|
|
39
|
+
This is a FSM for a system that has the following routes:
|
|
40
|
+
</p>
|
|
41
|
+
<ul>
|
|
42
|
+
<% paths.each do |route| %>
|
|
43
|
+
<li><%= route %></li>
|
|
44
|
+
<% end %>
|
|
45
|
+
</ul>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
<% javascripts.each do |js| %>
|
|
49
|
+
<script><%= js %></script>
|
|
50
|
+
<% end %>
|
|
51
|
+
</body>
|
|
52
|
+
</html>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
5
|
+
module ActionDispatch
|
|
6
|
+
class LogSubscriber < ActiveSupport::LogSubscriber
|
|
7
|
+
def redirect(event)
|
|
8
|
+
payload = event.payload
|
|
9
|
+
|
|
10
|
+
info { "Redirected to #{payload[:location]}" }
|
|
11
|
+
|
|
12
|
+
info do
|
|
13
|
+
status = payload[:status]
|
|
14
|
+
|
|
15
|
+
message = +"Completed #{status} #{Rack::Utils::HTTP_STATUS_CODES[status]} in #{event.duration.round}ms"
|
|
16
|
+
message << "\n\n" if defined?(Rails.env) && Rails.env.development?
|
|
17
|
+
|
|
18
|
+
message
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
subscribe_log_level :redirect, :info
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
ActionDispatch::LogSubscriber.attach_to :action_dispatch
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
5
|
+
require "uri"
|
|
6
|
+
require "active_support/actionable_error"
|
|
7
|
+
|
|
8
|
+
module ActionDispatch
|
|
9
|
+
class ActionableExceptions # :nodoc:
|
|
10
|
+
cattr_accessor :endpoint, default: "/rails/actions"
|
|
11
|
+
|
|
12
|
+
def initialize(app)
|
|
13
|
+
@app = app
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def call(env)
|
|
17
|
+
request = ActionDispatch::Request.new(env)
|
|
18
|
+
return @app.call(env) unless actionable_request?(request)
|
|
19
|
+
|
|
20
|
+
ActiveSupport::ActionableError.dispatch(request.params[:error].to_s.safe_constantize, request.params[:action])
|
|
21
|
+
|
|
22
|
+
redirect_to request.params[:location]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
def actionable_request?(request)
|
|
27
|
+
request.get_header("action_dispatch.show_detailed_exceptions") && request.post? && request.path == endpoint
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def redirect_to(location)
|
|
31
|
+
uri = URI.parse location
|
|
32
|
+
|
|
33
|
+
if uri.relative? || uri.scheme == "http" || uri.scheme == "https"
|
|
34
|
+
body = ""
|
|
35
|
+
else
|
|
36
|
+
return [400, { Rack::CONTENT_TYPE => "text/plain; charset=utf-8" }, ["Invalid redirection URI"]]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
[302, {
|
|
40
|
+
Rack::CONTENT_TYPE => "text/html; charset=#{Response.default_charset}",
|
|
41
|
+
Rack::CONTENT_LENGTH => body.bytesize.to_s,
|
|
42
|
+
ActionDispatch::Constants::LOCATION => location,
|
|
43
|
+
}, [body]]
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
5
|
+
module ActionDispatch
|
|
6
|
+
# # Action Dispatch AssumeSSL
|
|
7
|
+
#
|
|
8
|
+
# When proxying through a load balancer that terminates SSL, the forwarded
|
|
9
|
+
# request will appear as though it's HTTP instead of HTTPS to the application.
|
|
10
|
+
# This makes redirects and cookie security target HTTP instead of HTTPS. This
|
|
11
|
+
# middleware makes the server assume that the proxy already terminated SSL, and
|
|
12
|
+
# that the request really is HTTPS.
|
|
13
|
+
class AssumeSSL
|
|
14
|
+
def initialize(app)
|
|
15
|
+
@app = app
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def call(env)
|
|
19
|
+
env["HTTPS"] = "on"
|
|
20
|
+
env["HTTP_X_FORWARDED_PORT"] = "443"
|
|
21
|
+
env["HTTP_X_FORWARDED_PROTO"] = "https"
|
|
22
|
+
env["rack.url_scheme"] = "https"
|
|
23
|
+
|
|
24
|
+
@app.call(env)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
5
|
+
module ActionDispatch
|
|
6
|
+
# # Action Dispatch Callbacks
|
|
7
|
+
#
|
|
8
|
+
# Provides callbacks to be executed before and after dispatching the request.
|
|
9
|
+
class Callbacks
|
|
10
|
+
include ActiveSupport::Callbacks
|
|
11
|
+
|
|
12
|
+
define_callbacks :call
|
|
13
|
+
|
|
14
|
+
class << self
|
|
15
|
+
def before(*args, &block)
|
|
16
|
+
set_callback(:call, :before, *args, &block)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def after(*args, &block)
|
|
20
|
+
set_callback(:call, :after, *args, &block)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def initialize(app)
|
|
25
|
+
@app = app
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def call(env)
|
|
29
|
+
error = nil
|
|
30
|
+
result = run_callbacks :call do
|
|
31
|
+
@app.call(env)
|
|
32
|
+
rescue => error
|
|
33
|
+
end
|
|
34
|
+
raise error if error
|
|
35
|
+
result
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|