actionpack 3.2.19 → 4.2.11.3

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 (244) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +412 -503
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +11 -294
  5. data/lib/abstract_controller/asset_paths.rb +2 -2
  6. data/lib/abstract_controller/base.rb +52 -18
  7. data/lib/abstract_controller/callbacks.rb +87 -89
  8. data/lib/abstract_controller/collector.rb +17 -3
  9. data/lib/abstract_controller/helpers.rb +41 -14
  10. data/lib/abstract_controller/logger.rb +1 -2
  11. data/lib/abstract_controller/railties/routes_helpers.rb +3 -3
  12. data/lib/abstract_controller/rendering.rb +65 -118
  13. data/lib/abstract_controller/translation.rb +16 -1
  14. data/lib/abstract_controller/url_for.rb +7 -7
  15. data/lib/abstract_controller.rb +2 -10
  16. data/lib/action_controller/base.rb +61 -28
  17. data/lib/action_controller/caching/fragments.rb +30 -54
  18. data/lib/action_controller/caching.rb +38 -35
  19. data/lib/action_controller/log_subscriber.rb +35 -18
  20. data/lib/action_controller/metal/conditional_get.rb +103 -34
  21. data/lib/action_controller/metal/data_streaming.rb +20 -26
  22. data/lib/action_controller/metal/etag_with_template_digest.rb +50 -0
  23. data/lib/action_controller/metal/exceptions.rb +19 -6
  24. data/lib/action_controller/metal/flash.rb +41 -9
  25. data/lib/action_controller/metal/force_ssl.rb +70 -12
  26. data/lib/action_controller/metal/head.rb +30 -7
  27. data/lib/action_controller/metal/helpers.rb +11 -11
  28. data/lib/action_controller/metal/hide_actions.rb +0 -1
  29. data/lib/action_controller/metal/http_authentication.rb +140 -94
  30. data/lib/action_controller/metal/implicit_render.rb +1 -1
  31. data/lib/action_controller/metal/instrumentation.rb +11 -7
  32. data/lib/action_controller/metal/live.rb +328 -0
  33. data/lib/action_controller/metal/mime_responds.rb +161 -152
  34. data/lib/action_controller/metal/params_wrapper.rb +126 -81
  35. data/lib/action_controller/metal/rack_delegation.rb +10 -4
  36. data/lib/action_controller/metal/redirecting.rb +44 -41
  37. data/lib/action_controller/metal/renderers.rb +48 -19
  38. data/lib/action_controller/metal/rendering.rb +46 -11
  39. data/lib/action_controller/metal/request_forgery_protection.rb +250 -29
  40. data/lib/action_controller/metal/streaming.rb +30 -38
  41. data/lib/action_controller/metal/strong_parameters.rb +669 -0
  42. data/lib/action_controller/metal/testing.rb +12 -18
  43. data/lib/action_controller/metal/url_for.rb +31 -29
  44. data/lib/action_controller/metal.rb +31 -40
  45. data/lib/action_controller/model_naming.rb +12 -0
  46. data/lib/action_controller/railtie.rb +38 -18
  47. data/lib/action_controller/railties/helpers.rb +22 -0
  48. data/lib/action_controller/test_case.rb +359 -173
  49. data/lib/action_controller.rb +9 -16
  50. data/lib/action_dispatch/http/cache.rb +64 -11
  51. data/lib/action_dispatch/http/filter_parameters.rb +20 -10
  52. data/lib/action_dispatch/http/filter_redirect.rb +38 -0
  53. data/lib/action_dispatch/http/headers.rb +85 -17
  54. data/lib/action_dispatch/http/mime_negotiation.rb +55 -5
  55. data/lib/action_dispatch/http/mime_type.rb +167 -114
  56. data/lib/action_dispatch/http/mime_types.rb +2 -1
  57. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  58. data/lib/action_dispatch/http/parameters.rb +30 -46
  59. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  60. data/lib/action_dispatch/http/request.rb +108 -45
  61. data/lib/action_dispatch/http/response.rb +247 -48
  62. data/lib/action_dispatch/http/upload.rb +60 -29
  63. data/lib/action_dispatch/http/url.rb +135 -45
  64. data/lib/action_dispatch/journey/backwards.rb +5 -0
  65. data/lib/action_dispatch/journey/formatter.rb +166 -0
  66. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  67. data/lib/action_dispatch/journey/gtg/simulator.rb +47 -0
  68. data/lib/action_dispatch/journey/gtg/transition_table.rb +157 -0
  69. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  70. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  71. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  72. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  73. data/lib/action_dispatch/journey/nodes/node.rb +128 -0
  74. data/lib/action_dispatch/journey/parser.rb +198 -0
  75. data/lib/action_dispatch/journey/parser.y +49 -0
  76. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  77. data/lib/action_dispatch/journey/path/pattern.rb +193 -0
  78. data/lib/action_dispatch/journey/route.rb +125 -0
  79. data/lib/action_dispatch/journey/router/strexp.rb +27 -0
  80. data/lib/action_dispatch/journey/router/utils.rb +93 -0
  81. data/lib/action_dispatch/journey/router.rb +144 -0
  82. data/lib/action_dispatch/journey/routes.rb +80 -0
  83. data/lib/action_dispatch/journey/scanner.rb +61 -0
  84. data/lib/action_dispatch/journey/visitors.rb +221 -0
  85. data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
  86. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  87. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  88. data/lib/action_dispatch/journey.rb +5 -0
  89. data/lib/action_dispatch/middleware/callbacks.rb +16 -11
  90. data/lib/action_dispatch/middleware/cookies.rb +346 -125
  91. data/lib/action_dispatch/middleware/debug_exceptions.rb +52 -24
  92. data/lib/action_dispatch/middleware/exception_wrapper.rb +75 -9
  93. data/lib/action_dispatch/middleware/flash.rb +85 -72
  94. data/lib/action_dispatch/middleware/params_parser.rb +16 -31
  95. data/lib/action_dispatch/middleware/public_exceptions.rb +39 -14
  96. data/lib/action_dispatch/middleware/reloader.rb +16 -7
  97. data/lib/action_dispatch/middleware/remote_ip.rb +132 -40
  98. data/lib/action_dispatch/middleware/request_id.rb +3 -7
  99. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  100. data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
  101. data/lib/action_dispatch/middleware/session/cookie_store.rb +84 -29
  102. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  103. data/lib/action_dispatch/middleware/show_exceptions.rb +15 -44
  104. data/lib/action_dispatch/middleware/ssl.rb +72 -0
  105. data/lib/action_dispatch/middleware/stack.rb +6 -1
  106. data/lib/action_dispatch/middleware/static.rb +80 -23
  107. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +34 -0
  108. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  109. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +27 -0
  110. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
  111. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
  112. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
  113. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
  114. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +133 -5
  115. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
  116. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  117. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
  118. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  119. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
  120. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
  121. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
  122. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  123. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  124. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
  125. data/lib/action_dispatch/railtie.rb +19 -6
  126. data/lib/action_dispatch/request/session.rb +193 -0
  127. data/lib/action_dispatch/request/utils.rb +35 -0
  128. data/lib/action_dispatch/routing/endpoint.rb +10 -0
  129. data/lib/action_dispatch/routing/inspector.rb +234 -0
  130. data/lib/action_dispatch/routing/mapper.rb +897 -436
  131. data/lib/action_dispatch/routing/polymorphic_routes.rb +213 -92
  132. data/lib/action_dispatch/routing/redirection.rb +97 -37
  133. data/lib/action_dispatch/routing/route_set.rb +432 -239
  134. data/lib/action_dispatch/routing/routes_proxy.rb +7 -4
  135. data/lib/action_dispatch/routing/url_for.rb +63 -34
  136. data/lib/action_dispatch/routing.rb +57 -89
  137. data/lib/action_dispatch/testing/assertions/dom.rb +2 -36
  138. data/lib/action_dispatch/testing/assertions/response.rb +24 -38
  139. data/lib/action_dispatch/testing/assertions/routing.rb +55 -54
  140. data/lib/action_dispatch/testing/assertions/selector.rb +2 -434
  141. data/lib/action_dispatch/testing/assertions/tag.rb +2 -137
  142. data/lib/action_dispatch/testing/assertions.rb +11 -7
  143. data/lib/action_dispatch/testing/integration.rb +88 -72
  144. data/lib/action_dispatch/testing/test_process.rb +9 -6
  145. data/lib/action_dispatch/testing/test_request.rb +13 -9
  146. data/lib/action_dispatch/testing/test_response.rb +1 -5
  147. data/lib/action_dispatch.rb +24 -21
  148. data/lib/action_pack/gem_version.rb +15 -0
  149. data/lib/action_pack/version.rb +5 -7
  150. data/lib/action_pack.rb +1 -1
  151. metadata +181 -292
  152. data/lib/abstract_controller/layouts.rb +0 -423
  153. data/lib/abstract_controller/view_paths.rb +0 -96
  154. data/lib/action_controller/caching/actions.rb +0 -185
  155. data/lib/action_controller/caching/pages.rb +0 -187
  156. data/lib/action_controller/caching/sweeping.rb +0 -97
  157. data/lib/action_controller/deprecated/integration_test.rb +0 -2
  158. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  159. data/lib/action_controller/deprecated.rb +0 -3
  160. data/lib/action_controller/metal/compatibility.rb +0 -65
  161. data/lib/action_controller/metal/responder.rb +0 -286
  162. data/lib/action_controller/metal/session_management.rb +0 -14
  163. data/lib/action_controller/railties/paths.rb +0 -25
  164. data/lib/action_controller/record_identifier.rb +0 -85
  165. data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
  166. data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
  167. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
  168. data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
  169. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
  170. data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
  171. data/lib/action_controller/vendor/html-scanner.rb +0 -20
  172. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  173. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  174. data/lib/action_dispatch/middleware/head.rb +0 -18
  175. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  176. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
  177. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
  178. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
  179. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
  180. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
  181. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
  182. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
  183. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  184. data/lib/action_view/asset_paths.rb +0 -142
  185. data/lib/action_view/base.rb +0 -220
  186. data/lib/action_view/buffers.rb +0 -43
  187. data/lib/action_view/context.rb +0 -36
  188. data/lib/action_view/flows.rb +0 -79
  189. data/lib/action_view/helpers/active_model_helper.rb +0 -50
  190. data/lib/action_view/helpers/asset_paths.rb +0 -7
  191. data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
  192. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  193. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  194. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  195. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  196. data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
  197. data/lib/action_view/helpers/cache_helper.rb +0 -64
  198. data/lib/action_view/helpers/capture_helper.rb +0 -203
  199. data/lib/action_view/helpers/controller_helper.rb +0 -25
  200. data/lib/action_view/helpers/csrf_helper.rb +0 -32
  201. data/lib/action_view/helpers/date_helper.rb +0 -1062
  202. data/lib/action_view/helpers/debug_helper.rb +0 -40
  203. data/lib/action_view/helpers/form_helper.rb +0 -1486
  204. data/lib/action_view/helpers/form_options_helper.rb +0 -658
  205. data/lib/action_view/helpers/form_tag_helper.rb +0 -685
  206. data/lib/action_view/helpers/javascript_helper.rb +0 -110
  207. data/lib/action_view/helpers/number_helper.rb +0 -622
  208. data/lib/action_view/helpers/output_safety_helper.rb +0 -38
  209. data/lib/action_view/helpers/record_tag_helper.rb +0 -111
  210. data/lib/action_view/helpers/rendering_helper.rb +0 -90
  211. data/lib/action_view/helpers/sanitize_helper.rb +0 -259
  212. data/lib/action_view/helpers/tag_helper.rb +0 -160
  213. data/lib/action_view/helpers/text_helper.rb +0 -426
  214. data/lib/action_view/helpers/translation_helper.rb +0 -91
  215. data/lib/action_view/helpers/url_helper.rb +0 -693
  216. data/lib/action_view/helpers.rb +0 -60
  217. data/lib/action_view/locale/en.yml +0 -160
  218. data/lib/action_view/log_subscriber.rb +0 -28
  219. data/lib/action_view/lookup_context.rb +0 -254
  220. data/lib/action_view/path_set.rb +0 -89
  221. data/lib/action_view/railtie.rb +0 -55
  222. data/lib/action_view/renderer/abstract_renderer.rb +0 -41
  223. data/lib/action_view/renderer/partial_renderer.rb +0 -415
  224. data/lib/action_view/renderer/renderer.rb +0 -54
  225. data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
  226. data/lib/action_view/renderer/template_renderer.rb +0 -94
  227. data/lib/action_view/template/error.rb +0 -128
  228. data/lib/action_view/template/handlers/builder.rb +0 -26
  229. data/lib/action_view/template/handlers/erb.rb +0 -125
  230. data/lib/action_view/template/handlers.rb +0 -50
  231. data/lib/action_view/template/resolver.rb +0 -272
  232. data/lib/action_view/template/text.rb +0 -30
  233. data/lib/action_view/template.rb +0 -337
  234. data/lib/action_view/test_case.rb +0 -245
  235. data/lib/action_view/testing/resolvers.rb +0 -50
  236. data/lib/action_view.rb +0 -84
  237. data/lib/sprockets/assets.rake +0 -99
  238. data/lib/sprockets/bootstrap.rb +0 -37
  239. data/lib/sprockets/compressors.rb +0 -83
  240. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  241. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  242. data/lib/sprockets/helpers.rb +0 -6
  243. data/lib/sprockets/railtie.rb +0 -62
  244. data/lib/sprockets/static_compiler.rb +0 -56
