@@ -57,7 +57,7 @@ public static TheoryData<SetCookieHeaderValue, string> SetCookieHeaderDataSet
5757 {
5858 SameSite = SameSiteMode . None ,
5959 } ;
60- dataset . Add ( header7 , "name7=value7" ) ;
60+ dataset . Add ( header7 , "name7=value7; samesite=none " ) ;
6161
6262
6363 return dataset ;
@@ -155,9 +155,20 @@ public static TheoryData<IList<SetCookieHeaderValue>, string[]> ListOfSetCookieH
155155 {
156156 SameSite = SameSiteMode . Strict
157157 } ;
158- var string6a = "name6=value6; samesite" ;
159- var string6b = "name6=value6; samesite=Strict" ;
160- var string6c = "name6=value6; samesite=invalid" ;
158+ var string6 = "name6=value6; samesite=Strict" ;
159+
160+ var header7 = new SetCookieHeaderValue ( "name7" , "value7" )
161+ {
162+ SameSite = SameSiteMode . None
163+ } ;
164+ var string7 = "name7=value7; samesite=None" ;
165+
166+ var header8 = new SetCookieHeaderValue ( "name8" , "value8" )
167+ {
168+ SameSite = ( SameSiteMode ) ( - 1 ) // Unspecified
169+ } ;
170+ var string8a = "name8=value8; samesite" ;
171+ var string8b = "name8=value8; samesite=invalid" ;
161172
162173 dataset . Add ( new [ ] { header1 } . ToList ( ) , new [ ] { string1 } ) ;
163174 dataset . Add ( new [ ] { header1 , header1 } . ToList ( ) , new [ ] { string1 , string1 } ) ;
@@ -170,9 +181,10 @@ public static TheoryData<IList<SetCookieHeaderValue>, string[]> ListOfSetCookieH
170181 dataset . Add ( new [ ] { header1 , header2 , header3 , header4 } . ToList ( ) , new [ ] { string . Join ( "," , string1 , string2 , string3 , string4 ) } ) ;
171182 dataset . Add ( new [ ] { header5 } . ToList ( ) , new [ ] { string5a } ) ;
172183 dataset . Add ( new [ ] { header5 } . ToList ( ) , new [ ] { string5b } ) ;
173- dataset . Add ( new [ ] { header6 } . ToList ( ) , new [ ] { string6a } ) ;
174- dataset . Add ( new [ ] { header6 } . ToList ( ) , new [ ] { string6b } ) ;
175- dataset . Add ( new [ ] { header6 } . ToList ( ) , new [ ] { string6c } ) ;
184+ dataset . Add ( new [ ] { header6 } . ToList ( ) , new [ ] { string6 } ) ;
185+ dataset . Add ( new [ ] { header7 } . ToList ( ) , new [ ] { string7 } ) ;
186+ dataset . Add ( new [ ] { header8 } . ToList ( ) , new [ ] { string8a } ) ;
187+ dataset . Add ( new [ ] { header8 } . ToList ( ) , new [ ] { string8b } ) ;
176188
177189 return dataset ;
178190 }
@@ -301,6 +313,28 @@ public void SetCookieHeaderValue_ToString(SetCookieHeaderValue input, string exp
301313 Assert . Equal ( expectedValue , input . ToString ( ) ) ;
302314 }
303315
316+ [ Fact ]
317+ public void SetCookieHeaderValue_ToString_SameSiteNoneCompat ( )
318+ {
319+ SetCookieHeaderValue . SuppressSameSiteNone = true ;
320+
321+ var input = new SetCookieHeaderValue ( "name" , "value" )
322+ {
323+ SameSite = SameSiteMode . None ,
324+ } ;
325+
326+ Assert . Equal ( "name=value" , input . ToString ( ) ) ;
327+
328+ SetCookieHeaderValue . SuppressSameSiteNone = false ;
329+
330+ var input2 = new SetCookieHeaderValue ( "name" , "value" )
331+ {
332+ SameSite = SameSiteMode . None ,
333+ } ;
334+
335+ Assert . Equal ( "name=value; samesite=none" , input2 . ToString ( ) ) ;
336+ }
337+
304338 [ Theory ]
305339 [ MemberData ( nameof ( SetCookieHeaderDataSet ) ) ]
306340 public void SetCookieHeaderValue_AppendToStringBuilder ( SetCookieHeaderValue input , string expectedValue )
@@ -312,6 +346,32 @@ public void SetCookieHeaderValue_AppendToStringBuilder(SetCookieHeaderValue inpu
312346 Assert . Equal ( expectedValue , builder . ToString ( ) ) ;
313347 }
314348
349+ [ Fact ]
350+ public void SetCookieHeaderValue_AppendToStringBuilder_SameSiteNoneCompat ( )
351+ {
352+ SetCookieHeaderValue . SuppressSameSiteNone = true ;
353+
354+ var builder = new StringBuilder ( ) ;
355+ var input = new SetCookieHeaderValue ( "name" , "value" )
356+ {
357+ SameSite = SameSiteMode . None ,
358+ } ;
359+
360+ input . AppendToStringBuilder ( builder ) ;
361+ Assert . Equal ( "name=value" , builder . ToString ( ) ) ;
362+
363+ SetCookieHeaderValue . SuppressSameSiteNone = false ;
364+
365+ var builder2 = new StringBuilder ( ) ;
366+ var input2 = new SetCookieHeaderValue ( "name" , "value" )
367+ {
368+ SameSite = SameSiteMode . None ,
369+ } ;
370+
371+ input2 . AppendToStringBuilder ( builder2 ) ;
372+ Assert . Equal ( "name=value; samesite=none" , builder2 . ToString ( ) ) ;
373+ }
374+
315375 [ Theory ]
316376 [ MemberData ( nameof ( SetCookieHeaderDataSet ) ) ]
317377 public void SetCookieHeaderValue_Parse_AcceptsValidValues ( SetCookieHeaderValue cookie , string expectedValue )
@@ -322,6 +382,31 @@ public void SetCookieHeaderValue_Parse_AcceptsValidValues(SetCookieHeaderValue c
322382 Assert . Equal ( expectedValue , header . ToString ( ) ) ;
323383 }
324384
385+ [ Fact ]
386+ public void SetCookieHeaderValue_Parse_AcceptsValidValues_SameSiteNoneCompat ( )
387+ {
388+ SetCookieHeaderValue . SuppressSameSiteNone = true ;
389+ var header = SetCookieHeaderValue . Parse ( "name=value; samesite=none" ) ;
390+
391+ var cookie = new SetCookieHeaderValue ( "name" , "value" )
392+ {
393+ SameSite = SameSiteMode . Strict ,
394+ } ;
395+
396+ Assert . Equal ( cookie , header ) ;
397+ Assert . Equal ( "name=value; samesite=strict" , header . ToString ( ) ) ;
398+ SetCookieHeaderValue . SuppressSameSiteNone = false ;
399+
400+ var header2 = SetCookieHeaderValue . Parse ( "name=value; samesite=none" ) ;
401+
402+ var cookie2 = new SetCookieHeaderValue ( "name" , "value" )
403+ {
404+ SameSite = SameSiteMode . None ,
405+ } ;
406+ Assert . Equal ( cookie2 , header2 ) ;
407+ Assert . Equal ( "name=value; samesite=none" , header2 . ToString ( ) ) ;
408+ }
409+
325410 [ Theory ]
326411 [ MemberData ( nameof ( SetCookieHeaderDataSet ) ) ]
327412 public void SetCookieHeaderValue_TryParse_AcceptsValidValues ( SetCookieHeaderValue cookie , string expectedValue )
@@ -332,6 +417,31 @@ public void SetCookieHeaderValue_TryParse_AcceptsValidValues(SetCookieHeaderValu
332417 Assert . Equal ( expectedValue , header . ToString ( ) ) ;
333418 }
334419
420+ [ Fact ]
421+ public void SetCookieHeaderValue_TryParse_AcceptsValidValues_SameSiteNoneCompat ( )
422+ {
423+ SetCookieHeaderValue . SuppressSameSiteNone = true ;
424+ Assert . True ( SetCookieHeaderValue . TryParse ( "name=value; samesite=none" , out var header ) ) ;
425+ var cookie = new SetCookieHeaderValue ( "name" , "value" )
426+ {
427+ SameSite = SameSiteMode . Strict ,
428+ } ;
429+
430+ Assert . Equal ( cookie , header ) ;
431+ Assert . Equal ( "name=value; samesite=strict" , header . ToString ( ) ) ;
432+
433+ SetCookieHeaderValue . SuppressSameSiteNone = false ;
434+
435+ Assert . True ( SetCookieHeaderValue . TryParse ( "name=value; samesite=none" , out var header2 ) ) ;
436+ var cookie2 = new SetCookieHeaderValue ( "name" , "value" )
437+ {
438+ SameSite = SameSiteMode . None ,
439+ } ;
440+
441+ Assert . Equal ( cookie2 , header2 ) ;
442+ Assert . Equal ( "name=value; samesite=none" , header2 . ToString ( ) ) ;
443+ }
444+
335445 [ Theory ]
336446 [ MemberData ( nameof ( InvalidSetCookieHeaderDataSet ) ) ]
337447 public void SetCookieHeaderValue_Parse_RejectsInvalidValues ( string value )
0 commit comments