roda 3.28.0 → 3.29.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 (188) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +10 -0
  3. data/README.rdoc +10 -0
  4. data/doc/release_notes/3.29.0.txt +15 -0
  5. data/lib/roda.rb +1 -0
  6. data/lib/roda/plugins/caching.rb +2 -0
  7. data/lib/roda/plugins/common_logger.rb +1 -1
  8. data/lib/roda/plugins/exception_page.rb +7 -1
  9. data/lib/roda/plugins/indifferent_params.rb +2 -0
  10. data/lib/roda/version.rb +1 -1
  11. metadata +4 -214
  12. data/Rakefile +0 -108
  13. data/doc/release_notes/1.0.0.txt +0 -329
  14. data/doc/release_notes/1.1.0.txt +0 -226
  15. data/doc/release_notes/1.2.0.txt +0 -406
  16. data/doc/release_notes/1.3.0.txt +0 -109
  17. data/doc/release_notes/2.0.0.txt +0 -75
  18. data/doc/release_notes/2.1.0.txt +0 -124
  19. data/doc/release_notes/2.10.0.txt +0 -27
  20. data/doc/release_notes/2.11.0.txt +0 -70
  21. data/doc/release_notes/2.12.0.txt +0 -40
  22. data/doc/release_notes/2.13.0.txt +0 -10
  23. data/doc/release_notes/2.14.0.txt +0 -44
  24. data/doc/release_notes/2.15.0.txt +0 -53
  25. data/doc/release_notes/2.16.0.txt +0 -48
  26. data/doc/release_notes/2.17.0.txt +0 -62
  27. data/doc/release_notes/2.18.0.txt +0 -69
  28. data/doc/release_notes/2.19.0.txt +0 -30
  29. data/doc/release_notes/2.2.0.txt +0 -97
  30. data/doc/release_notes/2.20.0.txt +0 -5
  31. data/doc/release_notes/2.21.0.txt +0 -17
  32. data/doc/release_notes/2.22.0.txt +0 -41
  33. data/doc/release_notes/2.23.0.txt +0 -29
  34. data/doc/release_notes/2.24.0.txt +0 -65
  35. data/doc/release_notes/2.25.0.txt +0 -14
  36. data/doc/release_notes/2.26.0.txt +0 -13
  37. data/doc/release_notes/2.27.0.txt +0 -56
  38. data/doc/release_notes/2.28.0.txt +0 -17
  39. data/doc/release_notes/2.29.0.txt +0 -156
  40. data/doc/release_notes/2.3.0.txt +0 -109
  41. data/doc/release_notes/2.4.0.txt +0 -55
  42. data/doc/release_notes/2.5.0.txt +0 -23
  43. data/doc/release_notes/2.5.1.txt +0 -4
  44. data/doc/release_notes/2.6.0.txt +0 -21
  45. data/doc/release_notes/2.7.0.txt +0 -75
  46. data/doc/release_notes/2.8.0.txt +0 -44
  47. data/doc/release_notes/2.9.0.txt +0 -6
  48. data/spec/all.rb +0 -1
  49. data/spec/assets/css/app.scss +0 -1
  50. data/spec/assets/css/no_access.css +0 -1
  51. data/spec/assets/css/raw.css +0 -1
  52. data/spec/assets/js/head/app.js +0 -1
  53. data/spec/composition_spec.rb +0 -31
  54. data/spec/define_roda_method_spec.rb +0 -274
  55. data/spec/env_spec.rb +0 -11
  56. data/spec/freeze_spec.rb +0 -37
  57. data/spec/integration_spec.rb +0 -209
  58. data/spec/matchers_spec.rb +0 -832
  59. data/spec/opts_spec.rb +0 -42
  60. data/spec/plugin/_after_hook_spec.rb +0 -19
  61. data/spec/plugin/all_verbs_spec.rb +0 -29
  62. data/spec/plugin/assets_preloading_spec.rb +0 -98
  63. data/spec/plugin/assets_spec.rb +0 -745
  64. data/spec/plugin/backtracking_array_spec.rb +0 -42
  65. data/spec/plugin/branch_locals_spec.rb +0 -106
  66. data/spec/plugin/caching_spec.rb +0 -337
  67. data/spec/plugin/chunked_spec.rb +0 -201
  68. data/spec/plugin/class_level_routing_spec.rb +0 -164
  69. data/spec/plugin/class_matchers_spec.rb +0 -40
  70. data/spec/plugin/common_logger_spec.rb +0 -85
  71. data/spec/plugin/content_for_spec.rb +0 -162
  72. data/spec/plugin/content_security_policy_spec.rb +0 -175
  73. data/spec/plugin/cookies_spec.rb +0 -51
  74. data/spec/plugin/csrf_spec.rb +0 -111
  75. data/spec/plugin/default_headers_spec.rb +0 -82
  76. data/spec/plugin/default_status_spec.rb +0 -95
  77. data/spec/plugin/delay_build_spec.rb +0 -23
  78. data/spec/plugin/delegate_spec.rb +0 -23
  79. data/spec/plugin/delete_empty_headers_spec.rb +0 -27
  80. data/spec/plugin/direct_call_spec.rb +0 -28
  81. data/spec/plugin/disallow_file_uploads_spec.rb +0 -25
  82. data/spec/plugin/drop_body_spec.rb +0 -24
  83. data/spec/plugin/early_hints_spec.rb +0 -19
  84. data/spec/plugin/empty_root_spec.rb +0 -14
  85. data/spec/plugin/environments_spec.rb +0 -42
  86. data/spec/plugin/error_email_spec.rb +0 -97
  87. data/spec/plugin/error_handler_spec.rb +0 -216
  88. data/spec/plugin/error_mail_spec.rb +0 -93
  89. data/spec/plugin/exception_page_spec.rb +0 -168
  90. data/spec/plugin/flash_spec.rb +0 -121
  91. data/spec/plugin/h_spec.rb +0 -11
  92. data/spec/plugin/halt_spec.rb +0 -119
  93. data/spec/plugin/hash_matcher_spec.rb +0 -27
  94. data/spec/plugin/hash_routes_spec.rb +0 -535
  95. data/spec/plugin/head_spec.rb +0 -52
  96. data/spec/plugin/header_matchers_spec.rb +0 -98
  97. data/spec/plugin/heartbeat_spec.rb +0 -74
  98. data/spec/plugin/hooks_spec.rb +0 -152
  99. data/spec/plugin/indifferent_params_spec.rb +0 -14
  100. data/spec/plugin/json_parser_spec.rb +0 -141
  101. data/spec/plugin/json_spec.rb +0 -83
  102. data/spec/plugin/mail_processor_spec.rb +0 -451
  103. data/spec/plugin/mailer_spec.rb +0 -282
  104. data/spec/plugin/match_affix_spec.rb +0 -43
  105. data/spec/plugin/match_hook_spec.rb +0 -79
  106. data/spec/plugin/middleware_spec.rb +0 -237
  107. data/spec/plugin/middleware_stack_spec.rb +0 -81
  108. data/spec/plugin/module_include_spec.rb +0 -48
  109. data/spec/plugin/multi_route_spec.rb +0 -268
  110. data/spec/plugin/multi_run_spec.rb +0 -87
  111. data/spec/plugin/multi_view_spec.rb +0 -50
  112. data/spec/plugin/multibyte_string_matcher_spec.rb +0 -44
  113. data/spec/plugin/named_templates_spec.rb +0 -96
  114. data/spec/plugin/not_allowed_spec.rb +0 -69
  115. data/spec/plugin/not_found_spec.rb +0 -128
  116. data/spec/plugin/optimized_string_matchers_spec.rb +0 -43
  117. data/spec/plugin/padrino_render_spec.rb +0 -34
  118. data/spec/plugin/param_matchers_spec.rb +0 -69
  119. data/spec/plugin/params_capturing_spec.rb +0 -33
  120. data/spec/plugin/partials_spec.rb +0 -43
  121. data/spec/plugin/pass_spec.rb +0 -29
  122. data/spec/plugin/path_matchers_spec.rb +0 -42
  123. data/spec/plugin/path_rewriter_spec.rb +0 -45
  124. data/spec/plugin/path_spec.rb +0 -222
  125. data/spec/plugin/placeholder_string_matchers_spec.rb +0 -126
  126. data/spec/plugin/precompile_templates_spec.rb +0 -61
  127. data/spec/plugin/public_spec.rb +0 -85
  128. data/spec/plugin/render_each_spec.rb +0 -82
  129. data/spec/plugin/render_locals_spec.rb +0 -114
  130. data/spec/plugin/render_spec.rb +0 -912
  131. data/spec/plugin/request_aref_spec.rb +0 -51
  132. data/spec/plugin/request_headers_spec.rb +0 -39
  133. data/spec/plugin/response_request_spec.rb +0 -43
  134. data/spec/plugin/route_block_args_spec.rb +0 -86
  135. data/spec/plugin/route_csrf_spec.rb +0 -305
  136. data/spec/plugin/run_append_slash_spec.rb +0 -77
  137. data/spec/plugin/run_handler_spec.rb +0 -53
  138. data/spec/plugin/sessions_spec.rb +0 -452
  139. data/spec/plugin/shared_vars_spec.rb +0 -45
  140. data/spec/plugin/sinatra_helpers_spec.rb +0 -537
  141. data/spec/plugin/slash_path_empty_spec.rb +0 -22
  142. data/spec/plugin/static_routing_spec.rb +0 -192
  143. data/spec/plugin/static_spec.rb +0 -30
  144. data/spec/plugin/status_303_spec.rb +0 -28
  145. data/spec/plugin/status_handler_spec.rb +0 -158
  146. data/spec/plugin/streaming_spec.rb +0 -246
  147. data/spec/plugin/strip_path_prefix_spec.rb +0 -24
  148. data/spec/plugin/symbol_matchers_spec.rb +0 -51
  149. data/spec/plugin/symbol_status_spec.rb +0 -25
  150. data/spec/plugin/symbol_views_spec.rb +0 -32
  151. data/spec/plugin/timestamp_public_spec.rb +0 -85
  152. data/spec/plugin/type_routing_spec.rb +0 -348
  153. data/spec/plugin/typecast_params_spec.rb +0 -1370
  154. data/spec/plugin/unescape_path_spec.rb +0 -22
  155. data/spec/plugin/view_options_spec.rb +0 -170
  156. data/spec/plugin_spec.rb +0 -71
  157. data/spec/redirect_spec.rb +0 -41
  158. data/spec/request_spec.rb +0 -97
  159. data/spec/response_spec.rb +0 -199
  160. data/spec/route_spec.rb +0 -39
  161. data/spec/session_middleware_spec.rb +0 -129
  162. data/spec/session_spec.rb +0 -37
  163. data/spec/spec_helper.rb +0 -137
  164. data/spec/version_spec.rb +0 -14
  165. data/spec/views/_test.erb +0 -1
  166. data/spec/views/a.erb +0 -1
  167. data/spec/views/a.rdoc +0 -2
  168. data/spec/views/about.erb +0 -1
  169. data/spec/views/about.str +0 -1
  170. data/spec/views/about/_test.css.gz +0 -0
  171. data/spec/views/about/_test.erb +0 -1
  172. data/spec/views/about/_test.erb.gz +0 -0
  173. data/spec/views/about/comp_test.erb +0 -1
  174. data/spec/views/b.erb +0 -1
  175. data/spec/views/c.erb +0 -1
  176. data/spec/views/comp_layout.erb +0 -1
  177. data/spec/views/comp_test.erb +0 -1
  178. data/spec/views/content-yield.erb +0 -1
  179. data/spec/views/each.str +0 -1
  180. data/spec/views/home.erb +0 -2
  181. data/spec/views/home.str +0 -2
  182. data/spec/views/iv.erb +0 -1
  183. data/spec/views/layout-alternative.erb +0 -2
  184. data/spec/views/layout-yield.erb +0 -3
  185. data/spec/views/layout.erb +0 -2
  186. data/spec/views/layout.str +0 -2
  187. data/spec/views/multiple-layout.erb +0 -1
  188. data/spec/views/multiple.erb +0 -1
