actionpack 3.2.22.5 → 4.0.0.beta1

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 (265) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +641 -418
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +5 -288
  5. data/lib/abstract_controller.rb +1 -8
  6. data/lib/abstract_controller/asset_paths.rb +2 -2
  7. data/lib/abstract_controller/base.rb +39 -37
  8. data/lib/abstract_controller/callbacks.rb +101 -82
  9. data/lib/abstract_controller/collector.rb +7 -3
  10. data/lib/abstract_controller/helpers.rb +23 -11
  11. data/lib/abstract_controller/layouts.rb +68 -73
  12. data/lib/abstract_controller/logger.rb +1 -2
  13. data/lib/abstract_controller/rendering.rb +22 -13
  14. data/lib/abstract_controller/translation.rb +16 -1
  15. data/lib/abstract_controller/url_for.rb +6 -6
  16. data/lib/abstract_controller/view_paths.rb +1 -1
  17. data/lib/action_controller.rb +15 -6
  18. data/lib/action_controller/base.rb +46 -22
  19. data/lib/action_controller/caching.rb +46 -33
  20. data/lib/action_controller/caching/fragments.rb +23 -53
  21. data/lib/action_controller/deprecated.rb +5 -1
  22. data/lib/action_controller/deprecated/integration_test.rb +3 -0
  23. data/lib/action_controller/log_subscriber.rb +11 -8
  24. data/lib/action_controller/metal.rb +16 -30
  25. data/lib/action_controller/metal/conditional_get.rb +76 -32
  26. data/lib/action_controller/metal/data_streaming.rb +20 -26
  27. data/lib/action_controller/metal/exceptions.rb +19 -6
  28. data/lib/action_controller/metal/flash.rb +24 -9
  29. data/lib/action_controller/metal/force_ssl.rb +32 -9
  30. data/lib/action_controller/metal/head.rb +25 -4
  31. data/lib/action_controller/metal/helpers.rb +6 -9
  32. data/lib/action_controller/metal/hide_actions.rb +1 -2
  33. data/lib/action_controller/metal/http_authentication.rb +105 -87
  34. data/lib/action_controller/metal/implicit_render.rb +1 -1
  35. data/lib/action_controller/metal/instrumentation.rb +2 -1
  36. data/lib/action_controller/metal/live.rb +141 -0
  37. data/lib/action_controller/metal/mime_responds.rb +161 -47
  38. data/lib/action_controller/metal/params_wrapper.rb +112 -74
  39. data/lib/action_controller/metal/rack_delegation.rb +9 -3
  40. data/lib/action_controller/metal/redirecting.rb +15 -20
  41. data/lib/action_controller/metal/renderers.rb +11 -9
  42. data/lib/action_controller/metal/rendering.rb +8 -0
  43. data/lib/action_controller/metal/request_forgery_protection.rb +112 -19
  44. data/lib/action_controller/metal/responder.rb +20 -19
  45. data/lib/action_controller/metal/streaming.rb +12 -18
  46. data/lib/action_controller/metal/strong_parameters.rb +516 -0
  47. data/lib/action_controller/metal/testing.rb +13 -18
  48. data/lib/action_controller/metal/url_for.rb +27 -25
  49. data/lib/action_controller/model_naming.rb +12 -0
  50. data/lib/action_controller/railtie.rb +33 -17
  51. data/lib/action_controller/railties/helpers.rb +22 -0
  52. data/lib/action_controller/record_identifier.rb +18 -72
  53. data/lib/action_controller/test_case.rb +215 -123
  54. data/lib/action_controller/vendor/html-scanner.rb +4 -19
  55. data/lib/action_dispatch.rb +27 -19
  56. data/lib/action_dispatch/http/cache.rb +63 -11
  57. data/lib/action_dispatch/http/filter_parameters.rb +18 -8
  58. data/lib/action_dispatch/http/filter_redirect.rb +37 -0
  59. data/lib/action_dispatch/http/headers.rb +27 -19
  60. data/lib/action_dispatch/http/mime_negotiation.rb +25 -2
  61. data/lib/action_dispatch/http/mime_type.rb +145 -113
  62. data/lib/action_dispatch/http/mime_types.rb +1 -1
  63. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  64. data/lib/action_dispatch/http/parameters.rb +12 -5
  65. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  66. data/lib/action_dispatch/http/request.rb +49 -18
  67. data/lib/action_dispatch/http/response.rb +129 -35
  68. data/lib/action_dispatch/http/upload.rb +60 -17
  69. data/lib/action_dispatch/http/url.rb +53 -31
  70. data/lib/action_dispatch/journey.rb +5 -0
  71. data/lib/action_dispatch/journey/backwards.rb +5 -0
  72. data/lib/action_dispatch/journey/formatter.rb +146 -0
  73. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  74. data/lib/action_dispatch/journey/gtg/simulator.rb +44 -0
  75. data/lib/action_dispatch/journey/gtg/transition_table.rb +156 -0
  76. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  77. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  78. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  79. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  80. data/lib/action_dispatch/journey/nodes/node.rb +124 -0
  81. data/lib/action_dispatch/journey/parser.rb +206 -0
  82. data/lib/action_dispatch/journey/parser.y +47 -0
  83. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  84. data/lib/action_dispatch/journey/path/pattern.rb +196 -0
  85. data/lib/action_dispatch/journey/route.rb +116 -0
  86. data/lib/action_dispatch/journey/router.rb +164 -0
  87. data/lib/action_dispatch/journey/router/strexp.rb +24 -0
  88. data/lib/action_dispatch/journey/router/utils.rb +54 -0
  89. data/lib/action_dispatch/journey/routes.rb +75 -0
  90. data/lib/action_dispatch/journey/scanner.rb +61 -0
  91. data/lib/action_dispatch/journey/visitors.rb +189 -0
  92. data/lib/action_dispatch/journey/visualizer/fsm.css +34 -0
  93. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  94. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  95. data/lib/action_dispatch/middleware/callbacks.rb +9 -4
  96. data/lib/action_dispatch/middleware/cookies.rb +168 -57
  97. data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
  98. data/lib/action_dispatch/middleware/exception_wrapper.rb +27 -3
  99. data/lib/action_dispatch/middleware/flash.rb +58 -58
  100. data/lib/action_dispatch/middleware/params_parser.rb +14 -29
  101. data/lib/action_dispatch/middleware/public_exceptions.rb +31 -14
  102. data/lib/action_dispatch/middleware/reloader.rb +6 -6
  103. data/lib/action_dispatch/middleware/remote_ip.rb +145 -39
  104. data/lib/action_dispatch/middleware/request_id.rb +2 -6
  105. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  106. data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
  107. data/lib/action_dispatch/middleware/session/cookie_store.rb +81 -7
  108. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  109. data/lib/action_dispatch/middleware/show_exceptions.rb +12 -45
  110. data/lib/action_dispatch/middleware/ssl.rb +70 -0
  111. data/lib/action_dispatch/middleware/stack.rb +6 -1
  112. data/lib/action_dispatch/middleware/static.rb +5 -24
  113. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +14 -11
  114. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +25 -0
  115. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +3 -3
  116. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
  117. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +121 -5
  118. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +7 -2
  119. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +30 -15
  120. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +39 -13
  121. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +6 -2
  122. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  123. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +144 -0
  124. data/lib/action_dispatch/railtie.rb +16 -6
  125. data/lib/action_dispatch/request/session.rb +181 -0
  126. data/lib/action_dispatch/routing.rb +41 -40
  127. data/lib/action_dispatch/routing/inspector.rb +240 -0
  128. data/lib/action_dispatch/routing/mapper.rb +501 -273
  129. data/lib/action_dispatch/routing/polymorphic_routes.rb +16 -20
  130. data/lib/action_dispatch/routing/redirection.rb +46 -29
  131. data/lib/action_dispatch/routing/route_set.rb +203 -164
  132. data/lib/action_dispatch/routing/routes_proxy.rb +2 -0
  133. data/lib/action_dispatch/routing/url_for.rb +48 -33
  134. data/lib/action_dispatch/testing/assertions/dom.rb +3 -13
  135. data/lib/action_dispatch/testing/assertions/response.rb +32 -40
  136. data/lib/action_dispatch/testing/assertions/routing.rb +40 -39
  137. data/lib/action_dispatch/testing/assertions/selector.rb +15 -20
  138. data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
  139. data/lib/action_dispatch/testing/integration.rb +41 -22
  140. data/lib/action_dispatch/testing/test_process.rb +9 -6
  141. data/lib/action_dispatch/testing/test_request.rb +7 -3
  142. data/lib/action_pack.rb +1 -1
  143. data/lib/action_pack/version.rb +4 -4
  144. data/lib/action_view.rb +17 -8
  145. data/lib/action_view/base.rb +15 -34
  146. data/lib/action_view/buffers.rb +1 -1
  147. data/lib/action_view/context.rb +4 -4
  148. data/lib/action_view/dependency_tracker.rb +91 -0
  149. data/lib/action_view/digestor.rb +85 -0
  150. data/lib/action_view/flows.rb +1 -4
  151. data/lib/action_view/helpers.rb +2 -4
  152. data/lib/action_view/helpers/active_model_helper.rb +3 -4
  153. data/lib/action_view/helpers/asset_tag_helper.rb +211 -353
  154. data/lib/action_view/helpers/asset_url_helper.rb +354 -0
  155. data/lib/action_view/helpers/atom_feed_helper.rb +13 -10
  156. data/lib/action_view/helpers/cache_helper.rb +150 -18
  157. data/lib/action_view/helpers/capture_helper.rb +42 -29
  158. data/lib/action_view/helpers/csrf_helper.rb +0 -2
  159. data/lib/action_view/helpers/date_helper.rb +268 -247
  160. data/lib/action_view/helpers/debug_helper.rb +10 -11
  161. data/lib/action_view/helpers/form_helper.rb +904 -547
  162. data/lib/action_view/helpers/form_options_helper.rb +341 -166
  163. data/lib/action_view/helpers/form_tag_helper.rb +188 -88
  164. data/lib/action_view/helpers/javascript_helper.rb +23 -16
  165. data/lib/action_view/helpers/number_helper.rb +148 -354
  166. data/lib/action_view/helpers/output_safety_helper.rb +3 -3
  167. data/lib/action_view/helpers/record_tag_helper.rb +17 -22
  168. data/lib/action_view/helpers/rendering_helper.rb +2 -4
  169. data/lib/action_view/helpers/sanitize_helper.rb +3 -6
  170. data/lib/action_view/helpers/tag_helper.rb +43 -37
  171. data/lib/action_view/helpers/tags.rb +39 -0
  172. data/lib/action_view/helpers/tags/base.rb +148 -0
  173. data/lib/action_view/helpers/tags/check_box.rb +64 -0
  174. data/lib/action_view/helpers/tags/checkable.rb +16 -0
  175. data/lib/action_view/helpers/tags/collection_check_boxes.rb +43 -0
  176. data/lib/action_view/helpers/tags/collection_helpers.rb +83 -0
  177. data/lib/action_view/helpers/tags/collection_radio_buttons.rb +36 -0
  178. data/lib/action_view/helpers/tags/collection_select.rb +28 -0
  179. data/lib/action_view/helpers/tags/color_field.rb +25 -0
  180. data/lib/action_view/helpers/tags/date_field.rb +13 -0
  181. data/lib/action_view/helpers/tags/date_select.rb +72 -0
  182. data/lib/action_view/helpers/tags/datetime_field.rb +22 -0
  183. data/lib/action_view/helpers/tags/datetime_local_field.rb +19 -0
  184. data/lib/action_view/helpers/tags/datetime_select.rb +8 -0
  185. data/lib/action_view/helpers/tags/email_field.rb +8 -0
  186. data/lib/action_view/helpers/tags/file_field.rb +8 -0
  187. data/lib/action_view/helpers/tags/grouped_collection_select.rb +29 -0
  188. data/lib/action_view/helpers/tags/hidden_field.rb +8 -0
  189. data/lib/action_view/helpers/tags/label.rb +65 -0
  190. data/lib/action_view/helpers/tags/month_field.rb +13 -0
  191. data/lib/action_view/helpers/tags/number_field.rb +18 -0
  192. data/lib/action_view/helpers/tags/password_field.rb +12 -0
  193. data/lib/action_view/helpers/tags/radio_button.rb +31 -0
  194. data/lib/action_view/helpers/tags/range_field.rb +8 -0
  195. data/lib/action_view/helpers/tags/search_field.rb +24 -0
  196. data/lib/action_view/helpers/tags/select.rb +41 -0
  197. data/lib/action_view/helpers/tags/tel_field.rb +8 -0
  198. data/lib/action_view/helpers/tags/text_area.rb +18 -0
  199. data/lib/action_view/helpers/tags/text_field.rb +29 -0
  200. data/lib/action_view/helpers/tags/time_field.rb +13 -0
  201. data/lib/action_view/helpers/tags/time_select.rb +8 -0
  202. data/lib/action_view/helpers/tags/time_zone_select.rb +20 -0
  203. data/lib/action_view/helpers/tags/url_field.rb +8 -0
  204. data/lib/action_view/helpers/tags/week_field.rb +13 -0
  205. data/lib/action_view/helpers/text_helper.rb +126 -113
  206. data/lib/action_view/helpers/translation_helper.rb +32 -16
  207. data/lib/action_view/helpers/url_helper.rb +200 -271
  208. data/lib/action_view/locale/en.yml +1 -105
  209. data/lib/action_view/log_subscriber.rb +6 -4
  210. data/lib/action_view/lookup_context.rb +15 -39
  211. data/lib/action_view/model_naming.rb +12 -0
  212. data/lib/action_view/path_set.rb +9 -39
  213. data/lib/action_view/railtie.rb +6 -22
  214. data/lib/action_view/record_identifier.rb +84 -0
  215. data/lib/action_view/renderer/abstract_renderer.rb +10 -19
  216. data/lib/action_view/renderer/partial_renderer.rb +144 -81
  217. data/lib/action_view/renderer/renderer.rb +2 -19
  218. data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
  219. data/lib/action_view/renderer/template_renderer.rb +14 -13
  220. data/lib/action_view/routing_url_for.rb +107 -0
  221. data/lib/action_view/template.rb +22 -21
  222. data/lib/action_view/template/error.rb +22 -12
  223. data/lib/action_view/template/handlers.rb +12 -9
  224. data/lib/action_view/template/handlers/builder.rb +1 -1
  225. data/lib/action_view/template/handlers/erb.rb +11 -16
  226. data/lib/action_view/template/handlers/raw.rb +11 -0
  227. data/lib/action_view/template/resolver.rb +111 -83
  228. data/lib/action_view/template/text.rb +12 -8
  229. data/lib/action_view/template/types.rb +57 -0
  230. data/lib/action_view/test_case.rb +66 -43
  231. data/lib/action_view/testing/resolvers.rb +3 -2
  232. data/lib/action_view/vendor/html-scanner.rb +20 -0
  233. data/lib/{action_controller → action_view}/vendor/html-scanner/html/document.rb +0 -0
  234. data/lib/{action_controller → action_view}/vendor/html-scanner/html/node.rb +12 -12
  235. data/lib/{action_controller → action_view}/vendor/html-scanner/html/sanitizer.rb +18 -7
  236. data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +1 -1
  237. data/lib/{action_controller → action_view}/vendor/html-scanner/html/tokenizer.rb +1 -1
  238. data/lib/{action_controller → action_view}/vendor/html-scanner/html/version.rb +0 -0
  239. metadata +135 -125
  240. data/lib/action_controller/caching/actions.rb +0 -185
  241. data/lib/action_controller/caching/pages.rb +0 -187
  242. data/lib/action_controller/caching/sweeping.rb +0 -97
  243. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  244. data/lib/action_controller/metal/compatibility.rb +0 -65
  245. data/lib/action_controller/metal/session_management.rb +0 -14
  246. data/lib/action_controller/railties/paths.rb +0 -25
  247. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  248. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  249. data/lib/action_dispatch/middleware/head.rb +0 -18
  250. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  251. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  252. data/lib/action_view/asset_paths.rb +0 -142
  253. data/lib/action_view/helpers/asset_paths.rb +0 -7
  254. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  255. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  256. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  257. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  258. data/lib/sprockets/assets.rake +0 -99
  259. data/lib/sprockets/bootstrap.rb +0 -37
  260. data/lib/sprockets/compressors.rb +0 -83
  261. data/lib/sprockets/helpers.rb +0 -6
  262. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  263. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  264. data/lib/sprockets/railtie.rb +0 -62
  265. data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,2 +1,7 @@
