actionpack 4.2.10 → 7.2.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of actionpack might be problematic. Click here for more details.

Files changed (202) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +86 -600
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +13 -14
  5. data/lib/abstract_controller/asset_paths.rb +5 -1
  6. data/lib/abstract_controller/base.rb +166 -136
  7. data/lib/abstract_controller/caching/fragments.rb +149 -0
  8. data/lib/abstract_controller/caching.rb +68 -0
  9. data/lib/abstract_controller/callbacks.rb +126 -57
  10. data/lib/abstract_controller/collector.rb +13 -15
  11. data/lib/abstract_controller/deprecator.rb +9 -0
  12. data/lib/abstract_controller/error.rb +8 -0
  13. data/lib/abstract_controller/helpers.rb +181 -132
  14. data/lib/abstract_controller/logger.rb +5 -1
  15. data/lib/abstract_controller/railties/routes_helpers.rb +10 -3
  16. data/lib/abstract_controller/rendering.rb +56 -56
  17. data/lib/abstract_controller/translation.rb +29 -15
  18. data/lib/abstract_controller/url_for.rb +15 -11
  19. data/lib/abstract_controller.rb +21 -5
  20. data/lib/action_controller/api/api_rendering.rb +18 -0
  21. data/lib/action_controller/api.rb +154 -0
  22. data/lib/action_controller/base.rb +219 -155
  23. data/lib/action_controller/caching.rb +28 -68
  24. data/lib/action_controller/deprecator.rb +9 -0
  25. data/lib/action_controller/form_builder.rb +55 -0
  26. data/lib/action_controller/log_subscriber.rb +35 -22
  27. data/lib/action_controller/metal/allow_browser.rb +119 -0
  28. data/lib/action_controller/metal/basic_implicit_render.rb +17 -0
  29. data/lib/action_controller/metal/conditional_get.rb +259 -122
  30. data/lib/action_controller/metal/content_security_policy.rb +86 -0
  31. data/lib/action_controller/metal/cookies.rb +9 -5
  32. data/lib/action_controller/metal/data_streaming.rb +87 -104
  33. data/lib/action_controller/metal/default_headers.rb +21 -0
  34. data/lib/action_controller/metal/etag_with_flash.rb +22 -0
  35. data/lib/action_controller/metal/etag_with_template_digest.rb +35 -26
  36. data/lib/action_controller/metal/exceptions.rb +71 -24
  37. data/lib/action_controller/metal/flash.rb +26 -19
  38. data/lib/action_controller/metal/head.rb +45 -36
  39. data/lib/action_controller/metal/helpers.rb +80 -64
  40. data/lib/action_controller/metal/http_authentication.rb +297 -244
  41. data/lib/action_controller/metal/implicit_render.rb +57 -9
  42. data/lib/action_controller/metal/instrumentation.rb +76 -64
  43. data/lib/action_controller/metal/live.rb +238 -176
  44. data/lib/action_controller/metal/logging.rb +22 -0
  45. data/lib/action_controller/metal/mime_responds.rb +177 -166
  46. data/lib/action_controller/metal/parameter_encoding.rb +84 -0
  47. data/lib/action_controller/metal/params_wrapper.rb +145 -118
  48. data/lib/action_controller/metal/permissions_policy.rb +38 -0
  49. data/lib/action_controller/metal/rate_limiting.rb +62 -0
  50. data/lib/action_controller/metal/redirecting.rb +203 -64
  51. data/lib/action_controller/metal/renderers.rb +108 -65
  52. data/lib/action_controller/metal/rendering.rb +216 -56
  53. data/lib/action_controller/metal/request_forgery_protection.rb +496 -163
  54. data/lib/action_controller/metal/rescue.rb +19 -21
  55. data/lib/action_controller/metal/streaming.rb +179 -138
  56. data/lib/action_controller/metal/strong_parameters.rb +1058 -382
  57. data/lib/action_controller/metal/testing.rb +11 -17
  58. data/lib/action_controller/metal/url_for.rb +37 -21
  59. data/lib/action_controller/metal.rb +236 -138
  60. data/lib/action_controller/railtie.rb +89 -11
  61. data/lib/action_controller/railties/helpers.rb +5 -1
  62. data/lib/action_controller/renderer.rb +161 -0
  63. data/lib/action_controller/template_assertions.rb +13 -0
  64. data/lib/action_controller/test_case.rb +425 -497
  65. data/lib/action_controller.rb +44 -22
  66. data/lib/action_dispatch/constants.rb +34 -0
  67. data/lib/action_dispatch/deprecator.rb +9 -0
  68. data/lib/action_dispatch/http/cache.rb +119 -63
  69. data/lib/action_dispatch/http/content_disposition.rb +47 -0
  70. data/lib/action_dispatch/http/content_security_policy.rb +364 -0
  71. data/lib/action_dispatch/http/filter_parameters.rb +36 -34
  72. data/lib/action_dispatch/http/filter_redirect.rb +24 -12
  73. data/lib/action_dispatch/http/headers.rb +66 -31
  74. data/lib/action_dispatch/http/mime_negotiation.rb +106 -75
  75. data/lib/action_dispatch/http/mime_type.rb +196 -136
  76. data/lib/action_dispatch/http/mime_types.rb +25 -7
  77. data/lib/action_dispatch/http/parameters.rb +97 -45
  78. data/lib/action_dispatch/http/permissions_policy.rb +187 -0
  79. data/lib/action_dispatch/http/rack_cache.rb +6 -0
  80. data/lib/action_dispatch/http/request.rb +299 -170
  81. data/lib/action_dispatch/http/response.rb +311 -160
  82. data/lib/action_dispatch/http/upload.rb +52 -23
  83. data/lib/action_dispatch/http/url.rb +201 -125
  84. data/lib/action_dispatch/journey/formatter.rb +110 -50
  85. data/lib/action_dispatch/journey/gtg/builder.rb +37 -50
  86. data/lib/action_dispatch/journey/gtg/simulator.rb +20 -17
  87. data/lib/action_dispatch/journey/gtg/transition_table.rb +96 -36
  88. data/lib/action_dispatch/journey/nfa/dot.rb +5 -14
  89. data/lib/action_dispatch/journey/nodes/node.rb +100 -20
  90. data/lib/action_dispatch/journey/parser.rb +19 -17
  91. data/lib/action_dispatch/journey/parser.y +4 -3
  92. data/lib/action_dispatch/journey/parser_extras.rb +14 -4
  93. data/lib/action_dispatch/journey/path/pattern.rb +79 -63
  94. data/lib/action_dispatch/journey/route.rb +108 -44
  95. data/lib/action_dispatch/journey/router/utils.rb +41 -29
  96. data/lib/action_dispatch/journey/router.rb +64 -57
  97. data/lib/action_dispatch/journey/routes.rb +23 -21
  98. data/lib/action_dispatch/journey/scanner.rb +28 -17
  99. data/lib/action_dispatch/journey/visitors.rb +100 -54
  100. data/lib/action_dispatch/journey/visualizer/fsm.js +49 -24
  101. data/lib/action_dispatch/journey/visualizer/index.html.erb +1 -1
  102. data/lib/action_dispatch/journey.rb +7 -5
  103. data/lib/action_dispatch/log_subscriber.rb +25 -0
  104. data/lib/action_dispatch/middleware/actionable_exceptions.rb +46 -0
  105. data/lib/action_dispatch/middleware/assume_ssl.rb +27 -0
  106. data/lib/action_dispatch/middleware/callbacks.rb +7 -6
  107. data/lib/action_dispatch/middleware/cookies.rb +471 -328
  108. data/lib/action_dispatch/middleware/debug_exceptions.rb +149 -66
  109. data/lib/action_dispatch/middleware/debug_locks.rb +129 -0
  110. data/lib/action_dispatch/middleware/debug_view.rb +73 -0
  111. data/lib/action_dispatch/middleware/exception_wrapper.rb +275 -73
  112. data/lib/action_dispatch/middleware/executor.rb +32 -0
  113. data/lib/action_dispatch/middleware/flash.rb +143 -101
  114. data/lib/action_dispatch/middleware/host_authorization.rb +171 -0
  115. data/lib/action_dispatch/middleware/public_exceptions.rb +36 -27
  116. data/lib/action_dispatch/middleware/reloader.rb +10 -92
  117. data/lib/action_dispatch/middleware/remote_ip.rb +133 -107
  118. data/lib/action_dispatch/middleware/request_id.rb +29 -15
  119. data/lib/action_dispatch/middleware/server_timing.rb +78 -0
  120. data/lib/action_dispatch/middleware/session/abstract_store.rb +49 -27
  121. data/lib/action_dispatch/middleware/session/cache_store.rb +33 -16
  122. data/lib/action_dispatch/middleware/session/cookie_store.rb +86 -80
  123. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +15 -3
  124. data/lib/action_dispatch/middleware/show_exceptions.rb +66 -36
  125. data/lib/action_dispatch/middleware/ssl.rb +134 -36
  126. data/lib/action_dispatch/middleware/stack.rb +109 -44
  127. data/lib/action_dispatch/middleware/static.rb +159 -90
  128. data/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb +13 -0
  129. data/lib/action_dispatch/middleware/templates/rescues/_actions.text.erb +0 -0
  130. data/lib/action_dispatch/middleware/templates/rescues/_message_and_suggestions.html.erb +22 -0
  131. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +7 -24
  132. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +1 -1
  133. data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +36 -0
  134. data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
  135. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +46 -36
  136. data/lib/action_dispatch/middleware/templates/rescues/blocked_host.html.erb +12 -0
  137. data/lib/action_dispatch/middleware/templates/rescues/blocked_host.text.erb +9 -0
  138. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +26 -7
  139. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +3 -3
  140. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +24 -0
  141. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +16 -0
  142. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +139 -15
  143. data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.html.erb +23 -0
  144. data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.text.erb +3 -0
  145. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +6 -6
  146. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +7 -7
  147. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +9 -9
  148. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +1 -1
  149. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +4 -4
  150. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +1 -1
  151. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +7 -4
  152. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +125 -93
  153. data/lib/action_dispatch/railtie.rb +44 -16
  154. data/lib/action_dispatch/request/session.rb +159 -69
  155. data/lib/action_dispatch/request/utils.rb +97 -23
  156. data/lib/action_dispatch/routing/endpoint.rb +11 -2
  157. data/lib/action_dispatch/routing/inspector.rb +195 -106
  158. data/lib/action_dispatch/routing/mapper.rb +1338 -955
  159. data/lib/action_dispatch/routing/polymorphic_routes.rb +234 -201
  160. data/lib/action_dispatch/routing/redirection.rb +78 -51
  161. data/lib/action_dispatch/routing/route_set.rb +460 -374
  162. data/lib/action_dispatch/routing/routes_proxy.rb +36 -12
  163. data/lib/action_dispatch/routing/url_for.rb +172 -124
  164. data/lib/action_dispatch/routing.rb +159 -158
  165. data/lib/action_dispatch/system_test_case.rb +206 -0
  166. data/lib/action_dispatch/system_testing/browser.rb +84 -0
  167. data/lib/action_dispatch/system_testing/driver.rb +85 -0
  168. data/lib/action_dispatch/system_testing/server.rb +33 -0
  169. data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +164 -0
  170. data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +23 -0
  171. data/lib/action_dispatch/testing/assertion_response.rb +48 -0
  172. data/lib/action_dispatch/testing/assertions/response.rb +71 -39
  173. data/lib/action_dispatch/testing/assertions/routing.rb +228 -103
  174. data/lib/action_dispatch/testing/assertions.rb +9 -6
  175. data/lib/action_dispatch/testing/integration.rb +486 -306
  176. data/lib/action_dispatch/testing/request_encoder.rb +60 -0
  177. data/lib/action_dispatch/testing/test_helpers/page_dump_helper.rb +35 -0
  178. data/lib/action_dispatch/testing/test_process.rb +35 -22
  179. data/lib/action_dispatch/testing/test_request.rb +29 -34
  180. data/lib/action_dispatch/testing/test_response.rb +48 -15
  181. data/lib/action_dispatch.rb +82 -40
  182. data/lib/action_pack/gem_version.rb +8 -4
  183. data/lib/action_pack/version.rb +6 -2
  184. data/lib/action_pack.rb +21 -18
  185. metadata +146 -56
  186. data/lib/action_controller/caching/fragments.rb +0 -103
  187. data/lib/action_controller/metal/force_ssl.rb +0 -97
  188. data/lib/action_controller/metal/hide_actions.rb +0 -40
  189. data/lib/action_controller/metal/rack_delegation.rb +0 -32
  190. data/lib/action_controller/middleware.rb +0 -39
  191. data/lib/action_controller/model_naming.rb +0 -12
  192. data/lib/action_dispatch/http/parameter_filter.rb +0 -72
  193. data/lib/action_dispatch/journey/backwards.rb +0 -5
  194. data/lib/action_dispatch/journey/nfa/builder.rb +0 -76
  195. data/lib/action_dispatch/journey/nfa/simulator.rb +0 -47
  196. data/lib/action_dispatch/journey/nfa/transition_table.rb +0 -163
  197. data/lib/action_dispatch/journey/router/strexp.rb +0 -27
  198. data/lib/action_dispatch/middleware/params_parser.rb +0 -60
  199. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +0 -27
  200. data/lib/action_dispatch/testing/assertions/dom.rb +0 -3
  201. data/lib/action_dispatch/testing/assertions/selector.rb +0 -3
  202. data/lib/action_dispatch/testing/assertions/tag.rb +0 -3
