//
// ========================================================================
// Copyright (c) 1995-2020 Mort Bay Consulting Pty Ltd and others.
//
// This program and the accompanying materials are made available under
// the terms of the Eclipse Public License 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0
//
// This Source Code may also be made available under the following
// Secondary Licenses when the conditions for such availability set
// forth in the Eclipse Public License, v. 2.0 are satisfied:
// the Apache License v2.0 which is available at
// https://www.apache.org/licenses/LICENSE-2.0
//
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
// ========================================================================
//

package org.eclipse.jetty.server;

import java.util.ArrayList;
import java.util.List;

import jakarta.servlet.http.Cookie;
import org.eclipse.jetty.http.ComplianceViolation;
import org.eclipse.jetty.http.CookieCompliance;
import org.eclipse.jetty.http.CookieCutter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Cookie parser

Optimized stateful cookie parser. Cookies fields are added with the addCookieField(String) method and parsed on the next subsequent call to getCookies(). If the added fields are identical to those last added (as strings), then the cookies are not re parsed.

/** * Cookie parser * <p>Optimized stateful cookie parser. Cookies fields are added with the * {@link #addCookieField(String)} method and parsed on the next subsequent * call to {@link #getCookies()}. * If the added fields are identical to those last added (as strings), then the * cookies are not re parsed. */
public class Cookies extends CookieCutter { protected static final Logger LOG = LoggerFactory.getLogger(Cookies.class); protected final List<String> _rawFields = new ArrayList<>(); protected final List<Cookie> _cookieList = new ArrayList<>(); private int _addedFields; private boolean _parsed = false; private Cookie[] _cookies; private boolean _set = false; public Cookies() { this(CookieCompliance.RFC6265, null); } public Cookies(CookieCompliance compliance, ComplianceViolation.Listener complianceListener) { super(compliance, complianceListener); } public void addCookieField(String rawField) { if (_set) throw new IllegalStateException(); if (rawField == null) return; rawField = rawField.trim(); if (rawField.length() == 0) return; if (_rawFields.size() > _addedFields) { if (rawField.equals(_rawFields.get(_addedFields))) { _addedFields++; return; } while (_rawFields.size() > _addedFields) { _rawFields.remove(_addedFields); } } _rawFields.add(_addedFields++, rawField); _parsed = false; } public Cookie[] getCookies() { if (_set) return _cookies; while (_rawFields.size() > _addedFields) { _rawFields.remove(_addedFields); _parsed = false; } if (_parsed) return _cookies; parseFields(_rawFields); _cookies = (Cookie[])_cookieList.toArray(new Cookie[_cookieList.size()]); _cookieList.clear(); _parsed = true; return _cookies; } public void setCookies(Cookie[] cookies) { _cookies = cookies; _set = true; } public void reset() { if (_set) _cookies = null; _set = false; _addedFields = 0; } @Override protected void addCookie(String name, String value, String domain, String path, int version, String comment) { try { Cookie cookie = new Cookie(name, value); if (domain != null) cookie.setDomain(domain); if (path != null) cookie.setPath(path); if (version > 0) cookie.setVersion(version); if (comment != null) cookie.setComment(comment); _cookieList.add(cookie); } catch (Exception e) { LOG.debug("Unable to add Cookie name={}, value={}, domain={}, path={}, version={}, comment={}", name, value, domain, path, version, comment, e); } } }