package org.simpleframework.http.core; import java.io.OutputStream; import java.nio.channels.SocketChannel; import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import junit.framework.TestCase; import org.simpleframework.common.buffer.Allocator; import org.simpleframework.common.buffer.ArrayAllocator; import org.simpleframework.http.MockTrace; import org.simpleframework.http.Request; import org.simpleframework.http.Response; import org.simpleframework.transport.Certificate; import org.simpleframework.transport.Channel; import org.simpleframework.transport.ByteCursor; import org.simpleframework.transport.ByteWriter; import org.simpleframework.transport.trace.Trace; public class WebSocketUpgradeTest extends TestCase implements Container { private static final String OPEN_HANDSHAKE = "GET /chat HTTP/1.1\r\n"+ "Host: server.example.com\r\n"+ "Upgrade: websocket\r\n"+ "Connection: Upgrade\r\n"+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"+ "Origin: http://example.com\r\n"+ "Sec-WebSocket-Protocol: chat, superchat\r\n"+ "Sec-WebSocket-Version: 14\r\n" + "\r\n"; public static class MockChannel implements Channel { private ByteCursor cursor; public MockChannel(StreamCursor cursor, int dribble) { this.cursor = new DribbleCursor(cursor, dribble); } public boolean isSecure() { return false; } public Trace getTrace() { return new MockTrace(); } public Certificate getCertificate() { return null; } public ByteCursor getCursor() { return cursor; } public ByteWriter getWriter() { return new MockSender(); } public Map getAttributes() { return null; } public void close() {} public SocketChannel getSocket() { return null; } } private final BlockingQueue<Response> responses = new LinkedBlockingQueue<Response>(); public void testWebSocketUpgrade() throws Exception { Allocator allocator = new ArrayAllocator(); Controller handler = new ContainerController(this, allocator, 10, 2); StreamCursor cursor = new StreamCursor(OPEN_HANDSHAKE); Channel channel = new MockChannel(cursor, 10); handler.start(channel); Response response = responses.poll(5000, TimeUnit.MILLISECONDS); assertEquals(response.getValue("Connection"), "Upgrade"); assertEquals(response.getValue("Upgrade"), "websocket"); assertTrue(response.isCommitted()); assertTrue(response.isKeepAlive()); } public void handle(Request request, Response response) { try { process(request, response); responses.offer(response); }catch(Exception e) { e.printStackTrace(); assertTrue(false); } } public void process(Request request, Response response) throws Exception { String method = request.getMethod(); assertEquals(method, "GET"); assertEquals(request.getValue("Upgrade"), "websocket"); assertEquals(request.getValue("Connection"), "Upgrade"); assertEquals(request.getValue("Sec-WebSocket-Key"), "dGhlIHNhbXBsZSBub25jZQ=="); response.setCode(101); response.setValue("Connection", "close"); response.setValue("Upgrade", "websocket"); OutputStream out = response.getOutputStream(); out.write(10); // force commit assertTrue(response.isCommitted()); assertTrue(response.isKeepAlive()); } public static void main(String[] list) throws Exception { new ReactorProcessorTest().testMinimal(); } }