@@ -1,22 +1,47 @@
1
1
  <% content_for :style do %>
2
+ h2, p {
3
+ padding-left: 30px;
4
+ }
5
+
2
6
  #route_table {
3
7
  margin: 0;
4
8
  border-collapse: collapse;
9
+ word-wrap:break-word;
10
+ table-layout: fixed;
11
+ width:100%;
5
12
  }
6
13
 
7
14
  #route_table thead tr {
8
15
  border-bottom: 2px solid #ddd;
9
16
  }
10
17
 
18
+ #route_table th {
19
+ padding-left: 30px;
20
+ text-align: left;
21
+ }
22
+
11
23
  #route_table thead tr.bottom {
12
24
  border-bottom: none;
13
25
  }
14
26
 
15
27
  #route_table thead tr.bottom th {
16
- padding: 10px 0;
28
+ padding: 10px 30px;
17
29
  line-height: 15px;
18
30
  }
19
31
 
32
+ #route_table #search_container {
33
+ padding: 7px 30px;
34
+ }
35
+
36
+ #route_table thead tr th input#search {
37
+ -webkit-appearance: textfield;
38
+ width:100%;
39
+ }
40
+
41
+ #route_table thead th.http-verb {
42
+ width: 10%;
43
+ }
44
+
20
45
  #route_table tbody tr {
