/* * $Header: $ * $Revision$ * $Date$ * ==================================================================== * * 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. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * */ package org.apache.commons.httpclient.cookie; import junit.framework.Test; import junit.framework.TestSuite; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.Header; import java.util.Date; /** * Test cases for RFC2965 cookie spec * * @author jain.samit@gmail.com (Samit Jain) */ public class TestCookieRFC2965Spec extends TestCookieBase { // ------------------------------------------------------------ Constructor public TestCookieRFC2965Spec(String name) { super(name); } // ------------------------------------------------------- TestCase Methods public static Test suite() { return new TestSuite(TestCookieRFC2965Spec.class); } // ------------------------------------------------------- Test Cookie Parsing /** * Test parse with invalid params. */ public void testParseInvalidParams() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); try { // invalid header cookiespec.parse("www.domain.com", 80, "/", false, (Header) null /* header */); fail("IllegalArgumentException must have been thrown"); } catch (IllegalArgumentException expected) {} Header header = new Header("Set-Cookie2", "name=value;Version=1"); try { // invalid request host cookiespec.parse(null /* host */, 80, "/", false, header); fail("IllegalArgumentException must have been thrown"); } catch (IllegalArgumentException expected) {} try { // invalid request port cookiespec.parse("www.domain.com", -32 /* port */, "/", false, header); fail("IllegalArgumentException must have been thrown"); } catch (IllegalArgumentException expected) {} try { // invalid request path cookiespec.parse("www.domain.com", 80, null /* path */, false, header); fail("IllegalArgumentException must have been thrown"); } catch (IllegalArgumentException expected) {} } /** * Test parsing cookie "Path" attribute. */ public void testParsePath() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Path=/;Version=1;Path="); Cookie[] parsed = cookiespec.parse("www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); // only the first occurence of path attribute is considered, others ignored Cookie2 cookie = (Cookie2) parsed[0]; assertEquals("/", cookie.getPath()); assertTrue(cookie.isPathAttributeSpecified()); } public void testParsePathDefault() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); // Path is OPTIONAL, defaults to the request path Header header = new Header("Set-Cookie2", "name=value;Version=1"); Cookie[] parsed = cookiespec.parse("www.domain.com", 80, "/path" /* request path */, false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; assertEquals("/path", cookie.getPath()); assertFalse(cookie.isPathAttributeSpecified()); } public void testParseNullPath() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Path=;Version=1"); try { cookiespec.parse("www.domain.com", 80, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException ex) { // expected } } public void testParseBlankPath() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Path=\" \";Version=1"); try { cookiespec.parse("www.domain.com", 80, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException ex) { // expected } } /** * Test parsing cookie "Domain" attribute. */ public void testParseDomain() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Domain=.domain.com;Version=1;Domain="); Cookie[] parsed = cookiespec.parse("www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); // only the first occurence of domain attribute is considered, others ignored Cookie2 cookie = (Cookie2) parsed[0]; assertEquals(".domain.com", cookie.getDomain()); assertTrue(cookie.isDomainAttributeSpecified()); // should put a leading dot if there is no dot in front of domain header = new Header("Set-Cookie2", "name=value;Domain=domain.com;Version=1"); parsed = cookiespec.parse("www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); cookie = (Cookie2) parsed[0]; assertEquals(".domain.com", cookie.getDomain()); } public void testParseDomainDefault() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); // Domain is OPTIONAL, defaults to the request host Header header = new Header("Set-Cookie2", "name=value;Version=1"); Cookie[] parsed = cookiespec.parse("www.domain.com" /* request host */, 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; assertEquals("www.domain.com", cookie.getDomain()); assertFalse(cookie.isDomainAttributeSpecified()); } public void testParseNullDomain() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); // domain cannot be null Header header = new Header("Set-Cookie2", "name=value;Domain=;Version=1"); try { cookiespec.parse("www.domain.com", 80, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException ex) { // expected } } public void testParseBlankDomain() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Domain=\" \";Version=1"); try { cookiespec.parse("www.domain.com", 80, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException ex) { // expected } } /** * Test parsing cookie "Port" attribute. */ public void testParsePort() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Port=\"80,800,8000\";Version=1;Port=nonsense"); Cookie[] parsed = cookiespec.parse("www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); // only the first occurence of port attribute is considered, others ignored Cookie2 cookie = (Cookie2) parsed[0]; int[] ports = cookie.getPorts(); assertNotNull(ports); assertEquals(3, ports.length); assertEquals(80, ports[0]); assertEquals(800, ports[1]); assertEquals(8000, ports[2]); assertTrue(cookie.isPortAttributeSpecified()); } public void testParsePortDefault() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); // Port is OPTIONAL, cookie can be accepted from any port Header header = new Header("Set-Cookie2", "name=value;Version=1"); Cookie[] parsed = cookiespec.parse("www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; assertFalse(cookie.isPortAttributeSpecified()); } public void testParseNullPort() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); // null port defaults to request port Header header = new Header("Set-Cookie2", "name=value;Port=;Version=1"); Cookie[] parsed = cookiespec.parse("www.domain.com", 80 /* request port */, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; int[] ports = cookie.getPorts(); assertNotNull(ports); assertEquals(1, ports.length); assertEquals(80, ports[0]); assertTrue(cookie.isPortAttributeSpecified() && cookie.isPortAttributeBlank()); } public void testParseBlankPort() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); // blank port defaults to request port Header header = new Header("Set-Cookie2", "name=value;Port=\" \";Version=1"); Cookie[] parsed = cookiespec.parse("www.domain.com", 80 /* request port */, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; int[] ports = cookie.getPorts(); assertNotNull(ports); assertEquals(1, ports.length); assertEquals(80, ports[0]); assertTrue(cookie.isPortAttributeSpecified() && cookie.isPortAttributeBlank()); } public void testParseInvalidPort() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Port=nonsense;Version=1"); try { cookiespec.parse("www.domain.com", 80, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException ex) { // expected } } public void testParseNegativePort() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Port=\"80,-800,8000\";Version=1"); try { cookiespec.parse("www.domain.com", 80, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException ex) { // expected } } /** * test parsing cookie name/value. */ public void testParseNameValue() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Version=1;"); Cookie[] parsed = cookiespec.parse("www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; assertEquals("name", cookie.getName()); assertEquals("value", cookie.getValue()); } /** * test parsing cookie "Version" attribute. */ public void testParseVersion() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Version=1;"); Cookie[] parsed = cookiespec.parse("www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; assertEquals(1, cookie.getVersion()); assertTrue(cookie.isVersionAttributeSpecified()); } public void testParseNullVersion() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); // version cannot ne null Header header = new Header("Set-Cookie2", "name=value;Version=;"); try { cookiespec.parse("www.domain.com", 80, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException ex) { // expected } } public void testParseNegativeVersion() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Version=-1;"); try { cookiespec.parse("www.domain.com", 80, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException ex) { // expected } } /** * test parsing cookie "Max-age" attribute. */ public void testParseMaxage() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Max-age=3600;Version=1;Max-age=nonsense"); Cookie[] parsed = cookiespec.parse("www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); // only the first occurence of max-age attribute is considered, others ignored Cookie2 cookie = (Cookie2) parsed[0]; assertFalse(cookie.isExpired()); } public void testParseMaxageDefault() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); // Max-age is OPTIONAL, defaults to session cookie Header header = new Header("Set-Cookie2", "name=value;Version=1"); Cookie[] parsed = cookiespec.parse("www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; assertFalse(cookie.isPersistent()); } public void testParseNullMaxage() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Max-age=;Version=1"); try { cookiespec.parse("www.domain.com", 80, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException ex) { // expected } } public void testParseNegativeMaxage() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Max-age=-3600;Version=1;"); try { cookiespec.parse("www.domain.com", 80, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException ex) { // expected } } /** * test parsing "Secure" attribute. */ public void testParseSecure() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Secure;Version=1"); Cookie[] parsed = cookiespec.parse("www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; assertTrue(cookie.getSecure()); } /** * test parsing "Discard" attribute. */ public void testParseDiscard() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Discard;Max-age=36000;Version=1"); Cookie[] parsed = cookiespec.parse("www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; // discard overrides max-age assertFalse(cookie.isPersistent()); // Discard is OPTIONAL, default behavior is dictated by max-age header = new Header("Set-Cookie2", "name=value;Max-age=36000;Version=1"); parsed = cookiespec.parse("www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); cookie = (Cookie2) parsed[0]; assertTrue(cookie.isPersistent()); } /** * test parsing "Comment", "CommentURL" and * "Secure" attributes. */ public void testParseOtherAttributes() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Comment=\"good cookie\";" + "CommentURL=\"www.domain.com/goodcookie/\";Secure;Version=1"); Cookie[] parsed = cookiespec.parse("www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; assertEquals("good cookie", cookie.getComment()); assertEquals("www.domain.com/goodcookie/", cookie.getCommentURL()); assertTrue(cookie.getSecure()); // Comment, CommentURL, Secure are OPTIONAL header = new Header("Set-Cookie2", "name=value;Version=1"); parsed = cookiespec.parse("www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); cookie = (Cookie2) parsed[0]; assertFalse(cookie.getSecure()); } /** * Test parsing header with 2 cookies (separated by comma) */ public void testCookiesWithComma() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "a=b,c"); Cookie[] parsed = cookiespec.parse("www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(2, parsed.length); assertEquals("a", parsed[0].getName()); assertEquals("b", parsed[0].getValue()); assertEquals("c", parsed[1].getName()); assertEquals(null, parsed[1].getValue()); } // ------------------------------------------------------- Test Cookie Validation /** * Test Domain validation when domain is not specified * in Set-Cookie2 header. */ public void testValidateNoDomain() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Version=1"); Cookie[] parsed = cookieParse(cookiespec, "www.domain.com" /* request host */, 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; // cookie domain must string match request host assertEquals("www.domain.com", cookie.getDomain()); } /** * Test Domain validation. Cookie domain attribute must have a * leading dot. */ public void testValidateDomainLeadingDot() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;Domain=domain.com;Version=1"); Cookie[] parsed = cookieParse(cookiespec, "www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; assertEquals(".domain.com", cookie.getDomain()); } /** * Test Domain validation. Domain must have atleast one embedded dot. */ public void testValidateDomainEmbeddedDot() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value; domain=.com; version=1"); try { cookieParse(cookiespec, "b.com", 80, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException expected) {} header = new Header("Set-Cookie2", "name=value;Domain=domain.com;Version=1"); Cookie[] parsed = cookieParse(cookiespec, "www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); } /** * Test local Domain validation. Simple host names * (without any dots) are valid only when cookie domain is specified * as ".local". */ public void testValidateDomainLocal() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); // when domain is specified as .local, simple host names are valid Header header = new Header("Set-Cookie2", "name=value; domain=.local; version=1"); Cookie[] parsed = cookieParse(cookiespec, "simplehost" /* request host */, 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; assertEquals(".local", cookie.getDomain()); // when domain is NOT specified as .local, simple host names are invalid header = new Header("Set-Cookie2", "name=value; domain=domain.com; version=1"); try { // since domain is not .local, this must fail parsed = cookieParse(cookiespec, "simplehost" /* request host */, 80, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException expected) {} } /** * Test Domain validation. Effective host name * must domain-match domain attribute. */ public void testValidateDomainEffectiveHost() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); // cookie domain does not domain-match request host Header header = new Header("Set-Cookie2", "name=value; domain=.domain.com; version=1"); try { cookieParse(cookiespec, "www.domain.org" /* request host */, 80, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException expected) {} // cookie domain domain-matches request host header = new Header("Set-Cookie2", "name=value; domain=.domain.com; version=1"); Cookie[] parsed = cookieParse(cookiespec, "www.domain.com" /* request host */, 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); } /** * Test local Domain validation. * Effective host name minus domain must not contain any dots. */ public void testValidateDomainIllegal() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value; domain=.domain.com; version=1"); try { cookieParse(cookiespec, "a.b.domain.com" /* request host */, 80, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException expected) {} } /** * Test cookie Path validation. Cookie path attribute must path-match * request path. */ public void testValidatePath() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie2", "name=value;path=/path;version=1"); try { cookieParse(cookiespec, "www.domain.com", 80, "/" /* request path */, false, header); fail("MalformedCookieException exception should have been thrown"); } catch (MalformedCookieException expected) {} // path-matching is case-sensitive header = new Header("Set-Cookie2", "name=value;path=/Path;version=1"); try { cookieParse(cookiespec, "www.domain.com", 80, "/path" /* request path */, false, header); fail("MalformedCookieException exception should have been thrown"); } catch (MalformedCookieException expected) {} header = new Header("Set-Cookie2", "name=value;path=/path;version=1"); Cookie[] parsed = cookieParse(cookiespec, "www.domain.com", 80, "/path/path1" /* request path */, false, header); assertNotNull(parsed); assertEquals(1, parsed.length); assertEquals("/path", parsed[0].getPath()); } /** * Test cookie name validation. */ public void testValidateCookieName() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); // cookie name must not contain blanks Header header = new Header("Set-Cookie2", "invalid name=value; version=1"); try { cookieParse(cookiespec, "127.0.0.1", 80, "/", false, header); fail("MalformedCookieException exception should have been thrown"); } catch (MalformedCookieException expected) {} // cookie name must not start with '$'. header = new Header("Set-Cookie2", "$invalid_name=value; version=1"); try { cookieParse(cookiespec, "127.0.0.1", 80, "/", false, header); fail("MalformedCookieException exception should have been thrown"); } catch (MalformedCookieException expected) {} // valid name header = new Header("Set-Cookie2", "name=value; version=1"); Cookie[] parsed = cookieParse(cookiespec, "www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; assertEquals("name", cookie.getName()); assertEquals("value", cookie.getValue()); } /** * Test cookie Port validation. Request port must be in the * port attribute list. */ public void testValidatePort() throws Exception { Header header = new Header("Set-Cookie2", "name=value; Port=\"80,800\"; version=1"); CookieSpec cookiespec = new RFC2965Spec(); try { cookieParse(cookiespec, "www.domain.com", 8000 /* request port */, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException e) {} // valid port list Cookie[] parsed = cookieParse(cookiespec, "www.domain.com", 80 /* request port */, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); Cookie2 cookie = (Cookie2) parsed[0]; int[] ports = cookie.getPorts(); assertNotNull(ports); assertEquals(2, ports.length); assertEquals(80, ports[0]); assertEquals(800, ports[1]); } /** * Test cookie Version validation. */ public void testValidateVersion() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); // version attribute is REQUIRED Header header = new Header("Set-Cookie2", "name=value"); try { cookieParse(cookiespec, "www.domain.com", 8000, "/", false, header); fail("MalformedCookieException should have been thrown"); } catch (MalformedCookieException e) {} } // ------------------------------------------------------- Test Cookie Matching /** * test cookie Path matching. Cookie path attribute must path-match * path of the request URI. */ public void testMatchPath() throws Exception { Cookie2 cookie = new Cookie2(".domain.com", "name", "value", "/path" /* path */, null, false, new int[] {80}); CookieSpec cookiespec = new RFC2965Spec(); assertFalse(cookiespec.match("www.domain.com", 80, "/" /* request path */, false, cookie)); assertTrue(cookiespec.match("www.domain.com", 80, "/path/path1" /* request path */, false, cookie)); } /** * test cookie Domain matching. */ public void testMatchDomain() throws Exception { Cookie2 cookie = new Cookie2(".domain.com" /* domain */, "name", "value", "/", null, false, new int[] {80}); CookieSpec cookiespec = new RFC2965Spec(); // effective host name minus domain must not contain any dots assertFalse(cookiespec.match("a.b.domain.com" /* request host */, 80, "/", false, cookie)); // The effective host name MUST domain-match the Domain // attribute of the cookie. assertFalse(cookiespec.match("www.domain.org" /* request host */, 80, "/", false, cookie)); assertTrue(cookiespec.match("www.domain.com" /* request host */, 80, "/", false, cookie)); } /** * test cookie local Domain matching. */ public void testMatchDomainLocal() throws Exception { Cookie2 cookie = new Cookie2(".local" /* domain */, "name", "value", "/", null, false, new int[] {80}); CookieSpec cookiespec = new RFC2965Spec(); assertTrue(cookiespec.match("host" /* request host */, 80, "/", false, cookie)); assertFalse(cookiespec.match("host.com" /* request host */, 80, "/", false, cookie)); } /** * test cookie Port matching. */ public void testMatchPort() throws Exception { // cookie can be sent to any port if port attribute not specified Cookie2 cookie = new Cookie2(".domain.com", "name", "value", "/", null, false, null /* ports */); CookieSpec cookiespec = new RFC2965Spec(); cookie.setPortAttributeSpecified(false); assertTrue(cookiespec.match("www.domain.com", 8080 /* request port */, "/", false, cookie)); assertTrue(cookiespec.match("www.domain.com", 323 /* request port */, "/", false, cookie)); // otherwise, request port must be in cookie's port list cookie = new Cookie2(".domain.com", "name", "value", "/", null, false, new int[] {80, 8080} /* ports */); cookie.setPortAttributeSpecified(true); assertFalse(cookiespec.match("www.domain.com", 434 /* request port */, "/", false, cookie)); assertTrue(cookiespec.match("www.domain.com", 8080 /* request port */, "/", false, cookie)); } /** * test cookie expiration. */ public void testCookieExpiration() throws Exception { Date afterOneHour = new Date(System.currentTimeMillis() + 3600 * 1000L); Cookie2 cookie = new Cookie2(".domain.com", "name", "value", "/", afterOneHour /* expiry */, false, null); CookieSpec cookiespec = new RFC2965Spec(); assertTrue(cookiespec.match("www.domain.com", 80, "/", false, cookie)); Date beforeOneHour = new Date(System.currentTimeMillis() - 3600 * 1000L); cookie = new Cookie2(".domain.com", "name", "value", "/", beforeOneHour /* expiry */, false, null); assertFalse(cookiespec.match("www.domain.com", 80, "/", false, cookie)); // discard attributes overrides cookie age, makes it a session cookie. cookie.setDiscard(true); assertFalse(cookie.isPersistent()); assertTrue(cookiespec.match("www.domain.com", 80, "/", false, cookie)); } /** * test cookie Secure attribute. */ public void testCookieSecure() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); // secure cookie can only be sent over a secure connection Cookie2 cookie = new Cookie2(".domain.com", "name", "value", "/", null, true /* secure */, null); assertFalse(cookiespec.match("www.domain.com", 80, "/", false /* request secure */, cookie)); assertTrue(cookiespec.match("www.domain.com", 80, "/", true /* request secure */, cookie)); } // ------------------------------------------------------- Test Cookie Formatting public void testFormatInvalidCookie() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); try { cookiespec.formatCookie(null); fail("IllegalArgumentException nust have been thrown"); } catch (IllegalArgumentException expected) {} } /** * Tests RFC 2965 compliant cookie formatting. */ public void testRFC2965CookieFormatting() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Cookie2 cookie1 = new Cookie2(".domain.com", "name1", "value", "/", null, false, new int[] {80,8080}); cookie1.setVersion(1); // domain, path, port specified cookie1.setDomainAttributeSpecified(true); cookie1.setPathAttributeSpecified(true); cookie1.setPortAttributeSpecified(true); assertEquals("$Version=\"1\"; name1=\"value\"; $Domain=\".domain.com\"; $Path=\"/\"; $Port=\"80,8080\"", cookiespec.formatCookie(cookie1)); Cookie2 cookie2 = new Cookie2(".domain.com", "name2", "value", "/a/", null, false, new int[] {80,8080}); cookie2.setVersion(2); // domain, path specified but port unspecified cookie2.setDomainAttributeSpecified(true); cookie2.setPathAttributeSpecified(true); cookie2.setPortAttributeSpecified(false); assertEquals("$Version=\"2\"; name2=\"value\"; $Domain=\".domain.com\"; $Path=\"/a/\"", cookiespec.formatCookie(cookie2)); Cookie2 cookie3 = new Cookie2(".domain.com", "name3", "value", "/a/b/", null, false, new int[] {80,8080}); cookie3.setVersion(1); // path specified, port specified but blank, domain unspecified cookie3.setDomainAttributeSpecified(false); cookie3.setPathAttributeSpecified(true); cookie3.setPortAttributeSpecified(true); cookie3.setPortAttributeBlank(true); assertEquals("$Version=\"1\"; name3=\"value\"; $Path=\"/a/b/\"; $Port=\"\"", cookiespec.formatCookie(cookie3)); assertEquals("$Version=\"2\"; " + "name3=\"value\"; $Path=\"/a/b/\"; $Port=\"\"; " + "name2=\"value\"; $Domain=\".domain.com\"; $Path=\"/a/\"; " + "name1=\"value\"; $Domain=\".domain.com\"; $Path=\"/\"; $Port=\"80,8080\"", cookiespec.formatCookies(new Cookie[] {cookie3, cookie2, cookie1})); } /** * Tests RFC 2965 compliant cookies formatting. */ public void testRFC2965CookiesFormatting() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Cookie2 cookie1 = new Cookie2(".domain.com", "name1", "value1", "/", null, false, new int[] {80,8080}); cookie1.setVersion(1); // domain, path, port specified cookie1.setDomainAttributeSpecified(true); cookie1.setPathAttributeSpecified(true); cookie1.setPortAttributeSpecified(true); Cookie2 cookie2 = new Cookie2(".domain.com", "name2", null, "/", null, false, null); cookie2.setVersion(1); // value null, domain, path, port specified cookie2.setDomainAttributeSpecified(true); cookie2.setPathAttributeSpecified(true); cookie2.setPortAttributeSpecified(false); Cookie[] cookies = new Cookie[] {cookie1, cookie2}; assertEquals("$Version=\"1\"; name1=\"value1\"; $Domain=\".domain.com\"; $Path=\"/\"; $Port=\"80,8080\"; " + "name2=\"\"; $Domain=\".domain.com\"; $Path=\"/\"", cookiespec.formatCookies(cookies)); } // ------------------------------------------------------- Backward compatibility tests /** * Test backward compatibility with Set-Cookie header. */ public void testCompatibilityWithSetCookie() throws Exception { CookieSpec cookiespec = new RFC2965Spec(); Header header = new Header("Set-Cookie", "name=value; domain=.domain.com; version=1"); Cookie[] parsed = cookieParse(cookiespec, "www.domain.com", 80, "/", false, header); assertNotNull(parsed); assertEquals(1, parsed.length); assertEquals("name", parsed[0].getName()); assertEquals("value", parsed[0].getValue()); assertEquals(".domain.com", parsed[0].getDomain()); assertEquals("/", parsed[0].getPath()); } }