blob: b74a851a165dde75f04e717e9f2d5ed7e2fc3711 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.tomcat.util.http;
import jakarta.servlet.http.Cookie;
import org.junit.Assert;
import org.junit.Test;
public class TestCookieProcessorGeneration {
@Test
public void simpleCookie() {
doTest(new Cookie("foo", "bar"), "foo=bar");
}
@Test
public void nullValue() {
doTest(new Cookie("foo", null), "foo=");
}
@Test
public void quotedValue() {
doTest(new Cookie("foo", "\"bar\""), "foo=\"bar\"");
}
@Test
public void valueContainsSemicolon() {
doTest(new Cookie("foo", "a;b"), null);
}
@Test
public void valueContainsComma() {
doTest(new Cookie("foo", "a,b"), null);
}
@Test
public void valueContainsSpace() {
doTest(new Cookie("foo", "a b"), null);
}
@Test
public void valueContainsEquals() {
doTest(new Cookie("foo", "a=b"), "foo=a=b");
}
@Test
public void valueContainsQuote() {
Cookie cookie = new Cookie("foo", "a\"b");
doTest(cookie, null);
}
@Test
public void valueContainsNonV0Separator() {
Cookie cookie = new Cookie("foo", "a()<>@:\\\"/[]?={}b");
doTest(cookie, null);
}
@Test
public void valueContainsBackslash() {
Cookie cookie = new Cookie("foo", "a\\b");
doTest(cookie, null);
}
@Test
public void valueContainsBackslashAtEnd() {
Cookie cookie = new Cookie("foo", "a\\");
doTest(cookie, null);
}
@Test
public void valueContainsBackslashAndQuote() {
Cookie cookie = new Cookie("foo", "a\"b\\c");
doTest(cookie, null);
}
@Test
public void valueUTF8() {
String value = "\u2300";
Cookie cookie = new Cookie("foo", value);
doTest(cookie, "foo=" + value);
}
@Test
public void testMaxAgePositive() {
doTestMaxAge(100, "foo=bar; Max-Age=100");
}
@Test
public void testMaxAgeZero() {
doTestMaxAge(0, "foo=bar; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:10 GMT");
}
@Test
public void testMaxAgeNegative() {
doTestMaxAge(-100, "foo=bar");
}
@Test
public void testDomainValid01() {
doTestDomain("example.com", "foo=bar; Domain=example.com");
}
@Test
public void testDomainValid02() {
doTestDomain("exa-mple.com", "foo=bar; Domain=exa-mple.com");
}
@Test
public void testDomainInvalid01() {
doTestDomain("example.com.", null);
}
@Test
public void testDomainInvalid02() {
doTestDomain("example.com-", null);
}
@Test
public void testDomainInvalid03() {
doTestDomain(".example.com.", null);
}
@Test
public void testDomainInvalid04() {
doTestDomain("-example.com.", null);
}
@Test
public void testDomainInvalid05() {
doTestDomain("example..com.", null);
}
@Test
public void testDomainInvalid06() {
doTestDomain("example-.com.", null);
}
@Test
public void testDomainInvalid07() {
doTestDomain("exam$ple.com.", null);
}
@Test
public void testPathValid() {
doTestPath("/example", "foo=bar; Path=/example");
}
@Test
public void testPathInvalid01() {
doTestPath("exa\tmple", null);
}
@Test
public void testSameSiteCookies() {
Rfc6265CookieProcessor rfc6265 = new Rfc6265CookieProcessor();
Cookie cookie = new Cookie("foo", "bar");
Assert.assertEquals("foo=bar", rfc6265.generateHeader(cookie, null));
rfc6265.setSameSiteCookies("unset");
Assert.assertEquals("foo=bar", rfc6265.generateHeader(cookie, null));
rfc6265.setSameSiteCookies("none");
Assert.assertEquals("foo=bar; SameSite=None", rfc6265.generateHeader(cookie, null));
rfc6265.setSameSiteCookies("lax");
Assert.assertEquals("foo=bar; SameSite=Lax", rfc6265.generateHeader(cookie, null));
rfc6265.setSameSiteCookies("strict");
Assert.assertEquals("foo=bar; SameSite=Strict", rfc6265.generateHeader(cookie, null));
cookie.setSecure(true);
cookie.setHttpOnly(true);
rfc6265.setSameSiteCookies("unset");
Assert.assertEquals("foo=bar; Secure; HttpOnly", rfc6265.generateHeader(cookie, null));
rfc6265.setSameSiteCookies("none");
Assert.assertEquals("foo=bar; Secure; HttpOnly; SameSite=None", rfc6265.generateHeader(cookie, null));
rfc6265.setSameSiteCookies("lax");
Assert.assertEquals("foo=bar; Secure; HttpOnly; SameSite=Lax", rfc6265.generateHeader(cookie, null));
rfc6265.setSameSiteCookies("strict");
Assert.assertEquals("foo=bar; Secure; HttpOnly; SameSite=Strict", rfc6265.generateHeader(cookie, null));
}
private void doTest(Cookie cookie, String expectedRfc6265) {
CookieProcessor rfc6265 = new Rfc6265CookieProcessor();
doTest(cookie, rfc6265, expectedRfc6265);
}
private void doTest(Cookie cookie, CookieProcessor cookieProcessor, String expected) {
if (expected == null) {
IllegalArgumentException e = null;
try {
cookieProcessor.generateHeader(cookie, null);
} catch (IllegalArgumentException iae) {
e = iae;
}
Assert.assertNotNull("Failed to throw IAE", e);
} else {
if (cookieProcessor instanceof Rfc6265CookieProcessor &&
cookie.getMaxAge() > 0) {
// Expires attribute will depend on time cookie is generated so
// use a modified test
Assert.assertTrue(cookieProcessor.generateHeader(cookie, null).startsWith(expected));
} else {
Assert.assertEquals(expected, cookieProcessor.generateHeader(cookie, null));
}
}
}
private void doTestMaxAge(int age, String expectedRfc6265) {
Cookie cookie = new Cookie("foo", "bar");
cookie.setMaxAge(age);
doTest(cookie, new Rfc6265CookieProcessor(), expectedRfc6265);
}
private void doTestDomain(String domain, String expectedRfc6265) {
Cookie cookie = new Cookie("foo", "bar");
cookie.setDomain(domain);
doTest(cookie, new Rfc6265CookieProcessor(), expectedRfc6265);
}
private void doTestPath(String path, String expectedRfc6265) {
Cookie cookie = new Cookie("foo", "bar");
cookie.setPath(path);
doTest(cookie, new Rfc6265CookieProcessor(), expectedRfc6265);
}
}