21
46
  border-bottom: 1px solid #ddd;
22
47
  }
@@ -41,34 +66,34 @@
41
66
  padding: 4px 30px;
42
67
  }
43
68
 
44
- #path_search {
45
- width: 80%;
46
- font-size: inherit;
69
+ @media (prefers-color-scheme: dark) {
70
+ #route_table tbody tr:nth-child(odd) {
71
+ background: #282828;
72
+ }
73
+
74
+ #route_table tbody.exact_matches tr,
75
+ #route_table tbody.fuzzy_matches tr {
76
+ background: DarkSlateGrey;
77
+ }
47
78
  }
48
79
  <% end %>
49
80
 
50
- <table id='route_table' class='route_table'>
81
+ <table id='route_table'>
51
82
  <thead>
52
83
  <tr>
53
- <th>Helper</th>
54
- <th>HTTP Verb</th>
55
- <th>Path</th>
56
- <th>Controller#Action</th>
57
- </tr>
58
- <tr class='bottom'>
59
- <th><%# Helper %>
60
- <%= link_to "Path", "#", 'data-route-helper' => '_path',
84
+ <th>Helper
85
+ (<%= link_to "Path", "#", 'data-route-helper' => '_path',
61
86
  title: "Returns a relative path (without the http or domain)" %> /
62
87
  <%= link_to "Url", "#", 'data-route-helper' => '_url',
63
- title: "Returns an absolute url (with the http and domain)" %>
64
- </th>
65
- <th><%# HTTP Verb %>
66
- </th>
67
- <th><%# Path %>
68
- <%= search_field(:path, nil, id: 'search', placeholder: "Path Match") %>
69
- </th>
70
- <th><%# Controller#action %>
88
+ title: "Returns an absolute URL (with the http and domain)" %>)
71
89
  </th>