@@ -0,0 +1,32 @@
1
+ <header>
2
+ <h1>Routing Error</h1>
3
+ </header>
4
+ <div id="container">
5
+ <h2><%= h @exception.message %></h2>
6
+ <% unless @exception.failures.empty? %>
7
+ <p>
8
+ <h2>Failure reasons:</h2>
9
+ <ol>
10
+ <% @exception.failures.each do |route, reason| %>
11
+ <li><code><%= route.inspect.delete('\\') %></code> failed because <%= reason.downcase %></li>
12
+ <% end %>
13
+ </ol>
14
+ </p>
15
+ <% end %>
16
+
17
+ <%= render template: "rescues/_trace" %>
18
+
19
+ <% if @routes_inspector %>
20
+ <h2>
21
+ Routes
22
+ </h2>
23
+
24
+ <p>
25
+ Routes match in priority from top to bottom
26
+ </p>
27
+
28
+ <%= @routes_inspector.format(ActionDispatch::Routing::HtmlTableFormatter.new(self)) %>
29
+ <% end %>
30
+
31
+ <%= render template: "rescues/_request_and_response" %>
32
+ </div>
@@ -0,0 +1,11 @@
1
+ Routing Error
2
+
3
+ <%= @exception.message %>
4
+ <% unless @exception.failures.empty? %>
5
+ Failure reasons:
6
+ <% @exception.failures.each do |route, reason| %>
7
+ - <%= route.inspect.delete('\\') %></code> failed because <%= reason.downcase %>
8
+ <% end %>
9
+ <% end %>
10
+
11
+ <%= render template: "rescues/_trace", format: :text %>
@@ -0,0 +1,20 @@
1
+ <header>
2
+ <h1>
3
+ <%= @exception.original_exception.class.to_s %> in
4
+ <%= @request.parameters["controller"].camelize if @request.parameters["controller"] %>#<%= @request.parameters["action"] %>
5
+ </h1>
6
+ </header>
7
+
8
+ <div id="container">
9
+ <p>
10
+ Showing <i><%= @exception.file_name %></i> where line <b>#<%= @exception.line_number %></b> raised:
11
+ </p>
12
+ <pre><code><%= h @exception.message %></code></pre>
13
+
14
+ <%= render template: "rescues/_source" %>
15
+
16
+ <p><%= @exception.sub_template_message %></p>
17
+
18
+ <%= render template: "rescues/_trace" %>
19
+ <%= render template: "rescues/_request_and_response" %>
20
+ </div>
@@ -0,0 +1,7 @@
1
+ <%= @exception.original_exception.class.to_s %> in <%= @request.parameters["controller"].camelize if @request.parameters["controller"] %>#<%= @request.parameters["action"] %>
2
+
3
+ Showing <%= @exception.file_name %> where line #<%= @exception.line_number %> raised:
4
+ <%= @exception.message %>
5
+ <%= @exception.sub_template_message %>
6
+ <%= render template: "rescues/_trace", format: :text %>
7
+ <%= render template: "rescues/_request_and_response", format: :text %>
@@ -0,0 +1,6 @@
1
+ <header>
2
+ <h1>Unknown action</h1>
3
+ </header>
4
+ <div id="container">
5
+ <h2><%= h @exception.message %></h2>
6
+ </div>
@@ -0,0 +1,3 @@
1
+ Unknown action
2
+
3
+ <%= @exception.message %>
@@ -0,0 +1,16 @@
1
+ <tr class='route_row' data-helper='path'>
2
+ <td data-route-name='<%= route[:name] %>'>
3
+ <% if route[:name].present? %>
4
+ <%= route[:name] %><span class='helper'>_path</span>
5
+ <% end %>
6
+ </td>
7
+ <td data-route-verb='<%= route[:verb] %>'>
8
+ <%= route[:verb] %>
9
+ </td>
10
+ <td data-route-path='<%= route[:path] %>' data-regexp='<%= route[:regexp] %>'>
11
+ <%= route[:path] %>
12
+ </td>
13
+ <td data-route-reqs='<%= route[:reqs] %>'>
14
+ <%= route[:reqs] %>
15
+ </td>
16
+ </tr>
@@ -0,0 +1,200 @@
1
+ <% content_for :style do %>
2
+ #route_table {
3
+ margin: 0;
4
+ border-collapse: collapse;
5
+ }
6
+
7
+ #route_table thead tr {
8
+ border-bottom: 2px solid #ddd;
9
+ }
10
+
11
+ #route_table thead tr.bottom {
12
+ border-bottom: none;
13
+ }
14
+
15
+ #route_table thead tr.bottom th {
16
+ padding: 10px 0;
17
+ line-height: 15px;
18
+ }
19
+
20
+ #route_table tbody tr {
21
+ border-bottom: 1px solid #ddd;
22
+ }
23
+
24
+ #route_table tbody tr:nth-child(odd) {
25
+ background: #f2f2f2;
26
+ }
27
+
28
+ #route_table tbody.exact_matches,
29
+ #route_table tbody.fuzzy_matches {
30
+ background-color: LightGoldenRodYellow;
31
+ border-bottom: solid 2px SlateGrey;
32
+ }
33
+
34
+ #route_table tbody.exact_matches tr,
35
+ #route_table tbody.fuzzy_matches tr {
36
+ background: none;
37
+ border-bottom: none;
38
+ }
39
+
40
+ #route_table td {
41
+ padding: 4px 30px;
42
+ }
43
+
44
+ #path_search {
45
+ width: 80%;
46
+ font-size: inherit;
47
+ }
48
+ <% end %>
49
+
50
+ <table id='route_table' class='route_table'>
51
+ <thead>
52
+ <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',
61
+ title: "Returns a relative path (without the http or domain)" %> /
62
+ <%= 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 %>
71
+ </th>
72
+ </tr>
73
+ </thead>
74
+ <tbody class='exact_matches' id='exact_matches'>
75
+ </tbody>
76
+ <tbody class='fuzzy_matches' id='fuzzy_matches'>
77
+ </tbody>
78
+ <tbody>
79
+ <%= yield %>
80
+ </tbody>
81
+ </table>
82
+
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;
111
+
112
+ showMatch(string, regexp, section, elem);
113
+ }
114
+
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
+ }
120
+ }
121
+
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);
126
+ }
127
+ }
128
+
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(/\#.*|\?.*/, '');
133
+ }
134
+
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');
139
+
140
+ // Remove matches when no search value is present
141
+ searchElem.onblur = function(e) {
142
+ if (searchElem.value === "") {
143
+ setContent(exactMatches, "");
144
+ setContent(fuzzyMatches, "");
145
+ }
146
+ }
147
+
148
+ // 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);
164
+ })
165
+
166
+ // Display 'No Matches' message when no matches are found
167
+ checkNoMatch(exactMatches, defaultExactMatch, noExactMatch);
168
+ checkNoMatch(fuzzyMatches, defaultFuzzyMatch, noFuzzyMatch);
169
+ }
170
+ }
171
+
172
+ // Enables functionality to toggle between `_path` and `_url` helper suffixes
173
+ function setupRouteToggleHelperLinks() {
174
+
175
+ // Sets content for each element
176
+ function setValOn(elems, val) {
177
+ each(elems, function(elem) {
178
+ setContent(elem, val);
179
+ });
180
+ }
181
+
182
+ // Sets onClick event for each element
183
+ function onClick(elems, func) {
184
+ each(elems, function(elem) {
185
+ elem.onclick = func;
186
+ });
187
+ }
188
+
189
+ var toggleLinks = document.querySelectorAll('#route_table [data-route-helper]');
190
+ onClick(toggleLinks, function(){
191
+ var helperTxt = this.getAttribute("data-route-helper"),
192
+ helperElems = document.querySelectorAll('[data-route-name] span.helper');
193
+
194
+ setValOn(helperElems, helperTxt);
195
+ });
196
+ }
197
+
198
+ setupMatchPaths();
199
+ setupRouteToggleHelperLinks();
200
+ </script>
@@ -1,34 +1,47 @@
1
1
  require "action_dispatch"
