package io.vertx.core.http.impl;
import io.netty.handler.codec.http.cookie.DefaultCookie;
import io.netty.handler.codec.http.cookie.ServerCookieDecoder;
import io.netty.handler.codec.http.cookie.ServerCookieEncoder;
import io.vertx.core.http.Cookie;
import io.vertx.core.http.CookieSameSite;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class CookieImpl implements ServerCookie {
static Map<String, ServerCookie> (CharSequence cookieHeader) {
if (cookieHeader != null) {
Set<io.netty.handler.codec.http.cookie.Cookie> nettyCookies = ServerCookieDecoder.STRICT.decode(cookieHeader.toString());
Map<String, ServerCookie> cookies = new HashMap<>(nettyCookies.size());
for (io.netty.handler.codec.http.cookie.Cookie cookie : nettyCookies) {
ServerCookie ourCookie = new CookieImpl(cookie);
cookies.put(ourCookie.getName(), ourCookie);
}
return cookies;
} else {
return new HashMap<>(4);
}
}
static Cookie removeCookie(Map<String, ServerCookie> cookieMap, String name, boolean invalidate) {
ServerCookie cookie = cookieMap.get(name);
if (cookie != null) {
if (invalidate && cookie.isFromUserAgent()) {
cookie.setMaxAge(0L);
cookie.setValue("");
} else {
cookieMap.remove(name);
}
}
return cookie;
}
private final io.netty.handler.codec.http.cookie.Cookie nettyCookie;
private boolean changed;
private boolean fromUserAgent;
private CookieSameSite sameSite;
public CookieImpl(String name, String value) {
this.nettyCookie = new DefaultCookie(name, value);
this.changed = true;
}
public CookieImpl(io.netty.handler.codec.http.cookie.Cookie nettyCookie) {
this.nettyCookie = nettyCookie;
fromUserAgent = true;
}
@Override
public String getValue() {
return nettyCookie.value();
}
@Override
public Cookie setValue(final String value) {
nettyCookie.setValue(value);
this.changed = true;
return this;
}
@Override
public String getName() {
return nettyCookie.name();
}
@Override
public Cookie setDomain(final String domain) {
nettyCookie.setDomain(domain);
this.changed = true;
return this;
}
@Override
public String getDomain() {
return nettyCookie.domain();
}
@Override
public Cookie setPath(final String path) {
nettyCookie.setPath(path);
this.changed = true;
return this;
}
@Override
public String getPath() {
return nettyCookie.path();
}
@Override
public Cookie setMaxAge(final long maxAge) {
nettyCookie.setMaxAge(maxAge);
this.changed = true;
return this;
}
@Override
public Cookie setSecure(final boolean secure) {
nettyCookie.setSecure(secure);
this.changed = true;
return this;
}
@Override
public boolean isSecure() {
return nettyCookie.isSecure();
}
@Override
public Cookie setHttpOnly(final boolean httpOnly) {
nettyCookie.setHttpOnly(httpOnly);
this.changed = true;
return this;
}
@Override
public boolean isHttpOnly() {
return nettyCookie.isHttpOnly();
}
@Override
public Cookie setSameSite(final CookieSameSite sameSite) {
this.sameSite = sameSite;
this.changed = true;
return this;
}
@Override
public CookieSameSite getSameSite() {
return this.sameSite;
}
@Override
public String encode() {
if (sameSite != null) {
return ServerCookieEncoder.STRICT.encode(nettyCookie) + "; SameSite=" + sameSite.toString();
} else {
return ServerCookieEncoder.STRICT.encode(nettyCookie);
}
}
public boolean isChanged() {
return changed;
}
public void setChanged(boolean changed) {
this.changed = changed;
}
public boolean isFromUserAgent() {
return fromUserAgent;
}
}