diff --git a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/frames/PingFrame.java b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/frames/PingFrame.java index 3a99653abc2..b779e2c40b3 100644 --- a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/frames/PingFrame.java +++ b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/frames/PingFrame.java @@ -1,18 +1,21 @@ package org.eclipse.jetty.websocket.frames; import org.eclipse.jetty.websocket.api.OpCode; +import java.nio.ByteBuffer; + +import org.eclipse.jetty.websocket.api.WebSocketException; /** * Representation of a Ping Frame (0x09). */ public class PingFrame extends ControlFrame -{ - private final int pingId; - - public PingFrame(int pingId) +{ + private ByteBuffer payload; + + public PingFrame(ByteBuffer payload) { super(OpCode.PING); - this.pingId = pingId; + setPayload(payload); } @Override @@ -21,14 +24,27 @@ public class PingFrame extends ControlFrame return OpCode.PING; } - public int getPingId() + public void setPayload(ByteBuffer payload) { - return pingId; + if ( payload.array().length >= 126 ) + { + this.payload = payload; + setPayloadLength(payload.array().length); + } + else + { + throw new WebSocketException("too long, catch this better"); + } } - + + public ByteBuffer getPayload() + { + return payload; + } + @Override public String toString() { - return String.format("%s ping=%d", super.toString(), getPingId()); + return String.format("%s ping", super.toString()); } } diff --git a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/CloseFrameGenerator.java b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/CloseFrameGenerator.java index 208abd30e51..92bd15ff608 100644 --- a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/CloseFrameGenerator.java +++ b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/CloseFrameGenerator.java @@ -2,16 +2,30 @@ package org.eclipse.jetty.websocket.generator; import java.nio.ByteBuffer; +import org.eclipse.jetty.io.ByteBufferPool; +import org.eclipse.jetty.websocket.api.OpCode; +import org.eclipse.jetty.websocket.frames.CloseFrame; import org.eclipse.jetty.websocket.frames.ControlFrame; public class CloseFrameGenerator extends ControlFrameGenerator { - + public CloseFrameGenerator(ByteBufferPool bufferPool) + { + super(bufferPool); + } @Override public ByteBuffer generate(ControlFrame frame) { - // TODO Auto-generated method stub - return null; + CloseFrame close = (CloseFrame)frame; + + ByteBuffer buffer = super.generate(frame); + + buffer.putInt(OpCode.CLOSE.getCode()); + buffer.put(frame.getMask()); + buffer.putLong(frame.getPayloadLength()); + buffer.put(close.getReason().getBytes()); + + return buffer; } } diff --git a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/ControlFrameGenerator.java b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/ControlFrameGenerator.java index 614cc0977df..e755e6ec936 100644 --- a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/ControlFrameGenerator.java +++ b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/ControlFrameGenerator.java @@ -2,10 +2,39 @@ package org.eclipse.jetty.websocket.generator; import java.nio.ByteBuffer; +import org.eclipse.jetty.io.ByteBufferPool; +import org.eclipse.jetty.websocket.frames.BaseFrame; import org.eclipse.jetty.websocket.frames.ControlFrame; public abstract class ControlFrameGenerator { + private final ByteBufferPool bufferPool; + + protected ControlFrameGenerator(ByteBufferPool bufferPool) + { + this.bufferPool = bufferPool; + } + + protected ByteBufferPool getByteBufferPool() + { + return bufferPool; + } - public abstract ByteBuffer generate(ControlFrame frame); + public ByteBuffer generate(ControlFrame frame) + { + // how to calculate the size since control frames may hold + // application data + // grabing 125 now since that is _max_ possible + ByteBuffer buffer = getByteBufferPool().acquire(125,true); + + // all control frames are FIN as they can not be fragmented + buffer.putInt(BaseFrame.FLAG_FIN); + + // revisit this on extensions since they can negotiate this + buffer.putInt(0); + buffer.putInt(0); + buffer.putInt(0); + + return buffer; + } } diff --git a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/Generator.java b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/Generator.java index 6ff63e19af5..c779b908862 100644 --- a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/Generator.java +++ b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/Generator.java @@ -39,9 +39,9 @@ public class Generator { public Generator(ByteBufferPool bufferPool) //, CompressionFactory.Compressor compressor) { HeadersBlockGenerator headerBlockGenerator = new HeadersBlockGenerator(); - generators.put(OpCode.PING,new PingFrameGenerator()); - generators.put(OpCode.PONG,new PongFrameGenerator()); - generators.put(OpCode.CLOSE,new CloseFrameGenerator()); + generators.put(OpCode.PING,new PingFrameGenerator(bufferPool)); + generators.put(OpCode.PONG,new PongFrameGenerator(bufferPool)); + generators.put(OpCode.CLOSE,new CloseFrameGenerator(bufferPool)); } diff --git a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/PingFrameGenerator.java b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/PingFrameGenerator.java index 8163cef126a..669a0b404a2 100644 --- a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/PingFrameGenerator.java +++ b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/PingFrameGenerator.java @@ -2,16 +2,31 @@ package org.eclipse.jetty.websocket.generator; import java.nio.ByteBuffer; +import org.eclipse.jetty.io.ByteBufferPool; +import org.eclipse.jetty.websocket.api.OpCode; import org.eclipse.jetty.websocket.frames.ControlFrame; +import org.eclipse.jetty.websocket.frames.PingFrame; public class PingFrameGenerator extends ControlFrameGenerator { + public PingFrameGenerator(ByteBufferPool bufferPool) + { + super(bufferPool); + } @Override public ByteBuffer generate(ControlFrame frame) { - // TODO Auto-generated method stub - return null; + PingFrame ping = (PingFrame)frame; + + ByteBuffer buffer = super.generate(frame); + + buffer.putInt(OpCode.PING.getCode()); + buffer.put(frame.getMask()); + buffer.putLong(frame.getPayloadLength()); + + buffer.put(ping.getPayload().array()); + return buffer; } } diff --git a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/PongFrameGenerator.java b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/PongFrameGenerator.java index a2bff039d03..c38a91902c8 100644 --- a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/PongFrameGenerator.java +++ b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/generator/PongFrameGenerator.java @@ -2,11 +2,16 @@ package org.eclipse.jetty.websocket.generator; import java.nio.ByteBuffer; +import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.websocket.frames.ControlFrame; public class PongFrameGenerator extends ControlFrameGenerator { - + public PongFrameGenerator(ByteBufferPool bufferPool) + { + super(bufferPool); + } + @Override public ByteBuffer generate(ControlFrame frame) {