2
2
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3
3
4
4
using System ;
5
+ using Microsoft . AspNetCore . Http . Features ;
6
+ using Microsoft . Extensions . DependencyInjection ;
7
+ using Microsoft . Extensions . Logging ;
8
+ using Microsoft . Extensions . Logging . Testing ;
5
9
using Microsoft . Net . Http . Headers ;
6
10
using Xunit ;
7
11
8
12
namespace Microsoft . AspNetCore . Http . Tests
9
13
{
10
14
public class ResponseCookiesTest
11
15
{
16
+ private IFeatureCollection MakeFeatures ( IHeaderDictionary headers )
17
+ {
18
+ var responseFeature = new HttpResponseFeature ( )
19
+ {
20
+ Headers = headers
21
+ } ;
22
+ var features = new FeatureCollection ( ) ;
23
+ features . Set < IHttpResponseFeature > ( responseFeature ) ;
24
+ return features ;
25
+ }
26
+
27
+ [ Fact ]
28
+ public void AppendSameSiteNoneWithoutSecureLogsWarning ( )
29
+ {
30
+ var headers = new HeaderDictionary ( ) ;
31
+ var features = MakeFeatures ( headers ) ;
32
+ var services = new ServiceCollection ( ) ;
33
+
34
+ var sink = new TestSink ( TestSink . EnableWithTypeName < ResponseCookies > ) ;
35
+ var loggerFactory = new TestLoggerFactory ( sink , enabled : true ) ;
36
+ services . AddLogging ( ) ;
37
+ services . AddSingleton < ILoggerFactory > ( loggerFactory ) ;
38
+
39
+ features . Set < IServiceProvidersFeature > ( new ServiceProvidersFeature ( ) { RequestServices = services . BuildServiceProvider ( ) } ) ;
40
+
41
+ var cookies = new ResponseCookies ( features ) ;
42
+ var testCookie = "TestCookie" ;
43
+
44
+ cookies . Append ( testCookie , "value" , new CookieOptions ( )
45
+ {
46
+ SameSite = SameSiteMode . None ,
47
+ } ) ;
48
+
49
+ var cookieHeaderValues = headers [ HeaderNames . SetCookie ] ;
50
+ Assert . Single ( cookieHeaderValues ) ;
51
+ Assert . StartsWith ( testCookie , cookieHeaderValues [ 0 ] ) ;
52
+ Assert . Contains ( "path=/" , cookieHeaderValues [ 0 ] ) ;
53
+ Assert . Contains ( "samesite=none" , cookieHeaderValues [ 0 ] ) ;
54
+ Assert . DoesNotContain ( "secure" , cookieHeaderValues [ 0 ] ) ;
55
+
56
+ var writeContext = Assert . Single ( sink . Writes ) ;
57
+ Assert . Equal ( "The cookie 'TestCookie' has set 'SameSite=None' and must also set 'Secure'." , writeContext . Message ) ;
58
+ }
59
+
12
60
[ Fact ]
13
61
public void DeleteCookieShouldSetDefaultPath ( )
14
62
{
15
63
var headers = new HeaderDictionary ( ) ;
16
- var cookies = new ResponseCookies ( headers ) ;
64
+ var features = MakeFeatures ( headers ) ;
65
+ var cookies = new ResponseCookies ( features ) ;
17
66
var testCookie = "TestCookie" ;
18
67
19
68
cookies . Delete ( testCookie ) ;
@@ -29,7 +78,8 @@ public void DeleteCookieShouldSetDefaultPath()
29
78
public void DeleteCookieWithCookieOptionsShouldKeepPropertiesOfCookieOptions ( )
30
79
{
31
80
var headers = new HeaderDictionary ( ) ;
32
- var cookies = new ResponseCookies ( headers ) ;
81
+ var features = MakeFeatures ( headers ) ;
82
+ var cookies = new ResponseCookies ( features ) ;
33
83
var testCookie = "TestCookie" ;
34
84
var time = new DateTimeOffset ( 2000 , 1 , 1 , 1 , 1 , 1 , 1 , TimeSpan . Zero ) ;
35
85
var options = new CookieOptions
@@ -58,7 +108,8 @@ public void DeleteCookieWithCookieOptionsShouldKeepPropertiesOfCookieOptions()
58
108
public void NoParamsDeleteRemovesCookieCreatedByAdd ( )
59
109
{
60
110
var headers = new HeaderDictionary ( ) ;
61
- var cookies = new ResponseCookies ( headers ) ;
111
+ var features = MakeFeatures ( headers ) ;
112
+ var cookies = new ResponseCookies ( features ) ;
62
113
var testCookie = "TestCookie" ;
63
114
64
115
cookies . Append ( testCookie , testCookie ) ;
@@ -75,7 +126,8 @@ public void NoParamsDeleteRemovesCookieCreatedByAdd()
75
126
public void ProvidesMaxAgeWithCookieOptionsArgumentExpectMaxAgeToBeSet ( )
76
127
{
77
128
var headers = new HeaderDictionary ( ) ;
78
- var cookies = new ResponseCookies ( headers ) ;
129
+ var features = MakeFeatures ( headers ) ;
130
+ var cookies = new ResponseCookies ( features ) ;
79
131
var cookieOptions = new CookieOptions ( ) ;
80
132
var maxAgeTime = TimeSpan . FromHours ( 1 ) ;
81
133
cookieOptions . MaxAge = TimeSpan . FromHours ( 1 ) ;
@@ -96,7 +148,8 @@ public void ProvidesMaxAgeWithCookieOptionsArgumentExpectMaxAgeToBeSet()
96
148
public void EscapesValuesBeforeSettingCookie ( string value , string expected )
97
149
{
98
150
var headers = new HeaderDictionary ( ) ;
99
- var cookies = new ResponseCookies ( headers ) ;
151
+ var features = MakeFeatures ( headers ) ;
152
+ var cookies = new ResponseCookies ( features ) ;
100
153
101
154
cookies . Append ( "key" , value ) ;
102
155
@@ -111,7 +164,8 @@ public void EscapesValuesBeforeSettingCookie(string value, string expected)
111
164
public void InvalidKeysThrow ( string key )
112
165
{
113
166
var headers = new HeaderDictionary ( ) ;
114
- var cookies = new ResponseCookies ( headers ) ;
167
+ var features = MakeFeatures ( headers ) ;
168
+ var cookies = new ResponseCookies ( features ) ;
115
169
116
170
Assert . Throws < ArgumentException > ( ( ) => cookies . Append ( key , "1" ) ) ;
117
171
}
@@ -124,7 +178,8 @@ public void InvalidKeysThrow(string key)
124
178
public void AppContextSwitchEscapesKeysAndValuesBeforeSettingCookie ( string key , string value , string expected )
125
179
{
126
180
var headers = new HeaderDictionary ( ) ;
127
- var cookies = new ResponseCookies ( headers ) ;
181
+ var features = MakeFeatures ( headers ) ;
182
+ var cookies = new ResponseCookies ( features ) ;
128
183
cookies . _enableCookieNameEncoding = true ;
129
184
130
185
cookies . Append ( key , value ) ;
0 commit comments