2424import java .util .Objects ;
2525import java .util .TimeZone ;
2626import java .util .TreeMap ;
27+ import org .jspecify .annotations .NullMarked ;
28+ import org .jspecify .annotations .Nullable ;
2729
30+ @ NullMarked
2831public class Cookie implements Serializable {
2932 private static final long serialVersionUID = 4115876353625612383L ;
3033
3134 private final String name ;
3235 private final String value ;
3336 private final String path ;
34- private final String domain ;
35- private final Date expiry ;
37+ private final @ Nullable String domain ;
38+ private final @ Nullable Date expiry ;
3639 private final boolean isSecure ;
3740 private final boolean isHttpOnly ;
38- private final String sameSite ;
41+ private final @ Nullable String sameSite ;
3942
4043 /**
4144 * Creates an insecure non-httpOnly cookie with no domain specified.
@@ -47,7 +50,7 @@ public class Cookie implements Serializable {
4750 * @param expiry The cookie's expiration date; may be null.
4851 * @see #Cookie(String, String, String, String, Date)
4952 */
50- public Cookie (String name , String value , String path , Date expiry ) {
53+ public Cookie (String name , String value , @ Nullable String path , @ Nullable Date expiry ) {
5154 this (name , value , null , path , expiry );
5255 }
5356
@@ -62,7 +65,12 @@ public Cookie(String name, String value, String path, Date expiry) {
6265 * @param expiry The cookie's expiration date; may be null.
6366 * @see #Cookie(String, String, String, String, Date, boolean)
6467 */
65- public Cookie (String name , String value , String domain , String path , Date expiry ) {
68+ public Cookie (
69+ String name ,
70+ String value ,
71+ @ Nullable String domain ,
72+ @ Nullable String path ,
73+ @ Nullable Date expiry ) {
6674 this (name , value , domain , path , expiry , false );
6775 }
6876
@@ -78,7 +86,12 @@ public Cookie(String name, String value, String domain, String path, Date expiry
7886 * @param isSecure Whether this cookie requires a secure connection.
7987 */
8088 public Cookie (
81- String name , String value , String domain , String path , Date expiry , boolean isSecure ) {
89+ String name ,
90+ String value ,
91+ @ Nullable String domain ,
92+ @ Nullable String path ,
93+ @ Nullable Date expiry ,
94+ boolean isSecure ) {
8295 this (name , value , domain , path , expiry , isSecure , false );
8396 }
8497
@@ -97,9 +110,9 @@ public Cookie(
97110 public Cookie (
98111 String name ,
99112 String value ,
100- String domain ,
101- String path ,
102- Date expiry ,
113+ @ Nullable String domain ,
114+ @ Nullable String path ,
115+ @ Nullable Date expiry ,
103116 boolean isSecure ,
104117 boolean isHttpOnly ) {
105118 this (name , value , domain , path , expiry , isSecure , isHttpOnly , null );
@@ -121,12 +134,12 @@ public Cookie(
121134 public Cookie (
122135 String name ,
123136 String value ,
124- String domain ,
125- String path ,
126- Date expiry ,
137+ @ Nullable String domain ,
138+ @ Nullable String path ,
139+ @ Nullable Date expiry ,
127140 boolean isSecure ,
128141 boolean isHttpOnly ,
129- String sameSite ) {
142+ @ Nullable String sameSite ) {
130143 this .name = name ;
131144 this .value = value ;
132145 this .path = path == null || path .isEmpty () ? "/" : path ;
@@ -174,7 +187,7 @@ public String getValue() {
174187 return value ;
175188 }
176189
177- public String getDomain () {
190+ public @ Nullable String getDomain () {
178191 return domain ;
179192 }
180193
@@ -190,15 +203,15 @@ public boolean isHttpOnly() {
190203 return isHttpOnly ;
191204 }
192205
193- public Date getExpiry () {
206+ public @ Nullable Date getExpiry () {
194207 return expiry == null ? null : new Date (expiry .getTime ());
195208 }
196209
197- public String getSameSite () {
210+ public @ Nullable String getSameSite () {
198211 return sameSite ;
199212 }
200213
201- private static String stripPort (String domain ) {
214+ private static @ Nullable String stripPort (@ Nullable String domain ) {
202215 return (domain == null ) ? null : domain .split (":" )[0 ];
203216 }
204217
@@ -270,7 +283,7 @@ public String toString() {
270283
271284 /** Two cookies are equal if the name and value match */
272285 @ Override
273- public boolean equals (Object o ) {
286+ public boolean equals (@ Nullable Object o ) {
274287 if (this == o ) {
275288 return true ;
276289 }
@@ -295,29 +308,29 @@ public static class Builder {
295308
296309 private final String name ;
297310 private final String value ;
298- private String path ;
299- private String domain ;
300- private Date expiry ;
311+ private @ Nullable String path ;
312+ private @ Nullable String domain ;
313+ private @ Nullable Date expiry ;
301314 private boolean secure ;
302315 private boolean httpOnly ;
303- private String sameSite ;
316+ private @ Nullable String sameSite ;
304317
305318 public Builder (String name , String value ) {
306319 this .name = name ;
307320 this .value = value ;
308321 }
309322
310- public Builder domain (String host ) {
323+ public Builder domain (@ Nullable String host ) {
311324 this .domain = stripPort (host );
312325 return this ;
313326 }
314327
315- public Builder path (String path ) {
328+ public Builder path (@ Nullable String path ) {
316329 this .path = path ;
317330 return this ;
318331 }
319332
320- public Builder expiresOn (Date expiry ) {
333+ public Builder expiresOn (@ Nullable Date expiry ) {
321334 this .expiry = expiry == null ? null : new Date (expiry .getTime ());
322335 return this ;
323336 }
@@ -332,7 +345,7 @@ public Builder isHttpOnly(boolean httpOnly) {
332345 return this ;
333346 }
334347
335- public Builder sameSite (String sameSite ) {
348+ public Builder sameSite (@ Nullable String sameSite ) {
336349 this .sameSite = sameSite ;
337350 return this ;
338351 }
0 commit comments