1
- <h1>Template is missing</h1>
2
- <p><%=h @exception.message %></p>
1
+ <header>
2
+ <h1>Template is missing</h1>
3
+ </header>
4
+
5
+ <div id="container">
6
+ <h2><%= @exception.message %></h2>
7
+ </div>
@@ -1,15 +1,30 @@
1
- <h1>Routing Error</h1>
2
- <p><pre><%=h @exception.message %></pre></p>
3
- <% unless @exception.failures.empty? %>
4
- <p>
5
- <h2>Failure reasons:</h2>
6
- <ol>
7
- <% @exception.failures.each do |route, reason| %>
8
- <li><code><%=h route.inspect.gsub('\\', '') %></code> failed because <%=h reason.downcase %></li>
9
- <% end %>
10
- </ol>
11
- </p>
12
- <% end %>
13
- <p>
14
- Try running <code>rake routes</code> for more information on available routes.
15
- </p>
1
+ <header>
2
+ <h1>Routing Error</h1>
3
+ </header>
4
+ <div id="container">
5
+ <h2><%= @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.gsub('\\', '') %></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
+ </div>
@@ -1,17 +1,43 @@
1
- <h1>
2
- <%=h @exception.original_exception.class.to_s %> in
3
- <%=h @request.parameters["controller"].capitalize if @request.parameters["controller"]%>#<%=h @request.parameters["action"] %>
4
- </h1>
1
+ <% @source_extract = @exception.source_extract(0, :html) %>
2
+ <header>
3
+ <h1>
4
+ <%= @exception.original_exception.class.to_s %> in
5
+ <%= @request.parameters["controller"].capitalize if @request.parameters["controller"]%>#<%= @request.parameters["action"] %>
6
+ </h1>
7
+ </header>
5
8
 
