public static byte[] FrameData(byte[] payload, FrameType frameType) { var memoryStream = new MemoryStream(); byte op = (byte)((byte)frameType + 128); memoryStream.WriteByte(op); if (payload.Length > UInt16.MaxValue) { memoryStream.WriteByte(127); var lengthBytes = IntExtensions.ToBigEndianBytes <ulong>(payload.Length); memoryStream.Write(lengthBytes, 0, lengthBytes.Length); } else if (payload.Length > 125) { memoryStream.WriteByte(126); var lengthBytes = IntExtensions.ToBigEndianBytes <ushort>(payload.Length); memoryStream.Write(lengthBytes, 0, lengthBytes.Length); } else { memoryStream.WriteByte((byte)payload.Length); } memoryStream.Write(payload, 0, payload.Length); return(memoryStream.ToArray()); }
public static IHandler Create(WebSocketHttpRequest request, Action <string> onMessage, Action onClose, Action <byte[]> onBinary, Action <byte[]> onPing, Action <byte[]> onPong) { var readState = new ReadState(); return(new ComposableHandler { Handshake = sub => Hybi13Handler.BuildHandshake(request, sub), TextFrame = s => Hybi13Handler.FrameData(Encoding.UTF8.GetBytes(s), FrameType.Text), BinaryFrame = s => Hybi13Handler.FrameData(s, FrameType.Binary), PingFrame = s => Hybi13Handler.FrameData(s, FrameType.Ping), PongFrame = s => Hybi13Handler.FrameData(s, FrameType.Pong), CloseFrame = i => Hybi13Handler.FrameData(IntExtensions.ToBigEndianBytes <ushort>(i), FrameType.Close), ReceiveData = d => Hybi13Handler.ReceiveData(d, readState, (op, data) => Hybi13Handler.ProcessFrame(op, data, onMessage, onClose, onBinary, onPing, onPong)) }); }