2
2
 
3
3
  module ActionDispatch
4
- class Railtie < Rails::Railtie
4
+ class Railtie < Rails::Railtie # :nodoc:
5
5
  config.action_dispatch = ActiveSupport::OrderedOptions.new
6
6
  config.action_dispatch.x_sendfile_header = nil
7
7
  config.action_dispatch.ip_spoofing_check = true
8
8
  config.action_dispatch.show_exceptions = true
9
- config.action_dispatch.best_standards_support = true
10
9
  config.action_dispatch.tld_length = 1
11
10
  config.action_dispatch.ignore_accept_header = false
12
11
  config.action_dispatch.rescue_templates = { }
13
12
  config.action_dispatch.rescue_responses = { }
14
13
  config.action_dispatch.default_charset = nil
14
+ 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'
19
+ config.action_dispatch.perform_deep_munge = true
15
20
 
16
- config.action_dispatch.rack_cache = {
17
- :metastore => "rails:/",
18
- :entitystore => "rails:/",
19
- :verbose => false
21
+ config.action_dispatch.default_headers = {
22
+ 'X-Frame-Options' => 'SAMEORIGIN',
23
+ 'X-XSS-Protection' => '1; mode=block',
24
+ 'X-Content-Type-Options' => 'nosniff'
20
25
  }
21
26
 
27
+ config.eager_load_namespaces << ActionDispatch
28
+
22
29
  initializer "action_dispatch.configure" do |app|
23
30
  ActionDispatch::Http::URL.tld_length = app.config.action_dispatch.tld_length
24
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
25
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
26
35
 
27
36
  ActionDispatch::ExceptionWrapper.rescue_responses.merge!(config.action_dispatch.rescue_responses)
28
37
  ActionDispatch::ExceptionWrapper.rescue_templates.merge!(config.action_dispatch.rescue_templates)
29
38
 
30
39
  config.action_dispatch.always_write_cookie = Rails.env.development? if config.action_dispatch.always_write_cookie.nil?
31
40
  ActionDispatch::Cookies::CookieJar.always_write_cookie = config.action_dispatch.always_write_cookie
41
+
42
+ ActionDispatch.test_app = app
43
+
44
+ ActionDispatch::Routing::RouteSet.relative_url_root = app.config.relative_url_root
32
45
  end
33
46
  end
34
47
  end
@@ -0,0 +1,193 @@
1
+ require 'rack/session/abstract/id'
2
+
3
+ module ActionDispatch
4
+ class Request < Rack::Request
5
+ # Session is responsible for lazily loading the session from store.
6
+ class Session # :nodoc:
7
+ ENV_SESSION_KEY = Rack::Session::Abstract::ENV_SESSION_KEY # :nodoc:
8
+ ENV_SESSION_OPTIONS_KEY = Rack::Session::Abstract::ENV_SESSION_OPTIONS_KEY # :nodoc:
9
+
10
+ # Singleton object used to determine if an optional param wasn't specified
11
+ Unspecified = Object.new
12
+
13
+ def self.create(store, env, default_options)
14
+ session_was = find env
15
+ session = Request::Session.new(store, env)
16
+ session.merge! session_was if session_was
17
+
18
+ set(env, session)
19
+ Options.set(env, Request::Session::Options.new(store, env, default_options))
20
+ session
21
+ end
22
+
23
+ def self.find(env)
24
+ env[ENV_SESSION_KEY]
25
+ end
26
+
27
+ def self.set(env, session)
28
+ env[ENV_SESSION_KEY] = session
29
+ end
30
+
31
+ class Options #:nodoc:
32
+ def self.set(env, options)
33
+ env[ENV_SESSION_OPTIONS_KEY] = options
34
+ end
35
+
36
+ def self.find(env)
37
+ env[ENV_SESSION_OPTIONS_KEY]
38
+ end
39
+
40
+ def initialize(by, env, default_options)
41
+ @by = by
42
+ @env = env
43
+ @delegate = default_options.dup
44
+ end
45
+
46
+ def [](key)
47
+ if key == :id
48
+ @delegate.fetch(key) {
49
+ @delegate[:id] = @by.send(:extract_session_id, @env)
50
+ }
51
+ else
52
+ @delegate[key]
53
+ end
54
+ end
55
+
56
+ def []=(k,v); @delegate[k] = v; end
57
+ def to_hash; @delegate.dup; end
58
+ def values_at(*args); @delegate.values_at(*args); end
59
+ end
60
+
61
+ def initialize(by, env)
62
+ @by = by
63
+ @env = env
64
+ @delegate = {}
65
+ @loaded = false
66
+ @exists = nil # we haven't checked yet
67
+ end
68
+
69
+ def id
70
+ options[:id]
71
+ end
72
+
73
+ def options
74
+ Options.find @env
75
+ end
76
+
77
+ def destroy
78
+ clear
79
+ options = self.options || {}
80
+ new_sid = @by.send(:destroy_session, @env, options[:id], options)
81
+ options[:id] = new_sid # Reset session id with a new value or nil
82
+
83
+ # Load the new sid to be written with the response
84
+ @loaded = false
85
+ load_for_write!
86
+ end
87
+
88
+ def [](key)
89
+ load_for_read!
90
+ @delegate[key.to_s]
91
+ end
92
+
93
+ def has_key?(key)
94
+ load_for_read!
95
+ @delegate.key?(key.to_s)
96
+ end
97
+ alias :key? :has_key?
98
+ alias :include? :has_key?
99
+
100
+ def keys
101
+ @delegate.keys
102
+ end
103
+
104
+ def values
105
+ @delegate.values
106
+ end
107
+
108
+ def []=(key, value)
109
+ load_for_write!
110
+ @delegate[key.to_s] = value
111
+ end
112
+
113
+ def clear
114
+ load_for_write!
115
+ @delegate.clear
116
+ end
117
+
118
+ def to_hash
119
+ load_for_read!
120
+ @delegate.dup.delete_if { |_,v| v.nil? }
121
+ end
122
+
123
+ def update(hash)
124
+ load_for_write!
125
+ @delegate.update stringify_keys(hash)
126
+ end
127
+
128
+ def delete(key)
129
+ load_for_write!
130
+ @delegate.delete key.to_s
131
+ end
132
+
133
+ def fetch(key, default=Unspecified, &block)
134
+ load_for_read!
135
+ if default == Unspecified
136
+ @delegate.fetch(key.to_s, &block)
137
+ else
138
+ @delegate.fetch(key.to_s, default, &block)
139
+ end
140
+ end
141
+
142
+ def inspect
143
+ if loaded?
144
+ super
145
+ else
146
+ "#<#{self.class}:0x#{(object_id << 1).to_s(16)} not yet loaded>"
147
+ end
148
+ end
149
+
150
+ def exists?
151
+ return @exists unless @exists.nil?
152
+ @exists = @by.send(:session_exists?, @env)
153
+ end
154
+
155
+ def loaded?
156
+ @loaded
157
+ end
158
+
159
+ def empty?
160
+ load_for_read!
161
+ @delegate.empty?
162
+ end
163
+
164
+ def merge!(other)
165
+ load_for_write!
166
+ @delegate.merge!(other)
167
+ end
168
+
169
+ private
170
+
171
+ def load_for_read!
172
+ load! if !loaded? && exists?
173
+ end
174
+
175
+ def load_for_write!
176
+ load! unless loaded?
177
+ end
178
+
179
+ def load!
180
+ id, session = @by.load_session @env
181
+ options[:id] = id
182
+ @delegate.replace(stringify_keys(session))
183
+ @loaded = true
184
+ end
185
+
186
+ def stringify_keys(other)
187
+ other.each_with_object({}) { |(key, value), hash|
188
+ hash[key.to_s] = value
189
+ }
190
+ end
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,35 @@
1
+ module ActionDispatch
2
+ class Request < Rack::Request
3
+ class Utils # :nodoc:
4
+
5
+ mattr_accessor :perform_deep_munge
6
+ self.perform_deep_munge = true
7
+
8
+ class << self
9
+ # Remove nils from the params hash
10
+ def deep_munge(hash, keys = [])
11
+ return hash unless perform_deep_munge
12
+
13
+ hash.each do |k, v|
14
+ keys << k
15
+ case v
16
+ when Array
17
+ v.grep(Hash) { |x| deep_munge(x, keys) }
18
+ v.compact!
19
+ if v.empty?
20
+ hash[k] = nil
21
+ ActiveSupport::Notifications.instrument("deep_munge.action_controller", keys: keys)
22
+ end
23
+ when Hash
24
+ deep_munge(v, keys)
25
+ end
26
+ keys.pop
27
+ end
28
+
29
+ hash
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+
@@ -0,0 +1,10 @@
1
+ module ActionDispatch
2
+ module Routing
3
+ class Endpoint # :nodoc:
4
+ def dispatcher?; false; end
5
+ def redirect?; false; end
6
+ def matches?(req); true; end
7
+ def app; self; end
8
+ end
9
+ end
10
+ end