io.restassured.http.Cookie Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of rest-assured Show documentation
Show all versions of rest-assured Show documentation
Java DSL for easy testing of REST services
/*
* Copyright 2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.restassured.http;
import io.restassured.internal.NameAndValue;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import static io.restassured.internal.common.assertion.AssertParameter.notNull;
/**
* Cookie class represents a token or short packet of state information
* (also referred to as "magic-cookie") that the HTTP agent and the target
* server can exchange to maintain a session. In its simples form an HTTP
* cookie is merely a name / value pair.
*
* To construct a new new Cookie use the Builder like this:
*
*
* Cookie cookie = new Cookie.Builder("name", "value").setComment("some comment").setExpiryDate(someDate).build();
*
*
* Credits: Some of the javadoc in this class is copied from the org.apache.http.cookie.Cookie
class in Apache HTTP Client.
* and some (version and secured) from Scalatra.
*/
public class Cookie implements NameAndValue {
public static final String COMMENT = "Comment";
public static final String PATH = "Path";
public static final String DOMAIN = "Domain";
public static final String MAX_AGE = "Max-Age";
public static final String SECURE = "Secure";
public static final String HTTP_ONLY = "HttpOnly";
public static final String EXPIRES = "Expires";
public static final String VERSION = "Version";
public static final String SAME_SITE = "SameSite";
private static final String COOKIE_ATTRIBUTE_SEPARATOR = ";";
private static final String EQUALS = "=";
private static final int UNDEFINED = -1;
private static final long UNDEFINED_LONG = -1;
private final String name;
private final String value;
private final String comment;
private final Date expiryDate;
private final String domain;
private final String path;
private final boolean secured;
private final boolean httpOnly;
private final int version;
private final long maxAge;
private final String sameSite;
private Cookie(String name, String value, String comment, Date expiryDate,
String domain, String path, boolean secured, boolean httpOnly, int version,
long maxAge, String sameSite) {
this.name = name;
this.value = value;
this.comment = comment;
this.expiryDate = expiryDate;
this.domain = domain;
this.path = path;
this.secured = secured;
this.httpOnly = httpOnly;
this.version = version < 0 ? UNDEFINED : version;
this.maxAge = maxAge;
this.sameSite = sameSite;
}
/**
* Returns the name.
*
* @return String name The name
*/
public String getName() {
return name;
}
/**
* Returns the value.
*
* @return The current value.
*/
public String getValue() {
return value;
}
/**
* @return true
if this cookie has a value defined, false
otherwise.
*/
public boolean hasValue() {
return value != null;
}
/**
* Returns the comment describing the purpose of this cookie, or
* null if no such comment has been defined.
*
* @return comment
*/
public String getComment() {
return comment;
}
/**
* @return true
if this cookie has a comment defined, false
otherwise.
*/
public boolean hasComment() {
return comment != null;
}
/**
* Returns the expiration {@link java.util.Date} of the cookie, or null
* if none exists.
* @return Expiration {@link java.util.Date}, or null.
*/
public Date getExpiryDate() {
return expiryDate;
}
/**
* @return true
if this cookie has an expiry defined, false
otherwise.
*/
public boolean hasExpiryDate() {
return expiryDate != null;
}
/**
* Returns domain attribute of the cookie. The value of the Domain
* attribute specifies the domain for which the cookie is valid.
*
* @return the value of the domain attribute.
*/
public String getDomain() {
return domain;
}
/**
* @return true
if this cookie has a domain defined, false
otherwise.
*/
public boolean hasDomain() {
return domain != null;
}
/**
* Returns the path attribute of the cookie. The value of the Path
* attribute specifies the subset of URLs on the origin server to which
* this cookie applies.
*
* @return The value of the path attribute.
*/
public String getPath() {
return path;
}
/**
* @return true
if this cookie has a path defined, false
otherwise.
*/
public boolean hasPath() {
return path != null;
}
/**
* Indicates to the browser whether the cookie should only be sent using a secure protocol, such as HTTPS or SSL.
* @return true
if this cookies is secured.
*/
public boolean isSecured() {
return secured;
}
/**
* Indicates that the cookie is only readable by the HTTP server and not other API's such as JavaScript.
* The default value is false.
* @return true
if httpOnly
*/
public boolean isHttpOnly() {
return httpOnly;
}
/**
* Gets the version of the cookie protocol this cookie complies with. Version 0 complies with the original Netscape cookie specification. Version 1 complies with RFC 2109.
* @return The version of this cookie or -1 if version is undefined.
*/
public int getVersion() {
return version;
}
/**
* @return true
if this cookie has a version defined, false
otherwise.
*/
public boolean hasVersion() {
return version != UNDEFINED;
}
/**
* Returns the maximum age of the cookie, specified in seconds,
* By default, -1
indicating the cookie will persist
* until browser shutdown.
*
*
* @return an integer specifying the maximum age of the
* cookie in seconds; if negative, means
* the cookie persists until browser shutdown
*/
public long getMaxAge() {
return maxAge;
}
/**
* @return true
if this cookie has a Max-Age defined, false
otherwise.
*/
public boolean hasMaxAge() {
return maxAge != UNDEFINED;
}
/**
* Returns the SameSite attribute of the cookie. The SameSite cookie attribute restricts browser behavior. It may prevent the browser
* from sending the cookie's key-value pair based on the type of interaction that triggered the HTTP request.
*
* @return The value of the sameSite attribute.
*/
public String getSameSite() {
return sameSite;
}
/**
* @return true
if this cookie has a SameSite attribute defined, false
otherwise.
*/
public boolean hasSameSite() {
return sameSite != null;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Cookie cookie = (Cookie) o;
if (maxAge != cookie.maxAge) return false;
if (secured != cookie.secured) return false;
if (httpOnly != cookie.httpOnly) return false;
if (version != cookie.version) return false;
if (comment != null ? !comment.equals(cookie.comment) : cookie.comment != null) return false;
if (domain != null ? !domain.equals(cookie.domain) : cookie.domain != null) return false;
if (expiryDate != null ? !expiryDate.equals(cookie.expiryDate) : cookie.expiryDate != null) return false;
if (name != null ? !name.equals(cookie.name) : cookie.name != null) return false;
if (path != null ? !path.equals(cookie.path) : cookie.path != null) return false;
if (value != null ? !value.equals(cookie.value) : cookie.value != null) return false;
if (sameSite != null ? !sameSite.equals(cookie.sameSite) : cookie.sameSite != null) return false;
return true;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (value != null ? value.hashCode() : 0);
result = 31 * result + (comment != null ? comment.hashCode() : 0);
result = 31 * result + (expiryDate != null ? expiryDate.hashCode() : 0);
result = 31 * result + (domain != null ? domain.hashCode() : 0);
result = 31 * result + (path != null ? path.hashCode() : 0);
result = 31 * result + (secured ? 1 : 0);
result = 31 * result + (httpOnly ? 1 : 0);
result = 31 * result + version;
result = 31 * result + (int) maxAge;
result = 31 * result + (sameSite != null ? sameSite.hashCode() : 0);
return result;
}
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
builder.append(name);
if (hasValue()) {
builder.append(EQUALS).append(value);
}
if (hasComment()) {
builder.append(COOKIE_ATTRIBUTE_SEPARATOR).append(COMMENT).append(EQUALS).append(comment);
}
if (hasPath()) {
builder.append(COOKIE_ATTRIBUTE_SEPARATOR).append(PATH).append(EQUALS).append(path);
}
if (hasDomain()) {
builder.append(COOKIE_ATTRIBUTE_SEPARATOR).append(DOMAIN).append(EQUALS).append(domain);
}
if (hasMaxAge()) {
builder.append(COOKIE_ATTRIBUTE_SEPARATOR).append(MAX_AGE).append(EQUALS).append(maxAge);
}
if (isSecured()) {
builder.append(COOKIE_ATTRIBUTE_SEPARATOR).append(SECURE);
}
if (isHttpOnly()) {
builder.append(COOKIE_ATTRIBUTE_SEPARATOR).append(HTTP_ONLY);
}
if (hasExpiryDate()) {
final SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
builder.append(COOKIE_ATTRIBUTE_SEPARATOR).append(EXPIRES).append(EQUALS).append(simpleDateFormat.format(expiryDate));
}
if (hasVersion()) {
builder.append(COOKIE_ATTRIBUTE_SEPARATOR).append(VERSION).append(EQUALS).append(version);
}
if (hasSameSite()) {
builder.append(COOKIE_ATTRIBUTE_SEPARATOR).append(SAME_SITE).append(EQUALS).append(sameSite);
}
return builder.toString();
}
public static class Builder {
private final String name;
private final String value;
private String comment;
private Date expiryDate;
private String domain;
private String path;
private boolean secured = false;
private boolean httpOnly = false;
private int version = UNDEFINED;
private long maxAge = UNDEFINED_LONG;
private String sameSite;
/**
* Create a cookie with no value
*
* @param name The name of the cookie
*/
public Builder(String name) {
this(name, null);
}
/**
* Create a cookie with name and value
*
* @param name The name of the cookie
* @param value the cookie value
*/
public Builder(String name, String value) {
notNull(name, "Cookie name");
this.name = name;
this.value = value;
}
/**
* Create a cookie builder with cookie props
* @param cookie The cookie
*/
public Builder(Cookie cookie) {
notNull(cookie, "Cookie");
this.name = cookie.name;
this.value = cookie.value;
this.comment = cookie.comment;
this.expiryDate = cookie.expiryDate;
this.domain = cookie.domain;
this.path = cookie.path;
this.secured = cookie.secured;
this.httpOnly = cookie.httpOnly;
this.version = cookie.version;
this.maxAge = cookie.maxAge;
this.sameSite = cookie.sameSite;
}
/**
* Set the comment describing the purpose of this cookie.
*
* @param comment The comment
* @return The builder
*/
public Builder setComment(String comment) {
notNull(name, "Cookie name");
this.comment = comment;
return this;
}
/**
* Set the expiration {@link java.util.Date} of the cookie.
* @param date The date to set
* @return The builder
*/
public Builder setExpiryDate(Date date) {
notNull(date, "Cookie expiry date");
this.expiryDate = date;
return this;
}
/**
* Set domain attribute of the cookie. The value of the Domain
* attribute specifies the domain for which the cookie is valid.
* @param domain The domain
* @return The builder
*/
public Builder setDomain(String domain) {
notNull(domain, "Cookie domain");
this.domain = domain;
return this;
}
/**
* Set the path attribute of the cookie. The value of the Path
* attribute specifies the subset of URLs on the origin server to which
* this cookie applies.
* @param path The path
* @return The builder
*/
public Builder setPath(String path) {
notNull(path, "Cookie path");
this.path = path;
return this;
}
/**
* Set the maximum age of the cookie, specified in seconds,
* By default, -1
indicating the cookie will persist
* until browser shutdown.
*
* @return an integer specifying the maximum age of the cookie in seconds; if negative, means the cookie persists until browser shutdown
*/
public Builder setMaxAge(long maxAge) {
this.maxAge = maxAge;
return this;
}
/**
* Indicates to the browser whether the cookie should only be sent using a secure protocol, such as HTTPS or SSL.
* The default value is false.
* @param secured true
if secured
* @return The builder
*/
public Builder setSecured(boolean secured) {
this.secured = secured;
return this;
}
/**
* Indicates that the cookie is only readable by the HTTP server and not other API's such as JavaScript.
* The default value is false.
* @param httpOnly true
if httpOnly
* @return The builder
*/
public Builder setHttpOnly(boolean httpOnly) {
this.httpOnly = httpOnly;
return this;
}
/**
Sets the version of the cookie protocol this cookie complies with. Version 0 complies with the original Netscape cookie specification. Version 1 complies with RFC 2109.
Since RFC 2109 is still somewhat new, consider version 1 as experimental; do not use it yet on production sites.
Parameters:
* @param version 0 if the cookie should comply with the original Netscape specification; 1 if the cookie should comply with RFC 2109
* @return The builder
*/
public Builder setVersion(int version) {
if (version < 0) {
throw new IllegalArgumentException("Version cannot be less than 0");
} else if (version > 1) {
throw new IllegalArgumentException("Version cannot be greater than 1");
}
this.version = version;
return this;
}
/**
* Set the SameSite attribute of the cookie. The SameSite cookie attribute restricts browser behavior. It may prevent the browser
* from sending the cookie's key-value pair based on the type of interaction that triggered the HTTP request.
* @param sameSite The SameSite attribute
* @return The builder
*/
public Builder setSameSite(String sameSite) {
notNull(sameSite, "Cookie SameSite attribute");
this.sameSite = sameSite;
return this;
}
/**
* Build a Cookie from the specified parameters.
* @return The Cookie
*/
public Cookie build() {
return new Cookie(name, value, comment, expiryDate, domain, path, secured, httpOnly, version, maxAge, sameSite);
}
}
}