private boolean hasCookieExpired(Cookie cookie, long whenCreated) { // if not specify max-age, this cookie should be discarded when user agent is to be closed, but it is not expired. if (cookie.maxAge() == Cookie.UNDEFINED_MAX_AGE) return false; if (cookie.maxAge() <= 0) return true; if (whenCreated > 0) { long deltaSecond = (System.currentTimeMillis() - whenCreated) / 1000; return deltaSecond > cookie.maxAge(); } else return false; }
@Override public long getMaxAge() { return nettyCookie.maxAge(); }
@Override public MultiValueMap<String, ResponseCookie> getCookies() { MultiValueMap<String, ResponseCookie> result = new LinkedMultiValueMap<>(); this.response.cookies().values().stream().flatMap(Collection::stream) .forEach(cookie -> result.add(cookie.name(), ResponseCookie.from(cookie.name(), cookie.value()) .domain(cookie.domain()) .path(cookie.path()) .maxAge(cookie.maxAge()) .secure(cookie.isSecure()) .httpOnly(cookie.isHttpOnly()) .build())); return CollectionUtils.unmodifiableMultiValueMap(result); }
private void add(String requestDomain, String requestPath, Cookie cookie) { AbstractMap.SimpleEntry<String, Boolean> pair = cookieDomain(cookie.domain(), requestDomain); String keyDomain = pair.getKey(); boolean hostOnly = pair.getValue(); String keyPath = cookiePath(cookie.path(), requestPath); CookieKey key = new CookieKey(cookie.name().toLowerCase(), keyDomain, keyPath); if (hasCookieExpired(cookie, 0)) cookieJar.remove(key); else cookieJar.put(key, new StoredCookie(cookie, hostOnly, cookie.maxAge() != Cookie.UNDEFINED_MAX_AGE)); }
@Test public void testCookieParseExpires() { // e.g. "Tue, 27 Oct 2015 12:54:24 GMT"; SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US); sdf.setTimeZone(TimeZone.getTimeZone("GMT")); Date date = new Date(System.currentTimeMillis() + 60000); final String cookieDef = String.format("efmembercheck=true; expires=%s; path=/; domain=.eclipse.org", sdf.format(date)); HttpHeaders responseHeaders = new DefaultHttpHeaders().add(SET_COOKIE, cookieDef); NettyResponse response = new NettyResponse(new NettyResponseStatus(null, null, null), responseHeaders, null); List<Cookie> cookies = response.getCookies(); assertEquals(cookies.size(), 1); Cookie cookie = cookies.get(0); assertTrue(cookie.maxAge() >= 58 && cookie.maxAge() <= 60); }
@Override public MultiValueMap<String, ResponseCookie> getCookies() { MultiValueMap<String, ResponseCookie> result = new LinkedMultiValueMap<>(); this.response.cookies().values().stream().flatMap(Collection::stream) .forEach(cookie -> result.add(cookie.name(), ResponseCookie.from(cookie.name(), cookie.value()) .domain(cookie.domain()) .path(cookie.path()) .maxAge(cookie.maxAge()) .secure(cookie.isSecure()) .httpOnly(cookie.isHttpOnly()) .build())); return CollectionUtils.unmodifiableMultiValueMap(result); }
@Test public void testCookieParseWeirdExpiresValue() { final String cookieDef = "efmembercheck=true; expires=60; path=/; domain=.eclipse.org"; HttpHeaders responseHeaders = new DefaultHttpHeaders().add(SET_COOKIE, cookieDef); NettyResponse response = new NettyResponse(new NettyResponseStatus(null, null, null), responseHeaders, null); List<Cookie> cookies = response.getCookies(); assertEquals(cookies.size(), 1); Cookie cookie = cookies.get(0); assertEquals(cookie.maxAge(), Long.MIN_VALUE); } }
@Test public void testCookieParseMaxAge() { final String cookieDef = "efmembercheck=true; max-age=60; path=/; domain=.eclipse.org"; HttpHeaders responseHeaders = new DefaultHttpHeaders().add(SET_COOKIE, cookieDef); NettyResponse response = new NettyResponse(new NettyResponseStatus(null, null, null), responseHeaders, null); List<Cookie> cookies = response.getCookies(); assertEquals(cookies.size(), 1); Cookie cookie = cookies.get(0); assertEquals(cookie.maxAge(), 60); }
@Override public void run() throws IOException { org.apache.http.HttpResponse response = helper.getResponse(root()); String value = response.getFirstHeader(HttpHeaders.SET_COOKIE).getValue(); Cookie decodeCookie = ClientCookieDecoder.STRICT.decode(value); assertThat(decodeCookie.maxAge(), is(3600L)); } });
private MultiValueMap<String, ResponseCookie> initCookies() { final MultiValueMap<String, ResponseCookie> cookies = new LinkedMultiValueMap<>(); headers.getAll(HttpHeaderNames.SET_COOKIE) .stream() .map(ClientCookieDecoder.LAX::decode) .forEach(c -> cookies.add(c.name(), ResponseCookie.from(c.name(), c.value()) .maxAge(c.maxAge()) .domain(c.domain()) .path(c.path()) .secure(c.isSecure()) .httpOnly(c.isHttpOnly()) .build())); return cookies; }
@Test public void should_set_and_recognize_cookie_with_max_age() throws IOException { runWithConfiguration("cookie.json"); Cookie decodeCookie = getCookie("/cookie-with-max-age"); assertThat(decodeCookie.name(), is("login")); assertThat(decodeCookie.value(), is("true")); assertThat(decodeCookie.maxAge(), is(3600L)); }
/** * Parse netty cookie to {@link Cookie}. * * @param nettyCookie netty raw cookie instance */ private void parseCookie(io.netty.handler.codec.http.cookie.Cookie nettyCookie) { var cookie = new Cookie(); cookie.name(nettyCookie.name()); cookie.value(nettyCookie.value()); cookie.httpOnly(nettyCookie.isHttpOnly()); cookie.path(nettyCookie.path()); cookie.domain(nettyCookie.domain()); cookie.maxAge(nettyCookie.maxAge()); this.cookies.put(cookie.name(), cookie); }
/** * Parse netty cookie to {@link Cookie}. * * @param nettyCookie netty raw cookie instance */ private void parseCookie(io.netty.handler.codec.http.cookie.Cookie nettyCookie) { var cookie = new Cookie(); cookie.name(nettyCookie.name()); cookie.value(nettyCookie.value()); cookie.httpOnly(nettyCookie.isHttpOnly()); cookie.path(nettyCookie.path()); cookie.domain(nettyCookie.domain()); cookie.maxAge(nettyCookie.maxAge()); this.cookies.put(cookie.name(), cookie); }
assertThat(setCookie.domain()).isEqualTo("http://localhost"); assertThat(setCookie.path()).isEqualTo("/"); assertThat(setCookie.maxAge()).isEqualTo(Duration.ofSeconds(60).getSeconds()); assertThat(setCookie.isSecure()).isTrue(); assertThat(setCookie.isHttpOnly()).isTrue();
@Override public Long getMaxAge() { return cookie.maxAge(); }
@Override public long maxAge() { return nettyCookie.maxAge(); }
private void assertAuthCookie(Operation op) { String cookieHeader = op.getResponseHeader(Operation.SET_COOKIE_HEADER); Cookie cookie = ClientCookieDecoder.LAX.decode(cookieHeader); assertEquals(AuthenticationConstants.REQUEST_AUTH_TOKEN_COOKIE, cookie.name()); assertEquals("", cookie.value()); assertEquals(0, cookie.maxAge()); }
private static ResponseCookie convert(Cookie cookie) { String value = cookie.wrap() ? quote(cookie.value()) : cookie.value(); return responseCookie(cookie.name(), value) .domain(cookie.domain()) .path(cookie.path()) .maxAge(cookie.maxAge()) .httpOnly(cookie.isHttpOnly()) .secure(cookie.isSecure()) .build(); }