actionpack 3.2.19 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +850 -401
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +5 -288
  5. data/lib/abstract_controller/asset_paths.rb +2 -2
  6. data/lib/abstract_controller/base.rb +39 -37
  7. data/lib/abstract_controller/callbacks.rb +101 -82
  8. data/lib/abstract_controller/collector.rb +7 -3
  9. data/lib/abstract_controller/helpers.rb +25 -13
  10. data/lib/abstract_controller/layouts.rb +74 -74
  11. data/lib/abstract_controller/logger.rb +1 -2
  12. data/lib/abstract_controller/rendering.rb +30 -13
  13. data/lib/abstract_controller/translation.rb +16 -1
  14. data/lib/abstract_controller/url_for.rb +6 -6
  15. data/lib/abstract_controller/view_paths.rb +1 -1
  16. data/lib/abstract_controller.rb +1 -8
  17. data/lib/action_controller/base.rb +46 -22
  18. data/lib/action_controller/caching/fragments.rb +23 -53
  19. data/lib/action_controller/caching.rb +46 -33
  20. data/lib/action_controller/deprecated/integration_test.rb +3 -0
  21. data/lib/action_controller/deprecated.rb +5 -1
  22. data/lib/action_controller/log_subscriber.rb +16 -8
  23. data/lib/action_controller/metal/conditional_get.rb +76 -32
  24. data/lib/action_controller/metal/data_streaming.rb +20 -26
  25. data/lib/action_controller/metal/exceptions.rb +19 -6
  26. data/lib/action_controller/metal/flash.rb +24 -9
  27. data/lib/action_controller/metal/force_ssl.rb +70 -12
  28. data/lib/action_controller/metal/head.rb +25 -4
  29. data/lib/action_controller/metal/helpers.rb +5 -9
  30. data/lib/action_controller/metal/hide_actions.rb +0 -1
  31. data/lib/action_controller/metal/http_authentication.rb +107 -83
  32. data/lib/action_controller/metal/implicit_render.rb +1 -1
  33. data/lib/action_controller/metal/instrumentation.rb +2 -1
  34. data/lib/action_controller/metal/live.rb +175 -0
  35. data/lib/action_controller/metal/mime_responds.rb +161 -47
  36. data/lib/action_controller/metal/params_wrapper.rb +112 -74
  37. data/lib/action_controller/metal/rack_delegation.rb +9 -3
  38. data/lib/action_controller/metal/redirecting.rb +15 -20
  39. data/lib/action_controller/metal/renderers.rb +11 -9
  40. data/lib/action_controller/metal/rendering.rb +9 -1
  41. data/lib/action_controller/metal/request_forgery_protection.rb +112 -19
  42. data/lib/action_controller/metal/responder.rb +20 -19
  43. data/lib/action_controller/metal/streaming.rb +12 -18
  44. data/lib/action_controller/metal/strong_parameters.rb +520 -0
  45. data/lib/action_controller/metal/testing.rb +13 -18
  46. data/lib/action_controller/metal/url_for.rb +28 -25
  47. data/lib/action_controller/metal.rb +17 -32
  48. data/lib/action_controller/model_naming.rb +12 -0
  49. data/lib/action_controller/railtie.rb +33 -17
  50. data/lib/action_controller/railties/helpers.rb +22 -0
  51. data/lib/action_controller/record_identifier.rb +18 -72
  52. data/lib/action_controller/test_case.rb +251 -131
  53. data/lib/action_controller/vendor/html-scanner.rb +4 -19
  54. data/lib/action_controller.rb +15 -6
  55. data/lib/action_dispatch/http/cache.rb +63 -11
  56. data/lib/action_dispatch/http/filter_parameters.rb +18 -8
  57. data/lib/action_dispatch/http/filter_redirect.rb +37 -0
  58. data/lib/action_dispatch/http/headers.rb +49 -17
  59. data/lib/action_dispatch/http/mime_negotiation.rb +24 -1
  60. data/lib/action_dispatch/http/mime_type.rb +154 -100
  61. data/lib/action_dispatch/http/mime_types.rb +1 -1
  62. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  63. data/lib/action_dispatch/http/parameters.rb +28 -28
  64. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  65. data/lib/action_dispatch/http/request.rb +64 -18
  66. data/lib/action_dispatch/http/response.rb +130 -35
  67. data/lib/action_dispatch/http/upload.rb +63 -20
  68. data/lib/action_dispatch/http/url.rb +98 -35
  69. data/lib/action_dispatch/journey/backwards.rb +5 -0
  70. data/lib/action_dispatch/journey/formatter.rb +146 -0
  71. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  72. data/lib/action_dispatch/journey/gtg/simulator.rb +44 -0
  73. data/lib/action_dispatch/journey/gtg/transition_table.rb +156 -0
  74. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  75. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  76. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  77. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  78. data/lib/action_dispatch/journey/nodes/node.rb +124 -0
  79. data/lib/action_dispatch/journey/parser.rb +206 -0
  80. data/lib/action_dispatch/journey/parser.y +47 -0
  81. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  82. data/lib/action_dispatch/journey/path/pattern.rb +196 -0
  83. data/lib/action_dispatch/journey/route.rb +124 -0
  84. data/lib/action_dispatch/journey/router/strexp.rb +24 -0
  85. data/lib/action_dispatch/journey/router/utils.rb +54 -0
  86. data/lib/action_dispatch/journey/router.rb +166 -0
  87. data/lib/action_dispatch/journey/routes.rb +75 -0
  88. data/lib/action_dispatch/journey/scanner.rb +61 -0
  89. data/lib/action_dispatch/journey/visitors.rb +197 -0
  90. data/lib/action_dispatch/journey/visualizer/fsm.css +34 -0
  91. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  92. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  93. data/lib/action_dispatch/journey.rb +5 -0
  94. data/lib/action_dispatch/middleware/callbacks.rb +9 -4
  95. data/lib/action_dispatch/middleware/cookies.rb +259 -114
  96. data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
  97. data/lib/action_dispatch/middleware/exception_wrapper.rb +29 -3
  98. data/lib/action_dispatch/middleware/flash.rb +58 -58
  99. data/lib/action_dispatch/middleware/params_parser.rb +14 -29
  100. data/lib/action_dispatch/middleware/public_exceptions.rb +30 -14
  101. data/lib/action_dispatch/middleware/reloader.rb +6 -6
  102. data/lib/action_dispatch/middleware/remote_ip.rb +145 -39
  103. data/lib/action_dispatch/middleware/request_id.rb +2 -6
  104. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  105. data/lib/action_dispatch/middleware/session/cookie_store.rb +82 -28
  106. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  107. data/lib/action_dispatch/middleware/show_exceptions.rb +12 -45
  108. data/lib/action_dispatch/middleware/ssl.rb +70 -0
  109. data/lib/action_dispatch/middleware/stack.rb +6 -1
  110. data/lib/action_dispatch/middleware/static.rb +2 -1
  111. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +14 -11
  112. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +25 -0
  113. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +7 -9
  114. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
  115. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +127 -5
  116. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +7 -2
  117. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +30 -15
  118. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +39 -13
  119. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +6 -2
  120. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  121. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +144 -0
  122. data/lib/action_dispatch/railtie.rb +16 -6
  123. data/lib/action_dispatch/request/session.rb +181 -0
  124. data/lib/action_dispatch/routing/inspector.rb +240 -0
  125. data/lib/action_dispatch/routing/mapper.rb +540 -291
  126. data/lib/action_dispatch/routing/polymorphic_routes.rb +16 -20
  127. data/lib/action_dispatch/routing/redirection.rb +46 -29
  128. data/lib/action_dispatch/routing/route_set.rb +207 -164
  129. data/lib/action_dispatch/routing/routes_proxy.rb +2 -0
  130. data/lib/action_dispatch/routing/url_for.rb +48 -33
  131. data/lib/action_dispatch/routing.rb +48 -83
  132. data/lib/action_dispatch/testing/assertions/dom.rb +3 -13
  133. data/lib/action_dispatch/testing/assertions/response.rb +32 -40
  134. data/lib/action_dispatch/testing/assertions/routing.rb +42 -41
  135. data/lib/action_dispatch/testing/assertions/selector.rb +17 -22
  136. data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
  137. data/lib/action_dispatch/testing/integration.rb +65 -51
  138. data/lib/action_dispatch/testing/test_process.rb +9 -6
  139. data/lib/action_dispatch/testing/test_request.rb +7 -3
  140. data/lib/action_dispatch.rb +21 -15
  141. data/lib/action_pack/version.rb +7 -6
  142. data/lib/action_pack.rb +1 -1
  143. data/lib/action_view/base.rb +15 -34
  144. data/lib/action_view/buffers.rb +7 -1
  145. data/lib/action_view/context.rb +4 -4
  146. data/lib/action_view/dependency_tracker.rb +93 -0
  147. data/lib/action_view/digestor.rb +85 -0
  148. data/lib/action_view/flows.rb +1 -4
  149. data/lib/action_view/helpers/active_model_helper.rb +3 -4
  150. data/lib/action_view/helpers/asset_tag_helper.rb +215 -352
  151. data/lib/action_view/helpers/asset_url_helper.rb +355 -0
  152. data/lib/action_view/helpers/atom_feed_helper.rb +13 -10
  153. data/lib/action_view/helpers/cache_helper.rb +150 -18
  154. data/lib/action_view/helpers/capture_helper.rb +44 -31
  155. data/lib/action_view/helpers/csrf_helper.rb +0 -2
  156. data/lib/action_view/helpers/date_helper.rb +269 -248
  157. data/lib/action_view/helpers/debug_helper.rb +10 -11
  158. data/lib/action_view/helpers/form_helper.rb +931 -537
  159. data/lib/action_view/helpers/form_options_helper.rb +341 -166
  160. data/lib/action_view/helpers/form_tag_helper.rb +190 -90
  161. data/lib/action_view/helpers/javascript_helper.rb +23 -16
  162. data/lib/action_view/helpers/number_helper.rb +148 -329
  163. data/lib/action_view/helpers/output_safety_helper.rb +3 -3
  164. data/lib/action_view/helpers/record_tag_helper.rb +17 -22
  165. data/lib/action_view/helpers/rendering_helper.rb +2 -2
  166. data/lib/action_view/helpers/sanitize_helper.rb +3 -6
  167. data/lib/action_view/helpers/tag_helper.rb +46 -33
  168. data/lib/action_view/helpers/tags/base.rb +147 -0
  169. data/lib/action_view/helpers/tags/check_box.rb +64 -0
  170. data/lib/action_view/helpers/tags/checkable.rb +16 -0
  171. data/lib/action_view/helpers/tags/collection_check_boxes.rb +43 -0
  172. data/lib/action_view/helpers/tags/collection_helpers.rb +83 -0
  173. data/lib/action_view/helpers/tags/collection_radio_buttons.rb +36 -0
  174. data/lib/action_view/helpers/tags/collection_select.rb +28 -0
  175. data/lib/action_view/helpers/tags/color_field.rb +25 -0
  176. data/lib/action_view/helpers/tags/date_field.rb +13 -0
  177. data/lib/action_view/helpers/tags/date_select.rb +72 -0
  178. data/lib/action_view/helpers/tags/datetime_field.rb +22 -0
  179. data/lib/action_view/helpers/tags/datetime_local_field.rb +19 -0
  180. data/lib/action_view/helpers/tags/datetime_select.rb +8 -0
  181. data/lib/action_view/helpers/tags/email_field.rb +8 -0
  182. data/lib/action_view/helpers/tags/file_field.rb +8 -0
  183. data/lib/action_view/helpers/tags/grouped_collection_select.rb +29 -0
  184. data/lib/action_view/helpers/tags/hidden_field.rb +8 -0
  185. data/lib/action_view/helpers/tags/label.rb +65 -0
  186. data/lib/action_view/helpers/tags/month_field.rb +13 -0
  187. data/lib/action_view/helpers/tags/number_field.rb +18 -0
  188. data/lib/action_view/helpers/tags/password_field.rb +12 -0
  189. data/lib/action_view/helpers/tags/radio_button.rb +31 -0
  190. data/lib/action_view/helpers/tags/range_field.rb +8 -0
  191. data/lib/action_view/helpers/tags/search_field.rb +24 -0
  192. data/lib/action_view/helpers/tags/select.rb +40 -0
  193. data/lib/action_view/helpers/tags/tel_field.rb +8 -0
  194. data/lib/action_view/helpers/tags/text_area.rb +18 -0
  195. data/lib/action_view/helpers/tags/text_field.rb +29 -0
  196. data/lib/action_view/helpers/tags/time_field.rb +13 -0
  197. data/lib/action_view/helpers/tags/time_select.rb +8 -0
  198. data/lib/action_view/helpers/tags/time_zone_select.rb +20 -0
  199. data/lib/action_view/helpers/tags/url_field.rb +8 -0
  200. data/lib/action_view/helpers/tags/week_field.rb +13 -0
  201. data/lib/action_view/helpers/tags.rb +39 -0
  202. data/lib/action_view/helpers/text_helper.rb +130 -114
  203. data/lib/action_view/helpers/translation_helper.rb +32 -16
  204. data/lib/action_view/helpers/url_helper.rb +211 -270
  205. data/lib/action_view/helpers.rb +2 -4
  206. data/lib/action_view/locale/en.yml +1 -105
  207. data/lib/action_view/log_subscriber.rb +6 -4
  208. data/lib/action_view/lookup_context.rb +15 -28
  209. data/lib/action_view/model_naming.rb +12 -0
  210. data/lib/action_view/path_set.rb +8 -20
  211. data/lib/action_view/railtie.rb +6 -22
  212. data/lib/action_view/record_identifier.rb +84 -0
  213. data/lib/action_view/renderer/abstract_renderer.rb +25 -19
  214. data/lib/action_view/renderer/partial_renderer.rb +158 -81
  215. data/lib/action_view/renderer/renderer.rb +8 -12
  216. data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
  217. data/lib/action_view/renderer/template_renderer.rb +12 -10
  218. data/lib/action_view/routing_url_for.rb +107 -0
  219. data/lib/action_view/template/error.rb +22 -12
  220. data/lib/action_view/template/handlers/builder.rb +1 -1
  221. data/lib/action_view/template/handlers/erb.rb +40 -19
  222. data/lib/action_view/template/handlers/raw.rb +11 -0
  223. data/lib/action_view/template/handlers.rb +12 -9
  224. data/lib/action_view/template/resolver.rb +107 -53
  225. data/lib/action_view/template/text.rb +12 -8
  226. data/lib/action_view/template/types.rb +57 -0
  227. data/lib/action_view/template.rb +25 -23
  228. data/lib/action_view/test_case.rb +67 -42
  229. data/lib/{action_controller → action_view}/vendor/html-scanner/html/document.rb +0 -0
  230. data/lib/{action_controller → action_view}/vendor/html-scanner/html/node.rb +12 -12
  231. data/lib/{action_controller → action_view}/vendor/html-scanner/html/sanitizer.rb +13 -2
  232. data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +9 -9
  233. data/lib/{action_controller → action_view}/vendor/html-scanner/html/tokenizer.rb +1 -1
  234. data/lib/{action_controller → action_view}/vendor/html-scanner/html/version.rb +0 -0
  235. data/lib/action_view/vendor/html-scanner.rb +20 -0
  236. data/lib/action_view.rb +17 -8
  237. metadata +184 -214
  238. data/lib/action_controller/caching/actions.rb +0 -185
  239. data/lib/action_controller/caching/pages.rb +0 -187
  240. data/lib/action_controller/caching/sweeping.rb +0 -97
  241. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  242. data/lib/action_controller/metal/compatibility.rb +0 -65
  243. data/lib/action_controller/metal/session_management.rb +0 -14
  244. data/lib/action_controller/railties/paths.rb +0 -25
  245. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  246. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  247. data/lib/action_dispatch/middleware/head.rb +0 -18
  248. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  249. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  250. data/lib/action_view/asset_paths.rb +0 -142
  251. data/lib/action_view/helpers/asset_paths.rb +0 -7
  252. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  253. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  254. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  255. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  256. data/lib/sprockets/assets.rake +0 -99
  257. data/lib/sprockets/bootstrap.rb +0 -37
  258. data/lib/sprockets/compressors.rb +0 -83
  259. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  260. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  261. data/lib/sprockets/helpers.rb +0 -6
  262. data/lib/sprockets/railtie.rb +0 -62
  263. data/lib/sprockets/static_compiler.rb +0 -56
