Brought back the encode() method of CookieEncoder

This commit is contained in:
Trustin Lee 2009-03-13 15:46:41 +00:00
parent b6cfc24127
commit efd5af9313
4 changed files with 59 additions and 14 deletions

View File

@ -91,7 +91,7 @@ public class HttpClient {
HttpRequest request = new DefaultHttpRequest( HttpRequest request = new DefaultHttpRequest(
HttpVersion.HTTP_1_0, HttpMethod.GET, uri.toASCIIString()); HttpVersion.HTTP_1_0, HttpMethod.GET, uri.toASCIIString());
request.addHeader(HttpHeaders.Names.HOST, host); request.addHeader(HttpHeaders.Names.HOST, host);
CookieEncoder httpCookieEncoder = new CookieEncoder(); CookieEncoder httpCookieEncoder = new CookieEncoder(false);
httpCookieEncoder.addCookie("my-cookie", "foo"); httpCookieEncoder.addCookie("my-cookie", "foo");
httpCookieEncoder.addCookie("another-cookie", "bar"); httpCookieEncoder.addCookie("another-cookie", "bar");
request.addHeader(HttpHeaders.Names.COOKIE, httpCookieEncoder.encode()); request.addHeader(HttpHeaders.Names.COOKIE, httpCookieEncoder.encode());

View File

@ -136,7 +136,7 @@ public class HttpRequestHandler extends SimpleChannelHandler {
Set<Cookie> cookies = cookieDecoder.decode(cookieString); Set<Cookie> cookies = cookieDecoder.decode(cookieString);
if(!cookies.isEmpty()) { if(!cookies.isEmpty()) {
// Reset the cookies if necessary. // Reset the cookies if necessary.
CookieEncoder cookieEncoder = new CookieEncoder(); CookieEncoder cookieEncoder = new CookieEncoder(true);
for (Cookie cookie : cookies) { for (Cookie cookie : cookies) {
cookieEncoder.addCookie(cookie); cookieEncoder.addCookie(cookie);
} }

View File

@ -34,17 +34,18 @@ import java.util.TreeSet;
public class CookieEncoder { public class CookieEncoder {
private final Set<Cookie> cookies = new TreeSet<Cookie>(); private final Set<Cookie> cookies = new TreeSet<Cookie>();
private final boolean server;
private final String charset; private final String charset;
public CookieEncoder() { public CookieEncoder(boolean server) {
this(QueryStringDecoder.DEFAULT_CHARSET); this(server, QueryStringDecoder.DEFAULT_CHARSET);
} }
public CookieEncoder(String charset) { public CookieEncoder(boolean server, String charset) {
if (charset == null) { if (charset == null) {
throw new NullPointerException("charset"); throw new NullPointerException("charset");
} }
this.server = server;
this.charset = charset; this.charset = charset;
} }
@ -57,7 +58,15 @@ public class CookieEncoder {
} }
public String encode() { public String encode() {
StringBuffer sb = new StringBuffer(); if (server) {
return encodeServerSide();
} else {
return encodeClientSide();
}
}
private String encodeServerSide() {
StringBuilder sb = new StringBuilder();
for (Cookie cookie: cookies) { for (Cookie cookie: cookies) {
add(sb, cookie.getName(), QueryStringEncoder.encodeComponent(cookie.getValue(), charset)); add(sb, cookie.getName(), QueryStringEncoder.encodeComponent(cookie.getValue(), charset));
@ -115,14 +124,50 @@ public class CookieEncoder {
return sb.toString(); return sb.toString();
} }
private void add(StringBuffer sb, String name, String val) { private String encodeClientSide() {
StringBuilder sb = new StringBuilder();
for (Cookie cookie: cookies) {
if (cookie.getVersion() >= 1) {
add(sb, '$' + CookieHeaderNames.VERSION, 1);
}
add(sb, cookie.getName(), QueryStringEncoder.encodeComponent(cookie.getValue(), charset));
if (cookie.getPath() != null) {
add(sb, '$' + CookieHeaderNames.PATH, cookie.getPath());
}
if (cookie.getDomain() != null) {
add(sb, '$' + CookieHeaderNames.DOMAIN, cookie.getDomain());
}
if (cookie.getVersion() >= 1) {
if(!cookie.getPorts().isEmpty()) {
sb.append('$');
sb.append(CookieHeaderNames.PORT);
sb.append((char) HttpCodecUtil.EQUALS);
sb.append((char) HttpCodecUtil.DOUBLE_QUOTE);
for (int port: cookie.getPorts()) {
sb.append(port);
sb.append((char) HttpCodecUtil.COMMA);
}
sb.setCharAt(sb.length() - 1, (char) HttpCodecUtil.DOUBLE_QUOTE);
sb.append((char) HttpCodecUtil.SEMICOLON);
}
}
}
return sb.toString();
}
private static void add(StringBuilder sb, String name, String val) {
sb.append(name); sb.append(name);
sb.append((char) HttpCodecUtil.EQUALS); sb.append((char) HttpCodecUtil.EQUALS);
sb.append(val); sb.append(val);
sb.append((char) HttpCodecUtil.SEMICOLON); sb.append((char) HttpCodecUtil.SEMICOLON);
} }
private void addQuoted(StringBuffer sb, String name, String val) { private static void addQuoted(StringBuilder sb, String name, String val) {
sb.append(name); sb.append(name);
sb.append((char) HttpCodecUtil.EQUALS); sb.append((char) HttpCodecUtil.EQUALS);
sb.append((char) HttpCodecUtil.DOUBLE_QUOTE); sb.append((char) HttpCodecUtil.DOUBLE_QUOTE);
@ -131,7 +176,7 @@ public class CookieEncoder {
sb.append((char) HttpCodecUtil.SEMICOLON); sb.append((char) HttpCodecUtil.SEMICOLON);
} }
private void add(StringBuffer sb, String name, int val) { private static void add(StringBuilder sb, String name, int val) {
sb.append(name); sb.append(name);
sb.append((char) HttpCodecUtil.EQUALS); sb.append((char) HttpCodecUtil.EQUALS);
sb.append(val); sb.append(val);

View File

@ -39,7 +39,7 @@ public class CookieEncoderTest {
public void testEncodingSingleCookieV0() { public void testEncodingSingleCookieV0() {
String result = "myCookie=myValue;expires=XXX;path=/apathsomewhere;domain=.adomainsomewhere;secure;"; String result = "myCookie=myValue;expires=XXX;path=/apathsomewhere;domain=.adomainsomewhere;secure;";
Cookie cookie = new DefaultCookie("myCookie", "myValue"); Cookie cookie = new DefaultCookie("myCookie", "myValue");
CookieEncoder encoder = new CookieEncoder(); CookieEncoder encoder = new CookieEncoder(true);
encoder.addCookie(cookie); encoder.addCookie(cookie);
cookie.setComment("this is a comment"); cookie.setComment("this is a comment");
cookie.setCommentUrl("http://aurl.com"); cookie.setCommentUrl("http://aurl.com");
@ -57,7 +57,7 @@ public class CookieEncoderTest {
public void testEncodingSingleCookieV1() { public void testEncodingSingleCookieV1() {
String result = "myCookie=myValue;max-age=50;path=/apathsomewhere;domain=.adomainsomewhere;secure;comment=this is a comment;version=1;"; String result = "myCookie=myValue;max-age=50;path=/apathsomewhere;domain=.adomainsomewhere;secure;comment=this is a comment;version=1;";
Cookie cookie = new DefaultCookie("myCookie", "myValue"); Cookie cookie = new DefaultCookie("myCookie", "myValue");
CookieEncoder encoder = new CookieEncoder(); CookieEncoder encoder = new CookieEncoder(true);
encoder.addCookie(cookie); encoder.addCookie(cookie);
cookie.setVersion(1); cookie.setVersion(1);
cookie.setComment("this is a comment"); cookie.setComment("this is a comment");
@ -72,7 +72,7 @@ public class CookieEncoderTest {
public void testEncodingSingleCookieV2() { public void testEncodingSingleCookieV2() {
String result = "myCookie=myValue;max-age=50;path=/apathsomewhere;domain=.adomainsomewhere;secure;comment=this is a comment;version=1;commentURL=\"http://aurl.com\";port=\"80,8080\";discard;"; String result = "myCookie=myValue;max-age=50;path=/apathsomewhere;domain=.adomainsomewhere;secure;comment=this is a comment;version=1;commentURL=\"http://aurl.com\";port=\"80,8080\";discard;";
Cookie cookie = new DefaultCookie("myCookie", "myValue"); Cookie cookie = new DefaultCookie("myCookie", "myValue");
CookieEncoder encoder = new CookieEncoder(); CookieEncoder encoder = new CookieEncoder(true);
encoder.addCookie(cookie); encoder.addCookie(cookie);
cookie.setVersion(1); cookie.setVersion(1);
cookie.setComment("this is a comment"); cookie.setComment("this is a comment");
@ -92,7 +92,7 @@ public class CookieEncoderTest {
String c1 = "myCookie=myValue;max-age=50;path=/apathsomewhere;domain=.adomainsomewhere;secure;comment=this is a comment;version=1;commentURL=\"http://aurl.com\";port=\"80,8080\";discard;"; String c1 = "myCookie=myValue;max-age=50;path=/apathsomewhere;domain=.adomainsomewhere;secure;comment=this is a comment;version=1;commentURL=\"http://aurl.com\";port=\"80,8080\";discard;";
String c2 = "myCookie2=myValue2;path=/anotherpathsomewhere;domain=.anotherdomainsomewhere;comment=this is another comment;version=1;commentURL=\"http://anotherurl.com\";"; String c2 = "myCookie2=myValue2;path=/anotherpathsomewhere;domain=.anotherdomainsomewhere;comment=this is another comment;version=1;commentURL=\"http://anotherurl.com\";";
String c3 = "myCookie3=myValue3;version=1;"; String c3 = "myCookie3=myValue3;version=1;";
CookieEncoder encoder = new CookieEncoder(); CookieEncoder encoder = new CookieEncoder(true);
Cookie cookie = new DefaultCookie("myCookie", "myValue"); Cookie cookie = new DefaultCookie("myCookie", "myValue");
cookie.setVersion(1); cookie.setVersion(1);
cookie.setComment("this is a comment"); cookie.setComment("this is a comment");