6
- <p>
7
- Showing <i><%=h @exception.file_name %></i> where line <b>#<%=h @exception.line_number %></b> raised:
8
- <pre><code><%=h @exception.message %></code></pre>
9
- </p>
9
+ <div id="container">
10
+ <p>
11
+ Showing <i><%= @exception.file_name %></i> where line <b>#<%= @exception.line_number %></b> raised:
12
+ </p>
13
+ <pre><code><%= @exception.message %></code></pre>
10
14
 
11
- <p>Extracted source (around line <b>#<%=h @exception.line_number %></b>):
12
- <pre><code><%=h @exception.source_extract %></code></pre></p>
15
+ <div class="source">
16
+ <div class="info">
17
+ <p>Extracted source (around line <strong>#<%= @exception.line_number %></strong>):</p>
18
+ </div>
19
+ <div class="data">
20
+ <table cellpadding="0" cellspacing="0" class="lines">
21
+ <tr>
22
+ <td>
23
+ <pre class="line_numbers">
24
+ <% @source_extract.keys.each do |line_number| %>
25
+ <span><%= line_number -%></span>
26
+ <% end %>
27
+ </pre>
28
+ </td>
29
+ <td width="100%">
30
+ <pre>
31
+ <% @source_extract.each do |line, source| -%><div class="line<%= " active" if line == @exception.line_number -%>"><%= source -%></div><% end -%>
32
+ </pre>
33
+ </td>
34
+ </tr>
35
+ </table>
36
+ </div>
37
+ </div>
13
38
 
14
- <p><%=h @exception.sub_template_message %></p>
39
+ <p><%= @exception.sub_template_message %></p>
15
40
 
16
- <%= render :template => "rescues/_trace" %>
17
- <%= render :template => "rescues/_request_and_response" %>
41
+ <%= render template: "rescues/_trace" %>
42
+ <%= render template: "rescues/_request_and_response" %>
43
+ </div>
@@ -1,2 +1,6 @@
1
- <h1>Unknown action</h1>
2
- <p><%=h @exception.message %></p>
1
+ <header>
2
+ <h1>Unknown action</h1>
3
+ </header>
4
+ <div id="container">
5
+ <h2><%= @exception.message %></h2>
6
+ </div>
@@ -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,144 @@
1
+ <% content_for :style do %>
2
+ #route_table {
3
+ margin: 0 auto 0;
4
+ border-collapse: collapse;
5
+ }
6
+
7
+ #route_table td {
8
+ padding: 0 30px;
9
+ }
10
+
11
+ #route_table tr.bottom th {
12
+ padding-bottom: 10px;
13
+ line-height: 15px;
14
+ }
15
+
16
+ #route_table .matched_paths {
17
+ background-color: LightGoldenRodYellow;
18
+ }
19
+
20
+ #route_table .matched_paths {
21
+ border-bottom: solid 3px SlateGrey;
22
+ }
23
+
24
+ #path_search {
25
+ width: 80%;
26
+ font-size: inherit;
27
+ }
28
+ <% end %>
29
+
30
+ <table id='route_table' class='route_table'>
31
+ <thead>
32
+ <tr>
33
+ <th>Helper</th>
34
+ <th>HTTP Verb</th>
35
+ <th>Path</th>
36
+ <th>Controller#Action</th>
37
+ </tr>
38
+ <tr class='bottom'>
39
+ <th><%# Helper %>
40
+ <%= link_to "Path", "#", 'data-route-helper' => '_path',
41
+ title: "Returns a relative path (without the http or domain)" %> /
42
+ <%= link_to "Url", "#", 'data-route-helper' => '_url',
43
+ title: "Returns an absolute url (with the http and domain)" %>
44
+ </th>
45
+ <th><%# HTTP Verb %>
46
+ </th>
47
+ <th><%# Path %>
48
+ <%= search_field(:path, nil, id: 'path_search', placeholder: "Path Match") %>
49
+ </th>
50
+ <th><%# Controller#action %>
51
+ </th>
52
+ </tr>
53
+ </thead>
54
+ <tbody class='matched_paths' id='matched_paths'>
55
+ </tbody>
56
+ <tbody>
57
+ <%= yield %>
58
+ </tbody>
59
+ </table>
60
+
61
+ <script type='text/javascript'>
62
+ function each(elems, func) {
63
+ if (!elems instanceof Array) { elems = [elems]; }
64
+ for (var i = 0, len = elems.length; i < len; i++) {
65
+ func(elems[i]);
66
+ }
67
+ }
68
+
69
+ function setValOn(elems, val) {
70
+ each(elems, function(elem) {
71
+ elem.innerHTML = val;
72
+ });
73
+ }
74
+
75
+ function onClick(elems, func) {
76
+ each(elems, function(elem) {
77
+ elem.onclick = func;
78
+ });
79
+ }
80
+
81
+ // Enables functionality to toggle between `_path` and `_url` helper suffixes
82
+ function setupRouteToggleHelperLinks() {
83
+ var toggleLinks = document.querySelectorAll('#route_table [data-route-helper]');
84
+ onClick(toggleLinks, function(){
85
+ var helperTxt = this.getAttribute("data-route-helper"),
86
+ helperElems = document.querySelectorAll('[data-route-name] span.helper');
87
+ setValOn(helperElems, helperTxt);
88
+ });
89
+ }
90
+
91
+ // takes an array of elements with a data-regexp attribute and
92
+ // passes their their parent <tr> into the callback function
93
+ // if the regexp matchs a given path
94
+ function eachElemsForPath(elems, path, func) {
95
+ each(elems, function(e){
96
+ var reg = e.getAttribute("data-regexp");
97
+ if (path.match(RegExp(reg))) {
98
+ func(e.parentNode.cloneNode(true));
99
+ }
100
+ })
101
+ }
102
+
103
+ // Ensure path always starts with a slash "/" and remove params or fragments
104
+ function sanitizePath(path) {
105
+ var path = path.charAt(0) == '/' ? path : "/" + path;
106
+ return path.replace(/\#.*|\?.*/, '');
107
+ }
108
+
109
+ // Enables path search functionality
110
+ function setupMatchPaths() {
111
+ var regexpElems = document.querySelectorAll('#route_table [data-regexp]'),
112
+ pathElem = document.querySelector('#path_search'),
113
+ selectedSection = document.querySelector('#matched_paths'),
114
+ noMatchText = '<tr><th colspan="4">None</th></tr>';
115
+
116
+
117
+ // Remove matches if no path is present
118
+ pathElem.onblur = function(e) {
119
+ if (pathElem.value === "") selectedSection.innerHTML = "";
120
+ }
121
+
122
+ // On key press perform a search for matching paths
123
+ pathElem.onkeyup = function(e){
124
+ var path = sanitizePath(pathElem.value),
125
+ defaultText = '<tr><th colspan="4">Paths Matching (' + path + '):</th></tr>';
126
+
127
+ // Clear out results section
128
+ selectedSection.innerHTML= defaultText;
129
+
130
+ // Display matches if they exist
131
+ eachElemsForPath(regexpElems, path, function(e){
132
+ selectedSection.appendChild(e);
133
+ });
134
+
135
+ // If no match present, tell the user
136
+ if (selectedSection.innerHTML === defaultText) {
137
+ selectedSection.innerHTML = selectedSection.innerHTML + noMatchText;
138
+ }
139
+ }
140
+ }
141
+
142
+ setupMatchPaths();
143
+ setupRouteToggleHelperLinks();
144
+ </script>
@@ -1,34 +1,44 @@
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'
15
19
 
16
- config.action_dispatch.rack_cache = {
17
- :metastore => "rails:/",
18
- :entitystore => "rails:/",
19
- :verbose => false
20
+ config.action_dispatch.default_headers = {
21
+ 'X-Frame-Options' => 'SAMEORIGIN',
22
+ 'X-XSS-Protection' => '1; mode=block',
23
+ 'X-Content-Type-Options' => 'nosniff',
24
+ 'X-UA-Compatible' => 'chrome=1'
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
25
32
  ActionDispatch::Response.default_charset = app.config.action_dispatch.default_charset || app.config.encoding
33
+ ActionDispatch::Response.default_headers = app.config.action_dispatch.default_headers
26
34
 
27
35
  ActionDispatch::ExceptionWrapper.rescue_responses.merge!(config.action_dispatch.rescue_responses)
28
36
  ActionDispatch::ExceptionWrapper.rescue_templates.merge!(config.action_dispatch.rescue_templates)
29
37
 
30
38
  config.action_dispatch.always_write_cookie = Rails.env.development? if config.action_dispatch.always_write_cookie.nil?
31
39
  ActionDispatch::Cookies::CookieJar.always_write_cookie = config.action_dispatch.always_write_cookie
40
+
41
+ ActionDispatch.test_app = app
32
42
  end
33
43
  end
34
44
  end
@@ -0,0 +1,181 @@
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
+ def self.create(store, env, default_options)
11
+ session_was = find env
12
+ session = Request::Session.new(store, env)
13
+ session.merge! session_was if session_was
14
+
15
+ set(env, session)
16
+ Options.set(env, Request::Session::Options.new(store, env, default_options))
17
+ session
18
+ end
19
+
20
+ def self.find(env)
21
+ env[ENV_SESSION_KEY]
22
+ end
23
+
24
+ def self.set(env, session)
25
+ env[ENV_SESSION_KEY] = session
26
+ end
27
+
28
+ class Options #:nodoc:
29
+ def self.set(env, options)
30
+ env[ENV_SESSION_OPTIONS_KEY] = options
31
+ end
32
+
33
+ def self.find(env)
34
+ env[ENV_SESSION_OPTIONS_KEY]
35
+ end
36
+
37
+ def initialize(by, env, default_options)
38
+ @by = by
39
+ @env = env
40
+ @delegate = default_options.dup
41
+ end
42
+
43
+ def [](key)
44
+ if key == :id
45
+ @delegate.fetch(key) {
46
+ @delegate[:id] = @by.send(:extract_session_id, @env)
47
+ }
48
+ else
49
+ @delegate[key]
50
+ end
51
+ end
52
+
53
+ def []=(k,v); @delegate[k] = v; end
54
+ def to_hash; @delegate.dup; end
55
+ def values_at(*args); @delegate.values_at(*args); end
56
+ end
57
+
58
+ def initialize(by, env)
59
+ @by = by
60
+ @env = env
61
+ @delegate = {}
62
+ @loaded = false
63
+ @exists = nil # we haven't checked yet
64
+ end
65
+
66
+ def id
67
+ options[:id]
68
+ end
69
+
70
+ def options
71
+ Options.find @env
72
+ end
73
+
74
+ def destroy
75
+ clear
76
+ options = self.options || {}
77
+ new_sid = @by.send(:destroy_session, @env, options[:id], options)
78
+ options[:id] = new_sid # Reset session id with a new value or nil
79
+
80
+ # Load the new sid to be written with the response
81
+ @loaded = false
82
+ load_for_write!
83
+ end
84
+
85
+ def [](key)
86
+ load_for_read!
87
+ @delegate[key.to_s]
88
+ end
89
+
90
+ def has_key?(key)
91
+ load_for_read!
92
+ @delegate.key?(key.to_s)
93
+ end
94
+ alias :key? :has_key?
95
+ alias :include? :has_key?
96
+
97
+ def keys
98
+ @delegate.keys
99
+ end
100
+
101
+ def values
102
+ @delegate.values
103
+ end
104
+
105
+ def []=(key, value)
106
+ load_for_write!
107
+ @delegate[key.to_s] = value
108
+ end
109
+
110
+ def clear
111
+ load_for_write!
112
+ @delegate.clear
113
+ end
114
+
115
+ def to_hash
116
+ load_for_read!
117
+ @delegate.dup.delete_if { |_,v| v.nil? }
118
+ end
119
+
120
+ def update(hash)
121
+ load_for_write!
122
+ @delegate.update stringify_keys(hash)
123
+ end
124
+
125
+ def delete(key)
126
+ load_for_write!
127
+ @delegate.delete key.to_s
128
+ end
129
+
130
+ def inspect
131
+ if loaded?
132
+ super
133
+ else
134
+ "#<#{self.class}:0x#{(object_id << 1).to_s(16)} not yet loaded>"
135
+ end
136
+ end
137
+
138
+ def exists?
139
+ return @exists unless @exists.nil?
140
+ @exists = @by.send(:session_exists?, @env)
141
+ end
142
+
143
+ def loaded?
144
+ @loaded
145
+ end
146
+
147
+ def empty?
148
+ load_for_read!
149
+ @delegate.empty?
150
+ end
151
+
152
+ def merge!(other)
153
+ load_for_write!
154
+ @delegate.merge!(other)
155
+ end
156
+
157
+ private
158
+
159
+ def load_for_read!
160
+ load! if !loaded? && exists?
161
+ end
162
+
163
+ def load_for_write!
164
+ load! unless loaded?
165
+ end
166
+
167
+ def load!
168
+ id, session = @by.load_session @env
169
+ options[:id] = id
170
+ @delegate.replace(stringify_keys(session))
171
+ @loaded = true
172
+ end
173
+
174
+ def stringify_keys(other)
175
+ other.each_with_object({}) { |(key, value), hash|
176
+ hash[key.to_s] = value
177
+ }
178
+ end
179
+ end
180
+ end
181
+ end