@@ -4,7 +4,11 @@
4
4
  <meta charset="utf-8" />
5
5
  <title>Action Controller: Exception caught</title>
6
6
  <style>
7
- body { background-color: #fff; color: #333; }
7
+ body {
8
+ background-color: #FAFAFA;
9
+ color: #333;
10
+ margin: 0px;
11
+ }
8
12
 
9
13
  body, p, ol, ul, td {
10
14
  font-family: helvetica, verdana, arial, sans-serif;
@@ -13,16 +17,134 @@
13
17
  }
14
18
 
15
19
  pre {
16
- background-color: #eee;
17
- padding: 10px;
18
20
  font-size: 11px;
19
21
  white-space: pre-wrap;
20
22
  }
21
23
 
22
- a { color: #000; }
24
+ pre.box {
25
+ border: 1px solid #EEE;
26
+ padding: 10px;
27
+ margin: 0px;
28
+ width: 958px;
29
+ }
30
+
31
+ header {
32
+ color: #F0F0F0;
33
+ background: #C52F24;
34
+ padding: 0.5em 1.5em;
35
+ }
36
+
37
+ h1 {
38
+ margin: 0.2em 0;
39
+ line-height: 1.1em;
40
+ font-size: 2em;
41
+ }
42
+
43
+ h2 {
44
+ color: #C52F24;
45
+ line-height: 25px;
46
+ }
47
+
48
+ .details {
49
+ border: 1px solid #D0D0D0;
50
+ border-radius: 4px;
51
+ margin: 1em 0px;
52
+ display: block;
53
+ width: 978px;
54
+ }
55
+
56
+ .summary {
57
+ padding: 8px 15px;
58
+ border-bottom: 1px solid #D0D0D0;
59
+ display: block;
60
+ }
61
+
62
+ .details pre {
63
+ margin: 5px;
64
+ border: none;
65
+ }
66
+
67
+ #container {
68
+ box-sizing: border-box;
69
+ width: 100%;
70
+ padding: 0 1.5em;
71
+ }
72
+
73
+ .source * {
74
+ margin: 0px;
75
+ padding: 0px;
76
+ }
77
+
78
+ .source {
79
+ border: 1px solid #D9D9D9;
80
+ background: #ECECEC;
81
+ width: 978px;
82
+ }
83
+
84
+ .source pre {
85
+ padding: 10px 0px;
86
+ border: none;
87
+ }
88
+
89
+ .source .data {
90
+ font-size: 80%;
91
+ overflow: auto;
92
+ background-color: #FFF;
93
+ }
94
+
95
+ .info {
96
+ padding: 0.5em;
97
+ }
98
+
99
+ .source .data .line_numbers {
100
+ background-color: #ECECEC;
101
+ color: #AAA;
102
+ padding: 1em .5em;
103
+ border-right: 1px solid #DDD;
104
+ text-align: right;
105
+ }
106
+
107
+ .line {
108
+ padding-left: 10px;
109
+ }
110
+
111
+ .line:hover {
112
+ background-color: #F6F6F6;
113
+ }
114
+
115
+ .line.active {
116
+ background-color: #FFCCCC;
117
+ }
118
+
119
+ a { color: #980905; }
23
120
  a:visited { color: #666; }
24
- a:hover { color: #fff; background-color:#000; }
121
+ a:hover { color: #C52F24; }
122
+
123
+ <%= yield :style %>
25
124
  </style>
125
+
126
+ <script>
127
+ var toggle = function(id) {
128
+ var s = document.getElementById(id).style;
129
+ s.display = s.display == 'none' ? 'block' : 'none';
130
+ return false;
131
+ }
132
+ var show = function(id) {
133
+ document.getElementById(id).style.display = 'block';
134
+ }
135
+ var hide = function(id) {
136
+ document.getElementById(id).style.display = 'none';
137
+ }
138
+ var toggleTrace = function() {
139
+ return toggle('blame_trace');
140
+ }
141
+ var toggleSessionDump = function() {
142
+ return toggle('session_dump');
143
+ }
144
+ var toggleEnvDump = function() {
145
+ return toggle('env_dump');
146
+ }
147
+ </script>
26
148
  </head>
27
149
  <body>
28
150
 
@@ -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.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
+ </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"].camelize 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