diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/ServerCookieEncoder.java b/codec-http/src/main/java/io/netty/handler/codec/http/ServerCookieEncoder.java index 13b301fd4f..887333f204 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/ServerCookieEncoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/ServerCookieEncoder.java @@ -15,13 +15,14 @@ */ package io.netty.handler.codec.http; +import static io.netty.handler.codec.http.CookieEncoderUtil.*; + import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Date; import java.util.List; -import static io.netty.handler.codec.http.CookieEncoderUtil.*; - /** * A RFC6265 compliant cookie encoder to be used server side, * so some fields are sent (Version is typically ignored). @@ -68,6 +69,8 @@ public final class ServerCookieEncoder { if (cookie.maxAge() != Long.MIN_VALUE) { add(buf, CookieHeaderNames.MAX_AGE, cookie.maxAge()); + Date expires = new Date(cookie.maxAge() * 1000 + System.currentTimeMillis()); + addUnquoted(buf, CookieHeaderNames.EXPIRES, HttpHeaderDateFormat.get().format(expires)); } if (cookie.path() != null) { diff --git a/codec-http/src/test/java/io/netty/handler/codec/http/ServerCookieEncoderTest.java b/codec-http/src/test/java/io/netty/handler/codec/http/ServerCookieEncoderTest.java index bb101555d3..d30278ba4b 100644 --- a/codec-http/src/test/java/io/netty/handler/codec/http/ServerCookieEncoderTest.java +++ b/codec-http/src/test/java/io/netty/handler/codec/http/ServerCookieEncoderTest.java @@ -17,22 +17,37 @@ package io.netty.handler.codec.http; import org.junit.Test; +import java.text.ParseException; +import java.util.Date; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import static org.junit.Assert.*; public class ServerCookieEncoderTest { + @Test - public void testEncodingSingleCookieV0() { - String result = "myCookie=myValue; Max-Age=50; Path=/apathsomewhere; Domain=.adomainsomewhere; Secure"; + public void testEncodingSingleCookieV0() throws ParseException { + + int maxAge = 50; + + String result = + "myCookie=myValue; Max-Age=50; Expires=(.+?); Path=/apathsomewhere; Domain=.adomainsomewhere; Secure"; Cookie cookie = new DefaultCookie("myCookie", "myValue"); cookie.setDomain(".adomainsomewhere"); - cookie.setMaxAge(50); + cookie.setMaxAge(maxAge); cookie.setPath("/apathsomewhere"); cookie.setSecure(true); String encodedCookie = ServerCookieEncoder.encode(cookie); - assertEquals(result, encodedCookie); + + Matcher matcher = Pattern.compile(result).matcher(encodedCookie); + assertTrue(matcher.find()); + Date expiresDate = HttpHeaderDateFormat.get().parse(matcher.group(1)); + long diff = (expiresDate.getTime() - System.currentTimeMillis()) / 1000; + // 1 sec should be fine + assertTrue(Math.abs(diff - maxAge) <= 1); } @Test