2424using System . Linq ;
2525using System . Text . Json . Serialization ;
2626
27+ #nullable enable
28+
2729namespace OpenQA . Selenium
2830{
2931 /// <summary>
@@ -32,15 +34,20 @@ namespace OpenQA.Selenium
3234 [ Serializable ]
3335 public class Cookie
3436 {
35- private string cookieName ;
36- private string cookieValue ;
37- private string cookiePath ;
38- private string cookieDomain ;
39- private string sameSite ;
40- private bool isHttpOnly ;
41- private bool secure ;
42- private DateTime ? cookieExpiry ;
43- private readonly string [ ] sameSiteValues = { "Strict" , "Lax" , "None" } ;
37+ private readonly string cookieName ;
38+ private readonly string cookieValue ;
39+ private readonly string ? cookiePath ;
40+ private readonly string ? cookieDomain ;
41+ private readonly string ? sameSite ;
42+ private readonly bool isHttpOnly ;
43+ private readonly bool secure ;
44+ private readonly DateTime ? cookieExpiry ;
45+ private readonly HashSet < string ? > sameSiteValues = new HashSet < string ? > ( )
46+ {
47+ "Strict" ,
48+ "Lax" ,
49+ "None"
50+ } ;
4451
4552 /// <summary>
4653 /// Initializes a new instance of the <see cref="Cookie"/> class with a specific name and value.
@@ -65,7 +72,7 @@ public Cookie(string name, string value)
6572 /// <exception cref="ArgumentException">If the name is <see langword="null"/> or an empty string,
6673 /// or if it contains a semi-colon.</exception>
6774 /// <exception cref="ArgumentNullException">If the value is <see langword="null"/>.</exception>
68- public Cookie ( string name , string value , string path )
75+ public Cookie ( string name , string value , string ? path )
6976 : this ( name , value , path , null )
7077 {
7178 }
@@ -81,7 +88,7 @@ public Cookie(string name, string value, string path)
8188 /// <exception cref="ArgumentException">If the name is <see langword="null"/> or an empty string,
8289 /// or if it contains a semi-colon.</exception>
8390 /// <exception cref="ArgumentNullException">If the value is <see langword="null"/>.</exception>
84- public Cookie ( string name , string value , string path , DateTime ? expiry )
91+ public Cookie ( string name , string value , string ? path , DateTime ? expiry )
8592 : this ( name , value , null , path , expiry )
8693 {
8794 }
@@ -98,7 +105,7 @@ public Cookie(string name, string value, string path, DateTime? expiry)
98105 /// <exception cref="ArgumentException">If the name is <see langword="null"/> or an empty string,
99106 /// or if it contains a semi-colon.</exception>
100107 /// <exception cref="ArgumentNullException">If the value is <see langword="null"/>.</exception>
101- public Cookie ( string name , string value , string domain , string path , DateTime ? expiry )
108+ public Cookie ( string name , string value , string ? domain , string ? path , DateTime ? expiry )
102109 : this ( name , value , domain , path , expiry , false , false , null )
103110 {
104111 }
@@ -118,7 +125,7 @@ public Cookie(string name, string value, string domain, string path, DateTime? e
118125 /// <exception cref="ArgumentException">If the name and value are both an empty string,
119126 /// if the name contains a semi-colon, or if same site value is not valid.</exception>
120127 /// <exception cref="ArgumentNullException">If the name, value or currentUrl is <see langword="null"/>.</exception>
121- public Cookie ( string name , string value , string domain , string path , DateTime ? expiry , bool secure , bool isHttpOnly , string sameSite )
128+ public Cookie ( string name , string value , string ? domain , string ? path , DateTime ? expiry , bool secure , bool isHttpOnly , string ? sameSite )
122129 {
123130 if ( name == null )
124131 {
@@ -135,7 +142,7 @@ public Cookie(string name, string value, string domain, string path, DateTime? e
135142 throw new ArgumentException ( "Cookie name and value cannot both be empty string" ) ;
136143 }
137144
138- if ( name . IndexOf ( ';' ) != - 1 )
145+ if ( name . Contains ( ';' ) )
139146 {
140147 throw new ArgumentException ( "Cookie names cannot contain a ';': " + name , nameof ( name ) ) ;
141148 }
@@ -172,77 +179,52 @@ public Cookie(string name, string value, string domain, string path, DateTime? e
172179 /// Gets the name of the cookie.
173180 /// </summary>
174181 [ JsonPropertyName ( "name" ) ]
175- public string Name
176- {
177- get { return this . cookieName ; }
178- }
182+ public string Name => this . cookieName ;
179183
180184 /// <summary>
181185 /// Gets the value of the cookie.
182186 /// </summary>
183187 [ JsonPropertyName ( "value" ) ]
184- public string Value
185- {
186- get { return this . cookieValue ; }
187- }
188+ public string Value => this . cookieValue ;
188189
189190 /// <summary>
190191 /// Gets the domain of the cookie.
191192 /// </summary>
192193 [ JsonPropertyName ( "domain" ) ]
193194 [ JsonIgnore ( Condition = JsonIgnoreCondition . WhenWritingNull ) ]
194- public string Domain
195- {
196- get { return this . cookieDomain ; }
197- }
195+ public string ? Domain => this . cookieDomain ;
198196
199197 /// <summary>
200198 /// Gets the path of the cookie.
201199 /// </summary>
202200 [ JsonPropertyName ( "path" ) ]
203201 [ JsonIgnore ( Condition = JsonIgnoreCondition . WhenWritingNull ) ]
204- public virtual string Path
205- {
206- get { return this . cookiePath ; }
207- }
202+ public virtual string ? Path => this . cookiePath ;
208203
209204 /// <summary>
210205 /// Gets a value indicating whether the cookie is secure.
211206 /// </summary>
212207 [ JsonPropertyName ( "secure" ) ]
213- public virtual bool Secure
214- {
215- get { return this . secure ; }
216- }
208+ public virtual bool Secure => this . secure ;
217209
218210 /// <summary>
219211 /// Gets a value indicating whether the cookie is an HTTP-only cookie.
220212 /// </summary>
221213 [ JsonPropertyName ( "httpOnly" ) ]
222- public virtual bool IsHttpOnly
223- {
224- get { return this . isHttpOnly ; }
225-
226- }
214+ public virtual bool IsHttpOnly => this . isHttpOnly ;
227215
228216 /// <summary>
229217 /// Gets the SameSite setting for the cookie.
230218 /// </summary>
231219 [ JsonPropertyName ( "sameSite" ) ]
232220 [ JsonIgnore ( Condition = JsonIgnoreCondition . WhenWritingNull ) ]
233- public virtual string SameSite
234- {
235- get { return this . sameSite ; }
236- }
221+ public virtual string ? SameSite => this . sameSite ;
237222
238223 /// <summary>
239224 /// Gets the expiration date of the cookie.
240225 /// </summary>
241226 [ JsonIgnore ]
242- public DateTime ? Expiry
243- {
244- get { return this . cookieExpiry ; }
245- }
227+ public DateTime ? Expiry => this . cookieExpiry ;
246228
247229 /// <summary>
248230 /// Gets the cookie expiration date in seconds from the defined zero date (01 January 1970 00:00:00 UTC).
@@ -273,54 +255,54 @@ internal long? ExpirySeconds
273255 /// </summary>
274256 /// <param name="rawCookie">The Dictionary object containing the cookie parameters.</param>
275257 /// <returns>A <see cref="Cookie"/> object with the proper parameters set.</returns>
276- public static Cookie FromDictionary ( Dictionary < string , object > rawCookie )
258+ public static Cookie FromDictionary ( Dictionary < string , object ? > rawCookie )
277259 {
278260 if ( rawCookie == null )
279261 {
280262 throw new ArgumentNullException ( nameof ( rawCookie ) ) ;
281263 }
282264
283- string name = rawCookie [ "name" ] . ToString ( ) ;
265+ string name = rawCookie [ "name" ] ! . ToString ( ) ! ;
284266 string value = string . Empty ;
285- if ( rawCookie [ "value" ] != null )
267+ if ( rawCookie . TryGetValue ( "value" , out object ? valueObj ) )
286268 {
287- value = rawCookie [ "value" ] . ToString ( ) ;
269+ value = valueObj ! . ToString ( ) ! ;
288270 }
289271
290272 string path = "/" ;
291- if ( rawCookie . ContainsKey ( "path" ) && rawCookie [ "path" ] != null )
273+ if ( rawCookie . TryGetValue ( "path" , out object ? pathObj ) && pathObj != null )
292274 {
293- path = rawCookie [ "path" ] . ToString ( ) ;
275+ path = pathObj . ToString ( ) ! ;
294276 }
295277
296278 string domain = string . Empty ;
297- if ( rawCookie . ContainsKey ( "domain" ) && rawCookie [ "domain" ] != null )
279+ if ( rawCookie . TryGetValue ( "domain" , out object ? domainObj ) && domainObj != null )
298280 {
299- domain = rawCookie [ "domain" ] . ToString ( ) ;
281+ domain = domainObj . ToString ( ) ! ;
300282 }
301283
302284 DateTime ? expires = null ;
303- if ( rawCookie . ContainsKey ( "expiry" ) && rawCookie [ "expiry" ] != null )
285+ if ( rawCookie . TryGetValue ( "expiry" , out object ? expiryObj ) && expiryObj != null )
304286 {
305- expires = ConvertExpirationTime ( rawCookie [ "expiry" ] . ToString ( ) ) ;
287+ expires = ConvertExpirationTime ( expiryObj . ToString ( ) ! ) ;
306288 }
307289
308290 bool secure = false ;
309- if ( rawCookie . ContainsKey ( "secure" ) && rawCookie [ "secure" ] != null )
291+ if ( rawCookie . TryGetValue ( "secure" , out object ? secureObj ) && secureObj != null )
310292 {
311- secure = bool . Parse ( rawCookie [ "secure" ] . ToString ( ) ) ;
293+ secure = bool . Parse ( secureObj . ToString ( ) ! ) ;
312294 }
313295
314296 bool isHttpOnly = false ;
315- if ( rawCookie . ContainsKey ( "httpOnly" ) && rawCookie [ "httpOnly" ] != null )
297+ if ( rawCookie . TryGetValue ( "httpOnly" , out object ? httpOnlyObj ) && httpOnlyObj != null )
316298 {
317- isHttpOnly = bool . Parse ( rawCookie [ "httpOnly" ] . ToString ( ) ) ;
299+ isHttpOnly = bool . Parse ( httpOnlyObj . ToString ( ) ! ) ;
318300 }
319301
320- string sameSite = null ;
321- if ( rawCookie . ContainsKey ( "sameSite" ) && rawCookie [ "sameSite" ] != null )
302+ string ? sameSite = null ;
303+ if ( rawCookie . TryGetValue ( "sameSite" , out object ? sameSiteObj ) )
322304 {
323- sameSite = rawCookie [ "sameSite" ] . ToString ( ) ;
305+ sameSite = sameSiteObj ? . ToString ( ) ;
324306 }
325307
326308 return new ReturnedCookie ( name , value , domain , path , expires , secure , isHttpOnly , sameSite ) ;
@@ -348,7 +330,7 @@ public override string ToString()
348330 /// <returns><see langword="true"/> if the specified <see cref="object">Object</see>
349331 /// is equal to the current <see cref="object">Object</see>; otherwise,
350332 /// <see langword="false"/>.</returns>
351- public override bool Equals ( object obj )
333+ public override bool Equals ( object ? obj )
352334 {
353335 // Two cookies are equal if the name and value match
354336 if ( this == obj )
@@ -378,16 +360,15 @@ public override int GetHashCode()
378360 return this . cookieName . GetHashCode ( ) ;
379361 }
380362
381- private static string StripPort ( string domain )
363+ private static string ? StripPort ( string ? domain )
382364 {
383- return string . IsNullOrEmpty ( domain ) ? null : domain . Split ( ':' ) [ 0 ] ;
365+ return string . IsNullOrEmpty ( domain ) ? null : domain ! . Split ( ':' ) [ 0 ] ;
384366 }
385367
386368 private static DateTime ? ConvertExpirationTime ( string expirationTime )
387369 {
388370 DateTime ? expires = null ;
389- double seconds = 0 ;
390- if ( double . TryParse ( expirationTime , NumberStyles . Number , CultureInfo . InvariantCulture , out seconds ) )
371+ if ( double . TryParse ( expirationTime , NumberStyles . Number , CultureInfo . InvariantCulture , out double seconds ) )
391372 {
392373 try
393374 {
0 commit comments