From 57ff5e9d273cc2ef2eba3a4c0cc874f166dc1ee0 Mon Sep 17 00:00:00 2001 From: Dennis Byrne Date: Tue, 19 Jun 2012 09:30:02 -0500 Subject: [PATCH 1/3] allow cookies to be set client side --- .../java/org/webbitserver/HttpRequest.java | 2 +- .../webbitserver/netty/WebSocketClient.java | 32 +++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/webbitserver/HttpRequest.java b/src/main/java/org/webbitserver/HttpRequest.java index f952327a..ab7f6d9d 100644 --- a/src/main/java/org/webbitserver/HttpRequest.java +++ b/src/main/java/org/webbitserver/HttpRequest.java @@ -15,7 +15,7 @@ */ public interface HttpRequest extends DataHolder { - String COOKIE_HEADER = "Cookie"; + public String COOKIE_HEADER = "Cookie"; String uri(); diff --git a/src/main/java/org/webbitserver/netty/WebSocketClient.java b/src/main/java/org/webbitserver/netty/WebSocketClient.java index 8871c76a..4b45c43d 100644 --- a/src/main/java/org/webbitserver/netty/WebSocketClient.java +++ b/src/main/java/org/webbitserver/netty/WebSocketClient.java @@ -37,12 +37,16 @@ import java.net.URI; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; +import java.util.Map.Entry; +import static java.util.concurrent.Executors.newSingleThreadExecutor; import static org.jboss.netty.channel.Channels.pipeline; public class WebSocketClient implements WebSocket { @@ -76,10 +80,18 @@ public class WebSocketClient implements WebSocket { private SslFactory sslFactory; public WebSocketClient(URI uri, WebSocketHandler webSocketHandler) { - this(uri, webSocketHandler, Executors.newSingleThreadExecutor()); + this(uri, webSocketHandler, newSingleThreadExecutor()); } public WebSocketClient(URI uri, WebSocketHandler webSocketHandler, Executor executor) { + this(uri, webSocketHandler, executor, new HashMap()); + } + + public WebSocketClient(URI uri, WebSocketHandler webSocketHandler, Map cookies) { + this(uri, webSocketHandler, newSingleThreadExecutor(), cookies); + } + + public WebSocketClient(URI uri, WebSocketHandler webSocketHandler, Executor executor, Map cookies){ this.uri = uri; this.webSocketHandler = webSocketHandler; this.executor = executor; @@ -96,7 +108,7 @@ public WebSocketClient(URI uri, WebSocketHandler webSocketHandler, Executor exec } } remoteAddress = new InetSocketAddress(host, port); - request = createNettyHttpRequest(getPath(uri), host); + request = createNettyHttpRequest(getPath(uri), host, cookies); uncaughtExceptionHandler(new PrintStackTraceExceptionHandler()); connectionExceptionHandler(new SilentExceptionHandler()); @@ -193,10 +205,24 @@ public ChannelPipeline getPipeline() throws Exception { return future; } - private HttpRequest createNettyHttpRequest(String uri, String host) { + private HttpRequest createNettyHttpRequest(String uri, String host, Map cookies) { HttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri); request.setHeader(HttpHeaders.Names.HOST, host); request.setHeader(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.UPGRADE); + StringBuilder builders = new StringBuilder(); + boolean seenCookie = false; + for(Entry entry : cookies.entrySet()){ + if (seenCookie) { + builders.append("; "); + } + seenCookie = true; + builders.append(entry.getKey()) + .append('=') + .append(entry.getValue()); + } + if (seenCookie) { + request.setHeader(org.webbitserver.HttpRequest.COOKIE_HEADER, builders.toString()); + } request.setHeader(HttpHeaders.Names.UPGRADE, "websocket"); request.setHeader(HttpHeaders.Names.ACCEPT_ENCODING, HttpHeaders.Values.GZIP); request.setHeader(Hybi.SEC_WEBSOCKET_VERSION, VERSION); From 74af66aa53910d8de55b2882f7c3e02fd40cd9d6 Mon Sep 17 00:00:00 2001 From: Dennis Byrne Date: Tue, 19 Jun 2012 15:31:19 -0500 Subject: [PATCH 2/3] patch mods per https://github.com/dennisbyrne/webbit/commit/57ff5e9d273cc2ef2eba3a4c0cc874f166dc1ee0#commitcomment-1476706 --- .../java/org/webbitserver/HttpRequest.java | 6 ++ .../webbitserver/netty/NettyHttpRequest.java | 14 +++-- .../webbitserver/netty/WebSocketClient.java | 57 ++++++++++--------- .../webbitserver/stub/StubHttpRequest.java | 6 ++ .../wrapper/HttpRequestWrapper.java | 5 ++ .../netty/NettyHttpRequestTest.java | 35 ++++++++++++ 6 files changed, 91 insertions(+), 32 deletions(-) create mode 100644 src/test/java/org/webbitserver/netty/NettyHttpRequestTest.java diff --git a/src/main/java/org/webbitserver/HttpRequest.java b/src/main/java/org/webbitserver/HttpRequest.java index ab7f6d9d..7a24362d 100644 --- a/src/main/java/org/webbitserver/HttpRequest.java +++ b/src/main/java/org/webbitserver/HttpRequest.java @@ -156,4 +156,10 @@ public interface HttpRequest extends DataHolder { */ long timestamp(); + /** + * Adds a cookie + * + * @param httpCookie the cookie + */ + HttpRequest cookie(HttpCookie httpCookie); } diff --git a/src/main/java/org/webbitserver/netty/NettyHttpRequest.java b/src/main/java/org/webbitserver/netty/NettyHttpRequest.java index c39a5123..0f526f27 100644 --- a/src/main/java/org/webbitserver/netty/NettyHttpRequest.java +++ b/src/main/java/org/webbitserver/netty/NettyHttpRequest.java @@ -9,10 +9,10 @@ import java.net.HttpCookie; import java.net.SocketAddress; import java.net.URI; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; + +import static java.util.Collections.singletonList; +import static org.webbitserver.netty.WebSocketClient.appendCookie; public class NettyHttpRequest implements org.webbitserver.HttpRequest { @@ -179,6 +179,12 @@ public long timestamp() { return timestamp; } + @Override + public NettyHttpRequest cookie(HttpCookie httpCookie) { + appendCookie(httpRequest, cookies(), singletonList(httpCookie)); + return this; + } + @Override public String toString() { return messageEvent.getRemoteAddress() + " " + httpRequest.getMethod() + " " + httpRequest.getUri(); diff --git a/src/main/java/org/webbitserver/netty/WebSocketClient.java b/src/main/java/org/webbitserver/netty/WebSocketClient.java index 4b45c43d..aa824739 100644 --- a/src/main/java/org/webbitserver/netty/WebSocketClient.java +++ b/src/main/java/org/webbitserver/netty/WebSocketClient.java @@ -33,18 +33,18 @@ import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; import java.io.InputStream; +import java.net.HttpCookie; import java.net.InetSocketAddress; import java.net.URI; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.HashMap; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; -import java.util.Map.Entry; import static java.util.concurrent.Executors.newSingleThreadExecutor; import static org.jboss.netty.channel.Channels.pipeline; @@ -78,20 +78,13 @@ public class WebSocketClient implements WebSocket { private Thread.UncaughtExceptionHandler exceptionHandler; private Thread.UncaughtExceptionHandler ioExceptionHandler; private SslFactory sslFactory; + private final List cookies = new ArrayList(); public WebSocketClient(URI uri, WebSocketHandler webSocketHandler) { this(uri, webSocketHandler, newSingleThreadExecutor()); } - public WebSocketClient(URI uri, WebSocketHandler webSocketHandler, Executor executor) { - this(uri, webSocketHandler, executor, new HashMap()); - } - - public WebSocketClient(URI uri, WebSocketHandler webSocketHandler, Map cookies) { - this(uri, webSocketHandler, newSingleThreadExecutor(), cookies); - } - - public WebSocketClient(URI uri, WebSocketHandler webSocketHandler, Executor executor, Map cookies){ + public WebSocketClient(URI uri, WebSocketHandler webSocketHandler, Executor executor){ this.uri = uri; this.webSocketHandler = webSocketHandler; this.executor = executor; @@ -108,12 +101,17 @@ public WebSocketClient(URI uri, WebSocketHandler webSocketHandler, Executor exec } } remoteAddress = new InetSocketAddress(host, port); - request = createNettyHttpRequest(getPath(uri), host, cookies); + request = createNettyHttpRequest(getPath(uri), host); uncaughtExceptionHandler(new PrintStackTraceExceptionHandler()); connectionExceptionHandler(new SilentExceptionHandler()); } + public WebSocketClient with(HttpCookie httpCookie){ + cookies.add(httpCookie); + return this; + } + private String getPath(URI uri) { String path = uri.getPath(); return "".equals(path) ? "/" : path; @@ -205,24 +203,11 @@ public ChannelPipeline getPipeline() throws Exception { return future; } - private HttpRequest createNettyHttpRequest(String uri, String host, Map cookies) { + private HttpRequest createNettyHttpRequest(String uri, String host) { HttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri); request.setHeader(HttpHeaders.Names.HOST, host); request.setHeader(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.UPGRADE); - StringBuilder builders = new StringBuilder(); - boolean seenCookie = false; - for(Entry entry : cookies.entrySet()){ - if (seenCookie) { - builders.append("; "); - } - seenCookie = true; - builders.append(entry.getKey()) - .append('=') - .append(entry.getValue()); - } - if (seenCookie) { - request.setHeader(org.webbitserver.HttpRequest.COOKIE_HEADER, builders.toString()); - } + appendCookie(request, new ArrayList(), cookies); request.setHeader(HttpHeaders.Names.UPGRADE, "websocket"); request.setHeader(HttpHeaders.Names.ACCEPT_ENCODING, HttpHeaders.Values.GZIP); request.setHeader(Hybi.SEC_WEBSOCKET_VERSION, VERSION); @@ -232,6 +217,22 @@ private HttpRequest createNettyHttpRequest(String uri, String host, Map current, List additional) { + StringBuilder builder = new StringBuilder(); + current.addAll(additional); + boolean first = true; + for(HttpCookie cookie : current){ + if(!first){ + builder.append("; "); + } + builder.append(cookie.toString()); + first = false; + } + if(!first){ + httpRequest.setHeader(org.webbitserver.HttpRequest.COOKIE_HEADER, builder.toString()); + } + } + private String base64Nonce() { byte[] nonce = new byte[16]; for (int i = 0; i < 16; i++) { diff --git a/src/main/java/org/webbitserver/stub/StubHttpRequest.java b/src/main/java/org/webbitserver/stub/StubHttpRequest.java index 3794fc43..eee0d282 100644 --- a/src/main/java/org/webbitserver/stub/StubHttpRequest.java +++ b/src/main/java/org/webbitserver/stub/StubHttpRequest.java @@ -189,6 +189,12 @@ public long timestamp() { return timestamp; } + @Override + public HttpRequest cookie(HttpCookie httpCookie) { + headers.add(new AbstractMap.SimpleEntry(org.webbitserver.HttpRequest.COOKIE_HEADER, httpCookie.toString())); + return this; + } + public StubHttpRequest timestamp(long timestamp) { this.timestamp = timestamp; return this; diff --git a/src/main/java/org/webbitserver/wrapper/HttpRequestWrapper.java b/src/main/java/org/webbitserver/wrapper/HttpRequestWrapper.java index 9f61307e..c0e5586f 100644 --- a/src/main/java/org/webbitserver/wrapper/HttpRequestWrapper.java +++ b/src/main/java/org/webbitserver/wrapper/HttpRequestWrapper.java @@ -160,4 +160,9 @@ public Object id() { public long timestamp() { return request.timestamp(); } + + @Override + public HttpRequest cookie(HttpCookie httpCookie) { + return request.cookie(httpCookie); + } } diff --git a/src/test/java/org/webbitserver/netty/NettyHttpRequestTest.java b/src/test/java/org/webbitserver/netty/NettyHttpRequestTest.java new file mode 100644 index 00000000..806ccc7f --- /dev/null +++ b/src/test/java/org/webbitserver/netty/NettyHttpRequestTest.java @@ -0,0 +1,35 @@ +package org.webbitserver.netty; + +import org.jboss.netty.handler.codec.http.DefaultHttpRequest; +import org.junit.Test; +import org.webbitserver.HttpRequest; + +import java.net.HttpCookie; + +import static org.jboss.netty.handler.codec.http.HttpMethod.GET; +import static org.jboss.netty.handler.codec.http.HttpVersion.HTTP_1_1; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.webbitserver.HttpRequest.COOKIE_HEADER; + +/** + * @author dbyrne + */ +public class NettyHttpRequestTest { + + @Test + public void cookies(){ + HttpRequest httpRequest = new NettyHttpRequest(null, new DefaultHttpRequest(HTTP_1_1, GET, "localhost"), new Object(), 1L); + + HttpCookie a = new HttpCookie("A", "1"); + httpRequest.cookie(a); + assertEquals("1", httpRequest.cookie("A").getValue()); + + HttpCookie b = new HttpCookie("B", "2"); + httpRequest.cookie(b); + assertEquals("2", httpRequest.cookie("B").getValue()); + + assertTrue(httpRequest.header(COOKIE_HEADER).contains("A")); + } + +} From c1725cc2e8413b08f571bb838bf576c9e99f2e00 Mon Sep 17 00:00:00 2001 From: Dennis Byrne Date: Tue, 19 Jun 2012 15:58:36 -0500 Subject: [PATCH 3/3] patch mods per conversation w/ jw --- .../java/org/webbitserver/HttpRequest.java | 7 ---- .../webbitserver/netty/NettyHttpRequest.java | 9 ----- .../webbitserver/netty/WebSocketClient.java | 19 ++++------ .../webbitserver/stub/StubHttpRequest.java | 6 ---- .../wrapper/HttpRequestWrapper.java | 5 --- .../netty/NettyHttpRequestTest.java | 35 ------------------- 6 files changed, 7 insertions(+), 74 deletions(-) delete mode 100644 src/test/java/org/webbitserver/netty/NettyHttpRequestTest.java diff --git a/src/main/java/org/webbitserver/HttpRequest.java b/src/main/java/org/webbitserver/HttpRequest.java index 7a24362d..a99f60ad 100644 --- a/src/main/java/org/webbitserver/HttpRequest.java +++ b/src/main/java/org/webbitserver/HttpRequest.java @@ -155,11 +155,4 @@ public interface HttpRequest extends DataHolder { * Timestamp (millis since epoch) of when this request was first received by the server. */ long timestamp(); - - /** - * Adds a cookie - * - * @param httpCookie the cookie - */ - HttpRequest cookie(HttpCookie httpCookie); } diff --git a/src/main/java/org/webbitserver/netty/NettyHttpRequest.java b/src/main/java/org/webbitserver/netty/NettyHttpRequest.java index 0f526f27..6b036658 100644 --- a/src/main/java/org/webbitserver/netty/NettyHttpRequest.java +++ b/src/main/java/org/webbitserver/netty/NettyHttpRequest.java @@ -11,9 +11,6 @@ import java.net.URI; import java.util.*; -import static java.util.Collections.singletonList; -import static org.webbitserver.netty.WebSocketClient.appendCookie; - public class NettyHttpRequest implements org.webbitserver.HttpRequest { private final HttpRequest httpRequest; @@ -179,12 +176,6 @@ public long timestamp() { return timestamp; } - @Override - public NettyHttpRequest cookie(HttpCookie httpCookie) { - appendCookie(httpRequest, cookies(), singletonList(httpCookie)); - return this; - } - @Override public String toString() { return messageEvent.getRemoteAddress() + " " + httpRequest.getMethod() + " " + httpRequest.getUri(); diff --git a/src/main/java/org/webbitserver/netty/WebSocketClient.java b/src/main/java/org/webbitserver/netty/WebSocketClient.java index aa824739..1bbe1669 100644 --- a/src/main/java/org/webbitserver/netty/WebSocketClient.java +++ b/src/main/java/org/webbitserver/netty/WebSocketClient.java @@ -107,7 +107,7 @@ public WebSocketClient(URI uri, WebSocketHandler webSocketHandler, Executor exec connectionExceptionHandler(new SilentExceptionHandler()); } - public WebSocketClient with(HttpCookie httpCookie){ + public WebSocketClient cookie(HttpCookie httpCookie){ cookies.add(httpCookie); return this; } @@ -207,21 +207,12 @@ private HttpRequest createNettyHttpRequest(String uri, String host) { HttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri); request.setHeader(HttpHeaders.Names.HOST, host); request.setHeader(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.UPGRADE); - appendCookie(request, new ArrayList(), cookies); request.setHeader(HttpHeaders.Names.UPGRADE, "websocket"); request.setHeader(HttpHeaders.Names.ACCEPT_ENCODING, HttpHeaders.Values.GZIP); request.setHeader(Hybi.SEC_WEBSOCKET_VERSION, VERSION); - - base64Nonce = base64Nonce(); - request.setHeader(Hybi.SEC_WEBSOCKET_KEY, base64Nonce); - return request; - } - - static void appendCookie(HttpRequest httpRequest, List current, List additional) { StringBuilder builder = new StringBuilder(); - current.addAll(additional); boolean first = true; - for(HttpCookie cookie : current){ + for(HttpCookie cookie : cookies){ if(!first){ builder.append("; "); } @@ -229,8 +220,12 @@ static void appendCookie(HttpRequest httpRequest, List current, List first = false; } if(!first){ - httpRequest.setHeader(org.webbitserver.HttpRequest.COOKIE_HEADER, builder.toString()); + request.setHeader(org.webbitserver.HttpRequest.COOKIE_HEADER, builder.toString()); } + + base64Nonce = base64Nonce(); + request.setHeader(Hybi.SEC_WEBSOCKET_KEY, base64Nonce); + return request; } private String base64Nonce() { diff --git a/src/main/java/org/webbitserver/stub/StubHttpRequest.java b/src/main/java/org/webbitserver/stub/StubHttpRequest.java index eee0d282..3794fc43 100644 --- a/src/main/java/org/webbitserver/stub/StubHttpRequest.java +++ b/src/main/java/org/webbitserver/stub/StubHttpRequest.java @@ -189,12 +189,6 @@ public long timestamp() { return timestamp; } - @Override - public HttpRequest cookie(HttpCookie httpCookie) { - headers.add(new AbstractMap.SimpleEntry(org.webbitserver.HttpRequest.COOKIE_HEADER, httpCookie.toString())); - return this; - } - public StubHttpRequest timestamp(long timestamp) { this.timestamp = timestamp; return this; diff --git a/src/main/java/org/webbitserver/wrapper/HttpRequestWrapper.java b/src/main/java/org/webbitserver/wrapper/HttpRequestWrapper.java index c0e5586f..9f61307e 100644 --- a/src/main/java/org/webbitserver/wrapper/HttpRequestWrapper.java +++ b/src/main/java/org/webbitserver/wrapper/HttpRequestWrapper.java @@ -160,9 +160,4 @@ public Object id() { public long timestamp() { return request.timestamp(); } - - @Override - public HttpRequest cookie(HttpCookie httpCookie) { - return request.cookie(httpCookie); - } } diff --git a/src/test/java/org/webbitserver/netty/NettyHttpRequestTest.java b/src/test/java/org/webbitserver/netty/NettyHttpRequestTest.java deleted file mode 100644 index 806ccc7f..00000000 --- a/src/test/java/org/webbitserver/netty/NettyHttpRequestTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.webbitserver.netty; - -import org.jboss.netty.handler.codec.http.DefaultHttpRequest; -import org.junit.Test; -import org.webbitserver.HttpRequest; - -import java.net.HttpCookie; - -import static org.jboss.netty.handler.codec.http.HttpMethod.GET; -import static org.jboss.netty.handler.codec.http.HttpVersion.HTTP_1_1; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.webbitserver.HttpRequest.COOKIE_HEADER; - -/** - * @author dbyrne - */ -public class NettyHttpRequestTest { - - @Test - public void cookies(){ - HttpRequest httpRequest = new NettyHttpRequest(null, new DefaultHttpRequest(HTTP_1_1, GET, "localhost"), new Object(), 1L); - - HttpCookie a = new HttpCookie("A", "1"); - httpRequest.cookie(a); - assertEquals("1", httpRequest.cookie("A").getValue()); - - HttpCookie b = new HttpCookie("B", "2"); - httpRequest.cookie(b); - assertEquals("2", httpRequest.cookie("B").getValue()); - - assertTrue(httpRequest.header(COOKIE_HEADER).contains("A")); - } - -}