90
+ <th class="http-verb">HTTP Verb</th>
91
+ <th>Path</th>
92
+ <th>Controller#Action</th>
93
+ <th>Source Location</th>
94
+ </tr>
95
+ <tr>
96
+ <th colspan="5" id="search_container"><%= search_field(:query, nil, id: 'search', placeholder: "Search") %></th>
72
97
  </tr>
73
98
  </thead>
74
99
  <tbody class='exact_matches' id='exact_matches'>
@@ -80,93 +105,96 @@
80
105
  </tbody>
81
106
  </table>
82
107
 
83
- <script type='text/javascript'>
84
- // Iterates each element through a function
85
- function each(elems, func) {
86
- if (!elems instanceof Array) { elems = [elems]; }
87
- for (var i = 0, len = elems.length; i < len; i++) {
88
- func(elems[i]);
89
- }
90
- }
91
-
92
- // Sets innerHTML for an element
93
- function setContent(elem, text) {
94
- elem.innerHTML = text;
95
- }
96
-
97
- // Enables path search functionality
98
- function setupMatchPaths() {
99
- // Check if the user input (sanitized as a path) matches the regexp data attribute
100
- function checkExactMatch(section, elem, value) {
101
- var string = sanitizePath(value),
102
- regexp = elem.getAttribute("data-regexp");
103
-
104
- showMatch(string, regexp, section, elem);
105
- }
106
-
107
- // Check if the route path data attribute contains the user input
108
- function checkFuzzyMatch(section, elem, value) {
109
- var string = elem.getAttribute("data-route-path"),
110
- regexp = value;
108
+ <script>
109
+ // support forEach iterator on NodeList
110
+ NodeList.prototype.forEach = Array.prototype.forEach;
111
111
 
112
- showMatch(string, regexp, section, elem);
112
+ // Enables query search functionality
113
+ function setupMatchingRoutes() {
114
+ // Check if there are any matched results in a section
115
+ function checkNoMatch(section, trElement) {
116
+ if (section.children.length <= 1) {
117
+ section.appendChild(trElement);
118
+ }
113
119
  }
114
120
 
115
- // Display the parent <tr> element in the appropriate section when there's a match
116
- function showMatch(string, regexp, section, elem) {
117
- if(string.match(RegExp(regexp))) {
118
- section.appendChild(elem.parentNode.cloneNode(true));
119
- }
121
+ // get JSON from URL and invoke callback with result
122
+ function getJSON(url, success) {
123
+ var xhr = new XMLHttpRequest();
124
+ xhr.open('GET', url);
125
+ xhr.onload = function() {
126
+ if (this.status == 200)
127
+ success(JSON.parse(this.response));
128
+ };
129
+ xhr.send();
120
130
  }
121
131
 
122
- // Check if there are any matched results in a section
123
- function checkNoMatch(section, defaultText, noMatchText) {
124
- if (section.innerHTML === defaultText) {
125
- setContent(section, defaultText + noMatchText);
132
+ function delayedKeyup(input, callback) {
133
+ var timeout;
134
+ input.onkeyup = function(){
135
+ if (timeout) clearTimeout(timeout);
136
+ timeout = setTimeout(callback, 300);
126
137
  }
127
138
  }
128
139
 
129
- // Ensure path always starts with a slash "/" and remove params or fragments
130
- function sanitizePath(path) {
131
- var path = path.charAt(0) == '/' ? path : "/" + path;
132
- return path.replace(/\#.*|\?.*/, '');
140
+ // remove params or fragments
141
+ function sanitizeQuery(query) {
142
+ return query.replace(/[#?].*/, '');
133
143
  }
134
144
 
135
- var regexpElems = document.querySelectorAll('#route_table [data-regexp]'),
136
- searchElem = document.querySelector('#search'),
137
- exactMatches = document.querySelector('#exact_matches'),
138
- fuzzyMatches = document.querySelector('#fuzzy_matches');
145
+ var pathElements = document.querySelectorAll('#route_table [data-route-path]'),
146
+ searchElem = document.querySelector('#search'),
147
+ exactSection = document.querySelector('#exact_matches'),
148
+ fuzzySection = document.querySelector('#fuzzy_matches');
139
149
 
140
150
  // Remove matches when no search value is present
141
151
  searchElem.onblur = function(e) {
142
152
  if (searchElem.value === "") {
143
- setContent(exactMatches, "");
144
- setContent(fuzzyMatches, "");
153
+ exactSection.innerHTML = "";
154
+ fuzzySection.innerHTML = "";
145
155
  }
146
156
  }
147
157
 
158
+ function buildTr(string) {
159
+ var tr = document.createElement('tr');
160
+ var th = document.createElement('th');
161
+ th.setAttribute('colspan', 5);
162
+ tr.appendChild(th);
163
+ th.innerText = string;
164
+ return tr;
165
+ }
166
+
148
167
  // On key press perform a search for matching paths
149
- searchElem.onkeyup = function(e){
150
- var userInput = searchElem.value,
151
- defaultExactMatch = '<tr><th colspan="4">Paths Matching (' + escape(sanitizePath(userInput)) +'):</th></tr>',
152
- defaultFuzzyMatch = '<tr><th colspan="4">Paths Containing (' + escape(userInput) +'):</th></tr>',
153
- noExactMatch = '<tr><th colspan="4">No Exact Matches Found</th></tr>',
154
- noFuzzyMatch = '<tr><th colspan="4">No Fuzzy Matches Found</th></tr>';
155
-
156
- // Clear out results section
157
- setContent(exactMatches, defaultExactMatch);
158
- setContent(fuzzyMatches, defaultFuzzyMatch);
159
-
160
- // Display exact matches and fuzzy matches
161
- each(regexpElems, function(elem) {
162
- checkExactMatch(exactMatches, elem, userInput);
163
- checkFuzzyMatch(fuzzyMatches, elem, userInput);
168
+ delayedKeyup(searchElem, function() {
169
+ var query = sanitizeQuery(searchElem.value),
170
+ defaultExactMatch = buildTr("Routes matching '" + query + "':"),
171
+ defaultFuzzyMatch = buildTr("Routes containing '" + query + "':"),
172
+ noExactMatch = buildTr('No exact matches found'),
173
+ noFuzzyMatch = buildTr('No fuzzy matches found');
174
+
175
+ if (!query)
176
+ return searchElem.onblur();
177
+
178
+ getJSON('/rails/info/routes?query=' + query, function(matches){
179
+ // Clear out results section
180
+ exactSection.replaceChildren(defaultExactMatch);
181
+ fuzzySection.replaceChildren(defaultFuzzyMatch);
182
+
183
+ // Display exact matches and fuzzy matches
184
+ pathElements.forEach(function(elem) {
185
+ var elemPath = elem.getAttribute('data-route-path');
186
+ if (matches['exact'].indexOf(elemPath) != -1)
187
+ exactSection.appendChild(elem.parentNode.cloneNode(true));
188
+
189
+ if (matches['fuzzy'].indexOf(elemPath) != -1)
190
+ fuzzySection.appendChild(elem.parentNode.cloneNode(true));
191
+ })
192
+
193
+ // Display 'No Matches' message when no matches are found
194
+ checkNoMatch(exactSection, noExactMatch);
195
+ checkNoMatch(fuzzySection, noFuzzyMatch);
164
196
  })
165
-
166
- // Display 'No Matches' message when no matches are found
167
- checkNoMatch(exactMatches, defaultExactMatch, noExactMatch);
168
- checkNoMatch(fuzzyMatches, defaultFuzzyMatch, noFuzzyMatch);
169
- }
197
+ })
170
198
  }
171
199
 
172
200
  // Enables functionality to toggle between `_path` and `_url` helper suffixes
@@ -174,19 +202,20 @@
174
202
 
175
203
  // Sets content for each element
176
204
  function setValOn(elems, val) {
177
- each(elems, function(elem) {
178
- setContent(elem, val);
205
+ elems.forEach(function(elem) {
206
+ elem.innerHTML = val;
179
207
  });
180
208
  }
181
209
 
182
210
  // Sets onClick event for each element
183
211
  function onClick(elems, func) {
184
- each(elems, function(elem) {
212
+ elems.forEach(function(elem) {
185
213
  elem.onclick = func;
186
214
  });
187
215
  }
188
216
 
189
217
  var toggleLinks = document.querySelectorAll('#route_table [data-route-helper]');
218
+
190
219
  onClick(toggleLinks, function(){
191
220
  var helperTxt = this.getAttribute("data-route-helper"),
192
221
  helperElems = document.querySelectorAll('[data-route-name] span.helper');
@@ -195,6 +224,9 @@
195
224
  });
196
225
  }
197
226
 
198
- setupMatchPaths();
227
+ setupMatchingRoutes();
199
228
  setupRouteToggleHelperLinks();
229
+
230
+ // Focus the search input after page has loaded
231
+ document.getElementById('search').focus();
200
232
  </script>
@@ -1,37 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :markup: markdown
4
+
1
5
  require "action_dispatch"
6
+ require "action_dispatch/log_subscriber"
7
+ require "active_support/messages/rotation_configuration"
2
8
 
3
9
  module ActionDispatch
4
10
  class Railtie < Rails::Railtie # :nodoc:
5
11
  config.action_dispatch = ActiveSupport::OrderedOptions.new
6
12
  config.action_dispatch.x_sendfile_header = nil
7
13
  config.action_dispatch.ip_spoofing_check = true
8
- config.action_dispatch.show_exceptions = true
14
+ config.action_dispatch.show_exceptions = :all
9
15
  config.action_dispatch.tld_length = 1
10
16
  config.action_dispatch.ignore_accept_header = false
11
- config.action_dispatch.rescue_templates = { }
12
- config.action_dispatch.rescue_responses = { }
17
+ config.action_dispatch.rescue_templates = {}
18
+ config.action_dispatch.rescue_responses = {}
13
19
  config.action_dispatch.default_charset = nil
14
20
  config.action_dispatch.rack_cache = false
15
- config.action_dispatch.http_auth_salt = 'http authentication'
16
- config.action_dispatch.signed_cookie_salt = 'signed cookie'
17
- config.action_dispatch.encrypted_cookie_salt = 'encrypted cookie'
18
- config.action_dispatch.encrypted_signed_cookie_salt = 'signed encrypted cookie'
21
+ config.action_dispatch.http_auth_salt = "http authentication"
22
+ config.action_dispatch.signed_cookie_salt = "signed cookie"
23
+ config.action_dispatch.encrypted_cookie_salt = "encrypted cookie"
24
+ config.action_dispatch.encrypted_signed_cookie_salt = "signed encrypted cookie"
25
+ config.action_dispatch.authenticated_encrypted_cookie_salt = "authenticated encrypted cookie"
26
+ config.action_dispatch.use_authenticated_cookie_encryption = false
27
+ config.action_dispatch.use_cookies_with_metadata = false
19
28
  config.action_dispatch.perform_deep_munge = true
29
+ config.action_dispatch.request_id_header = ActionDispatch::Constants::X_REQUEST_ID
30
+ config.action_dispatch.log_rescued_responses = true
31
+ config.action_dispatch.debug_exception_log_level = :fatal
20
32
 
21
33
  config.action_dispatch.default_headers = {
22
- 'X-Frame-Options' => 'SAMEORIGIN',
23
- 'X-XSS-Protection' => '1; mode=block',
24
- 'X-Content-Type-Options' => 'nosniff'
34
+ "X-Frame-Options" => "SAMEORIGIN",
35
+ "X-XSS-Protection" => "1; mode=block",
36
+ "X-Content-Type-Options" => "nosniff",
37
+ "X-Download-Options" => "noopen",
38
+ "X-Permitted-Cross-Domain-Policies" => "none",
39
+ "Referrer-Policy" => "strict-origin-when-cross-origin"
25
40
  }
26
41
 
42
+ config.action_dispatch.cookies_rotations = ActiveSupport::Messages::RotationConfiguration.new
43
+
27
44
  config.eager_load_namespaces << ActionDispatch
28
45
 
46
+ initializer "action_dispatch.deprecator", before: :load_environment_config do |app|
47
+ app.deprecators[:action_dispatch] = ActionDispatch.deprecator
48
+ end
49
+
29
50
  initializer "action_dispatch.configure" do |app|
51
+ ActionDispatch::Http::URL.secure_protocol = app.config.force_ssl
30
52
  ActionDispatch::Http::URL.tld_length = app.config.action_dispatch.tld_length
31
- ActionDispatch::Request.ignore_accept_header = app.config.action_dispatch.ignore_accept_header
32
- ActionDispatch::Request::Utils.perform_deep_munge = app.config.action_dispatch.perform_deep_munge
33
- ActionDispatch::Response.default_charset = app.config.action_dispatch.default_charset || app.config.encoding
34
- ActionDispatch::Response.default_headers = app.config.action_dispatch.default_headers
53
+
54
+ ActiveSupport.on_load(:action_dispatch_request) do
55
+ self.ignore_accept_header = app.config.action_dispatch.ignore_accept_header
56
+ ActionDispatch::Request::Utils.perform_deep_munge = app.config.action_dispatch.perform_deep_munge
57
+ end
58
+
59
+ ActiveSupport.on_load(:action_dispatch_response) do
60
+ self.default_charset = app.config.action_dispatch.default_charset || app.config.encoding
61
+ self.default_headers = app.config.action_dispatch.default_headers
62
+ end
35
63
 
36
64
  ActionDispatch::ExceptionWrapper.rescue_responses.merge!(config.action_dispatch.rescue_responses)
37
65
  ActionDispatch::ExceptionWrapper.rescue_templates.merge!(config.action_dispatch.rescue_templates)
@@ -39,9 +67,9 @@ module ActionDispatch
39
67
  config.action_dispatch.always_write_cookie = Rails.env.development? if config.action_dispatch.always_write_cookie.nil?
40
68
  ActionDispatch::Cookies::CookieJar.always_write_cookie = config.action_dispatch.always_write_cookie
41
69
 
42
- ActionDispatch.test_app = app
70
+ ActionDispatch::Routing::Mapper.route_source_locations = Rails.env.development?
43
71
 
44
- ActionDispatch::Routing::RouteSet.relative_url_root = app.config.relative_url_root
72
+ ActionDispatch.test_app = app
45
73
  end
46
74
  end
47
75
  end