@@ -1,162 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- begin
4
- require 'tilt/erb'
5
- rescue LoadError
6
- warn "tilt not installed, skipping content_for plugin test"
7
- else
8
- describe "content_for plugin with erb" do
9
- before do
10
- app(:bare) do
11
- plugin :render, :views => './spec/views'
12
- plugin :content_for
13
-
14
- route do |r|
15
- r.root do
16
- view(:inline => "<% content_for :foo do %>foo<% end %>bar", :layout => { :inline => '<%= yield %> <%= content_for(:foo) %>' })
17
- end
18
- r.get 'a' do
19
- view(:inline => "bar", :layout => { :inline => '<%= content_for(:foo) %> <%= yield %>' })
20
- end
21
- r.get 'b' do
22
- view(:inline => '<% content_for(:foo, "foo") %>bar', :layout => { :inline => '<%= yield %> <%= content_for(:foo) %>' })
23
- end
24
- r.get 'e' do
25
- view(:inline => 'a<% content_for :foo do %><% end %>b', :layout => { :inline => 'c<%= yield %>d<%= content_for(:foo) %>e' })
26
- end
27
- r.get 'f' do
28
- view(:inline => 'a<% content_for :foo do "f" end %>b', :layout => { :inline => 'c<%= yield %>d<%= content_for(:foo) %>e' })
29
- end
30
- r.get 'g' do
31
- view(:inline => 'a<% content_for :foo do "<" + "%= 1 %" + ">" end %>b', :layout => { :inline => 'c<%= yield %>d<%= content_for(:foo) %>e' })
32
- end
33
- end
34
- end
35
- end
36
-
37
- it "should be able to set content in template and get that content in the layout" do
38
- body.strip.must_equal "bar foo"
39
- end
40
-
41
- it "should work if content is not set by the template" do
42
- body('/a').strip.must_equal "bar"
43
- end
44
-
45
- it "should work if a raw string is set" do
46
- body('/b').strip.must_equal "bar foo"
47
- end
48
-
49
- it "should work for an empty content_for" do
50
- body('/e').strip.must_equal "cabde"
51
- end
52
-
53
- it "should work when content_for uses a regular block" do
54
- body('/f').strip.must_equal "cabdfe"
55
- end
56
-
57
- it "should use content_for output directly" do
58
- body('/g').strip.must_equal "cabd<%= 1 %>e"
59
- end
60
- end
61
-
62
- describe "content_for plugin with multiple calls to the same key" do
63
- before do
64
- app(:bare) do
65
- plugin :render, :views => './spec/views'
66
- plugin :content_for
67
-
68
- route do |r|
69
- r.root do
70
- view(:inline => "<% content_for :foo do %>foo<% end %><% content_for :foo do %>baz<% end %>bar", :layout => { :inline => '<%= yield %> <%= content_for(:foo) %>' })
71
- end
72
- end
73
- end
74
- end
75
-
76
- it "should replace with multiple calls to the same key if :append=>false plugin option is used" do
77
- app.plugin :content_for, :append => false
78
- body.strip.must_equal "bar baz"
79
- end
80
-
81
- it "should append with multiple calls to the same key if :append=>true plugin option is used" do
82
- app.plugin :content_for
83
- body.strip.must_equal "bar foobaz"
84
- end
85
- end
86
- end
87
-
88
- begin
89
- require 'tilt/erb'
90
- require 'tilt/haml'
91
- rescue LoadError
92
- warn "tilt or haml not installed, skipping content_for plugin haml tests"
93
- else
94
- describe "content_for plugin with haml" do
95
- before do
96
- app(:bare) do
97
- plugin :render, :engine => 'haml'
98
- plugin :content_for
99
-
100
- route do |r|
101
- r.root do
102
- view(:inline => "- content_for :foo do\n - capture_haml do\n foo\nbar", :layout => { :inline => "= yield\n=content_for :foo" })
103
- end
104
- r.get 'a' do
105
- view(:inline => "- content_for :foo, 'foo'\nbar", :layout => { :inline => "= yield\n=content_for :foo" })
106
- end
107
- end
108
- end
109
- end
110
-
111
- it "should work with alternate rendering engines" do
112
- body.strip.sub(/\n+/, "\n").must_equal "bar\nfoo"
113
- body('/a').strip.sub(/\n+/, "\n").must_equal "bar\nfoo"
114
- end
115
- end
116
-
117
- describe "content_for plugin with mixed template engines" do
118
- before do
119
- app(:bare) do
120
- plugin :render, :layout_opts=>{:engine => 'haml', :inline => "= yield\n=content_for :foo" }
121
- plugin :content_for
122
-
123
- route do |r|
124
- r.root do
125
- view(:inline => "<% content_for :foo do %>foo<% end %>bar")
126
- end
127
- r.get 'a' do
128
- view(:inline => "<% content_for :foo, 'foo' %>bar")
129
- end
130
- end
131
- end
132
- end
133
-
134
- it "should work with alternate rendering engines" do
135
- body.strip.must_equal "bar\nfoo"
136
- body('/a').strip.must_equal "bar\nfoo"
137
- end
138
- end
139
-
140
- describe "content_for plugin when overriding :engine" do
141
- before do
142
- app(:bare) do
143
- plugin :render, :engine => 'haml', :layout_opts=>{:inline => "= yield\n=content_for :foo" }
144
- plugin :content_for
145
-
146
- route do |r|
147
- r.root do
148
- view(:inline => "<% content_for :foo do %>foo<% end %>bar", :engine=>:erb)
149
- end
150
- r.get 'a' do
151
- view(:inline => "<% content_for :foo, 'foo' %>bar", :engine=>:erb)
152
- end
153
- end
154
- end
155
- end
156
-
157
- it "should work with alternate rendering engines" do
158
- body.strip.must_equal "bar\nfoo"
159
- body('/a').strip.must_equal "bar\nfoo"
160
- end
161
- end
162
- end
@@ -1,175 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- describe "content_security_policy plugin" do
4
- it "does not add header if no options are set" do
5
- app(:content_security_policy){'a'}
6
- header('Content-Security-Policy', "/a").must_be_nil
7
- end
8
-
9
- it "sets Content-Security-Policy header" do
10
- app(:bare) do
11
- plugin :content_security_policy do |csp|
12
- csp.default_src :self
13
- csp.img_src :self, 'example.com'
14
- csp.style_src [:sha256, 'abc']
15
- end
16
-
17
- route do |r|
18
- r.get 'ro' do
19
- content_security_policy.report_only
20
- ''
21
- end
22
-
23
- r.get 'nro' do
24
- content_security_policy.report_only
25
- content_security_policy.report_only(false)
26
- content_security_policy.report_only?.inspect
27
- end
28
-
29
- r.get 'get' do
30
- content_security_policy.get_default_src.inspect
31
- end
32
-
33
- r.get 'add' do
34
- content_security_policy.add_default_src('foo.com', 'bar.com')
35
- ''
36
- end
37
-
38
- r.get 'empty' do
39
- content_security_policy.add_default_src
40
- ''
41
- end
42
-
43
- r.get 'set' do
44
- content_security_policy.default_src('foo.com', 'bar.com')
45
- ''
46
- end
47
-
48
- r.get 'bool' do
49
- content_security_policy.block_all_mixed_content
50
- content_security_policy.upgrade_insecure_requests(false)
51
- content_security_policy.block_all_mixed_content?.inspect
52
- end
53
-
54
- r.get 'block' do
55
- content_security_policy do |csp|
56
- csp.block_all_mixed_content
57
- csp.add_default_src('foo.com', 'bar.com')
58
- csp.img_src :none
59
- csp.style_src
60
- csp.report_only
61
- end
62
- ''
63
- end
64
-
65
- r.get 'clear' do
66
- content_security_policy do |csp|
67
- csp.clear
68
- csp.add_default_src('foo.com', 'bar.com')
69
- end
70
- ''
71
- end
72
-
73
- 'a'
74
- end
75
- end
76
-
77
- v = "default-src 'self'; img-src 'self' example.com; style-src 'sha256-abc'; "
78
-
79
- header('Content-Security-Policy', "/a").must_equal v
80
-
81
- header('Content-Security-Policy', "/nro").must_equal v
82
- header('Content-Security-Policy-Report-Only', "/nro").must_be_nil
83
- body("/nro").must_equal 'false'
84
-
85
- header('Content-Security-Policy-Report-Only', "/ro").must_equal v
86
- header('Content-Security-Policy', "/ro").must_be_nil
87
-
88
- body('/get').must_equal '[:self]'
89
-
90
- header('Content-Security-Policy', "/add").must_equal "default-src 'self' foo.com bar.com; img-src 'self' example.com; style-src 'sha256-abc'; "
91
-
92
- header('Content-Security-Policy', "/empty").must_equal "default-src 'self'; img-src 'self' example.com; style-src 'sha256-abc'; "
93
-
94
- header('Content-Security-Policy', "/set").must_equal "default-src foo.com bar.com; img-src 'self' example.com; style-src 'sha256-abc'; "
95
-
96
- body('/bool').must_equal 'true'
97
- header('Content-Security-Policy', "/bool").must_equal "default-src 'self'; img-src 'self' example.com; style-src 'sha256-abc'; block-all-mixed-content; "
98
-
99
- header('Content-Security-Policy-Report-Only', "/block").must_equal "default-src 'self' foo.com bar.com; img-src 'none'; block-all-mixed-content; "
100
-
101
- header('Content-Security-Policy', "/clear").must_equal "default-src foo.com bar.com; "
102
- end
103
-
104
- it "raises error for unsupported CSP values" do
105
- app{}
106
- proc{app.plugin(:content_security_policy){|csp| csp.default_src Object.new}}.must_raise Roda::RodaError
107
- proc{app.plugin(:content_security_policy){|csp| csp.default_src []}}.must_raise Roda::RodaError
108
- proc{app.plugin(:content_security_policy){|csp| csp.default_src [:a]}}.must_raise Roda::RodaError
109
- proc{app.plugin(:content_security_policy){|csp| csp.default_src [:a, :b, :c]}}.must_raise Roda::RodaError
110
- end
111
-
112
- it "supports all documented settings" do
113
- app(:content_security_policy) do |r|
114
- content_security_policy.send(r.path[1..-1], :self)
115
- end
116
-
117
- '
118
- base_uri
119
- child_src
120
- connect_src
121
- default_src
122
- font_src
123
- form_action
124
- frame_ancestors
125
- frame_src
126
- img_src
127
- manifest_src
128
- media_src
129
- object_src
130
- plugin_types
131
- report_uri
132
- require_sri_for
133
- sandbox
134
- script_src
135
- style_src
136
- worker_src
137
- '.split.each do |setting|
138
- header('Content-Security-Policy', "/#{setting}").must_equal "#{setting.gsub('_', '-')} 'self'; "
139
- end
140
- end
141
-
142
- it "does not override existing heading" do
143
- app(:content_security_policy) do |r|
144
- content_security_policy.default_src :self
145
- response['Content-Security-Policy'] = "default_src 'none';"
146
- ''
147
- end
148
- header('Content-Security-Policy').must_equal "default_src 'none';"
149
- end
150
-
151
- it "works with error_handler" do
152
- app(:bare) do
153
- plugin(:error_handler){|_| ''}
154
- plugin :content_security_policy do |csp|
155
- csp.default_src :self
156
- csp.img_src :self, 'example.com'
157
- csp.style_src [:sha256, 'abc']
158
- end
159
-
160
- route do |r|
161
- r.get 'a' do
162
- content_security_policy.default_src 'foo.com'
163
- raise
164
- end
165
-
166
- raise
167
- end
168
- end
169
-
170
- header('Content-Security-Policy').must_equal "default-src 'self'; img-src 'self' example.com; style-src 'sha256-abc'; "
171
-
172
- # Don't include updates before the error
173
- header('Content-Security-Policy', '/a').must_equal "default-src 'self'; img-src 'self' example.com; style-src 'sha256-abc'; "
174
- end
175
- end
@@ -1,51 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- describe "cookies plugin" do
4
- it "should set cookies on response" do
5
- app(:cookies) do |r|
6
- response.set_cookie("foo", "bar")
7
- response.set_cookie("bar", "baz")
8
- "Hello"
9
- end
10
-
11
- header('Set-Cookie').must_equal "foo=bar\nbar=baz"
12
- body.must_equal 'Hello'
13
- end
14
-
15
- it "should delete cookies on response" do
16
- app(:cookies) do |r|
17
- response.set_cookie("foo", "bar")
18
- response.delete_cookie("foo")
19
- "Hello"
20
- end
21
-
22
- header('Set-Cookie').must_match(/foo=; (max-age=0; )?expires=Thu, 01[ -]Jan[ -]1970 00:00:00 (-0000|GMT)/)
23
- body.must_equal 'Hello'
24
- end
25
-
26
- it "should pass default cookie options when setting" do
27
- app.plugin :cookies, :path => '/foo'
28
- app.route { response.set_cookie("foo", "bar") }
29
- header('Set-Cookie').must_equal "foo=bar; path=/foo"
30
-
31
- app.route { response.set_cookie("foo", :value=>"bar", :path=>'/baz') }
32
- header('Set-Cookie').must_equal "foo=bar; path=/baz"
33
- end
34
-
35
- it "should pass default cookie options when deleting" do
36
- app.plugin :cookies, :domain => 'example.com'
37
- app.route { response.delete_cookie("foo") }
38
- header('Set-Cookie').must_match(/foo=; domain=example.com; (max-age=0; )?expires=Thu, 01[ -]Jan[ -]1970 00:00:00 (-0000|GMT)/)
39
-
40
- app.route { response.delete_cookie("foo", :domain=>'bar.com') }
41
- header('Set-Cookie').must_match(/foo=; domain=bar.com; (max-age=0; )?expires=Thu, 01[ -]Jan[ -]1970 00:00:00 (-0000|GMT)/)
42
- end
43
-
44
- it "should not override existing default cookie options" do
45
- app.plugin :cookies, :path => '/foo'
46
- app.plugin :cookies
47
- app.route { response.set_cookie("foo", "bar") }
48
-
49
- header('Set-Cookie').must_equal "foo=bar; path=/foo"
50
- end
51
- end
@@ -1,111 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- begin
4
- require 'rack/csrf'
5
- rescue LoadError
6
- warn "rack_csrf not installed, skipping csrf plugin test"
7
- else
8
- describe "csrf plugin" do
9
- include CookieJar
10
-
11
- it "adds csrf protection and csrf helper methods" do
12
- app(:bare) do
13
- use(*DEFAULT_SESSION_MIDDLEWARE_ARGS)
14
- plugin :csrf, :skip=>['POST:/foo']
15
-
16
- route do |r|
17
- r.get do
18
- response['TAG'] = csrf_tag
19
- response['METATAG'] = csrf_metatag
20
- response['TOKEN'] = csrf_token
21
- response['FIELD'] = csrf_field
22
- response['HEADER'] = csrf_header
23
- 'g'
24
- end
25
- r.post 'foo' do
26
- 'bar'
27
- end
28
- r.post do
29
- 'p'
30
- end
31
- end
32
- end
33
-
34
- io = StringIO.new
35
- status('REQUEST_METHOD'=>'POST', 'rack.input'=>io).must_equal 403
36
- body('/foo', 'REQUEST_METHOD'=>'POST', 'rack.input'=>io).must_equal 'bar'
37
-
38
- s, h, b = req
39
- s.must_equal 200
40
- field = h['FIELD']
41
- token = Regexp.escape(h['TOKEN'])
42
- h['TAG'].must_match(/\A<input type="hidden" name="#{field}" value="#{token}" \/>\z/)
43
- h['METATAG'].must_match(/\A<meta name="#{field}" content="#{token}" \/>\z/)
44
- b.must_equal ['g']
45
- s, _, b = req('REQUEST_METHOD'=>'POST', 'rack.input'=>io, "HTTP_#{h['HEADER']}"=>h['TOKEN'])
46
- s.must_equal 200
47
- b.must_equal ['p']
48
-
49
- app.plugin :csrf
50
- body('/foo', 'REQUEST_METHOD'=>'POST', 'rack.input'=>io).must_equal 'bar'
51
- end
52
-
53
- it "can optionally skip setting up the middleware" do
54
- sub_app = Class.new(Roda)
55
- sub_app.class_eval do
56
- plugin :csrf, :skip_middleware=>true
57
-
58
- route do |r|
59
- r.get do
60
- response['TAG'] = csrf_tag
61
- response['METATAG'] = csrf_metatag
62
- response['TOKEN'] = csrf_token
63
- response['FIELD'] = csrf_field
64
- response['HEADER'] = csrf_header
65
- 'g'
66
- end
67
- r.post 'bar' do
68
- 'foobar'
69
- end
70
- r.post do
71
- 'p'
72
- end
73
- end
74
- end
75
-
76
- app(:bare) do
77
- use(*DEFAULT_SESSION_MIDDLEWARE_ARGS)
78
- plugin :csrf, :skip=>['POST:/foo/bar']
79
-
80
- route do |r|
81
- r.on 'foo' do
82
- r.run sub_app
83
- end
84
- end
85
- end
86
-
87
- io = StringIO.new
88
- status('/foo', 'REQUEST_METHOD'=>'POST', 'rack.input'=>io).must_equal 403
89
- body('/foo/bar', 'REQUEST_METHOD'=>'POST', 'rack.input'=>io).must_equal 'foobar'
90
-
91
- s, h, b = req('/foo')
92
- s.must_equal 200
93
- field = h['FIELD']
94
- token = Regexp.escape(h['TOKEN'])
95
- h['TAG'].must_match(/\A<input type="hidden" name="#{field}" value="#{token}" \/>\z/)
96
- h['METATAG'].must_match(/\A<meta name="#{field}" content="#{token}" \/>\z/)
97
- b.must_equal ['g']
98
- s, _, b = req('/foo', 'REQUEST_METHOD'=>'POST', 'rack.input'=>io, "HTTP_#{h['HEADER']}"=>h['TOKEN'])
99
- s.must_equal 200
100
- b.must_equal ['p']
101
-
102
- sub_app.plugin :csrf, :skip_middleware=>true
103
- body('/foo/bar', 'REQUEST_METHOD'=>'POST', 'rack.input'=>io).must_equal 'foobar'
104
-
105
- @app = sub_app
106
- s, _, b = req('/bar', 'REQUEST_METHOD'=>'POST', 'rack.input'=>io)
107
- s.must_equal 200
108
- b.must_equal ['foobar']
109
- end
110
- end
111
- end