private static WebSocketFrame readPayloadData( Stream stream, WebSocketFrame frame ) { var exactLen = frame.ExactPayloadLength; if (exactLen > PayloadData.MaxLength) { var msg = "A frame has too long payload length."; throw new WebSocketException(CloseStatusCode.TooBig, msg); } if (exactLen == 0) { frame._payloadData = PayloadData.Empty; return(frame); } var len = (long)exactLen; var bytes = frame._payloadLength < 127 ? stream.ReadBytes((int)exactLen) : stream.ReadBytes(len, 1024); if (bytes.LongLength != len) { var msg = "The payload data of a frame could not be read."; throw new WebSocketException(msg); } frame._payloadData = new PayloadData(bytes, len); return(frame); }
private static string print(WebSocketFrame frame) { string empty; byte num = frame._payloadLength; string str = (num > 125 ? frame.FullPayloadLength.ToString() : string.Empty); string str1 = BitConverter.ToString(frame._maskingKey); if (num == 0) { empty = string.Empty; } else if (num > 125) { empty = "---"; } else { empty = (!frame.IsText || frame.IsFragment || frame.IsMasked || frame.IsCompressed ? frame._payloadData.ToString() : frame._payloadData.ApplicationData.UTF8Decode()); } string str2 = empty; string str3 = "\r\n FIN: {0}\r\n RSV1: {1}\r\n RSV2: {2}\r\n RSV3: {3}\r\n Opcode: {4}\r\n MASK: {5}\r\n Payload Length: {6}\r\nExtended Payload Length: {7}\r\n Masking Key: {8}\r\n Payload Data: {9}"; return(string.Format(str3, new object[] { frame._fin, frame._rsv1, frame._rsv2, frame._rsv3, frame._opcode, frame._mask, num, str, str1, str2 })); }
public WebSocketFrame ReadFrame() { return(WebSocketFrame.Parse(_innerStream, true)); }
internal MessageEventArgs(WebSocketFrame frame) { _opcode = frame.Opcode; _rawData = frame.PayloadData.ApplicationData; _data = convertToString(_opcode, _rawData); }
private static void readHeaderAsync(Stream stream, Action <WebSocketFrame> completed, Action <Exception> error) { stream.ReadBytesAsync(2, (byte[] bytes) => completed(WebSocketFrame.processHeader(bytes)), error); }
private static string dump(WebSocketFrame frame) { ulong length = frame.Length; long num = (long)(length / 4uL); int num2 = (int)(length % 4uL); int num3; string arg5; if (num < 10000) { num3 = 4; arg5 = "{0,4}"; } else if (num < 65536) { num3 = 4; arg5 = "{0,4:X}"; } else if (num < 4294967296L) { num3 = 8; arg5 = "{0,8:X}"; } else { num3 = 16; arg5 = "{0,16:X}"; } string arg6 = $"{{0,{num3}}}"; string format = string.Format("\n{0} 01234567 89ABCDEF 01234567 89ABCDEF\n{0}+--------+--------+--------+--------+\\n", arg6); string lineFmt = $"{arg5}|{{1,8}} {{2,8}} {{3,8}} {{4,8}}|\n"; string format2 = $"{arg6}+--------+--------+--------+--------+"; StringBuilder output = new StringBuilder(64); Func <Action <string, string, string, string> > func = delegate { long lineCnt = 0L; return(delegate(string arg1, string arg2, string arg3, string arg4) { output.AppendFormat(lineFmt, ++lineCnt, arg1, arg2, arg3, arg4); }); }; output.AppendFormat(format, string.Empty); Action <string, string, string, string> action = func(); byte[] array = frame.ToByteArray(); for (long num4 = 0L; num4 <= num; num4++) { long num5 = num4 * 4; if (num4 < num) { action(Convert.ToString(array[num5], 2).PadLeft(8, '0'), Convert.ToString(array[num5 + 1], 2).PadLeft(8, '0'), Convert.ToString(array[num5 + 2], 2).PadLeft(8, '0'), Convert.ToString(array[num5 + 3], 2).PadLeft(8, '0')); } else if (num2 > 0) { action(Convert.ToString(array[num5], 2).PadLeft(8, '0'), (num2 < 2) ? string.Empty : Convert.ToString(array[num5 + 1], 2).PadLeft(8, '0'), (num2 != 3) ? string.Empty : Convert.ToString(array[num5 + 2], 2).PadLeft(8, '0'), string.Empty); } } output.AppendFormat(format2, string.Empty); return(output.ToString()); }
private static WebSocketFrame ProcessHeader(byte[] header) { if (header.Length != 2) { var msg = "The header part of a frame could not be read."; throw new WebSocketException(msg); } // FIN var fin = (header[0] & 0x80) == 0x80 ? Fin.Final : Fin.More; // RSV1 var rsv1 = (header[0] & 0x40) == 0x40 ? Rsv.On : Rsv.Off; // RSV2 var rsv2 = (header[0] & 0x20) == 0x20 ? Rsv.On : Rsv.Off; // RSV3 var rsv3 = (header[0] & 0x10) == 0x10 ? Rsv.On : Rsv.Off; // Opcode var opcode = (byte)(header[0] & 0x0f); // MASK var mask = (header[1] & 0x80) == 0x80 ? Mask.On : Mask.Off; // Payload Length var payloadLen = (byte)(header[1] & 0x7f); if (!opcode.IsSupported()) { var msg = "A frame has an unsupported opcode."; throw new WebSocketException(CloseStatusCode.ProtocolError, msg); } if (!opcode.IsData() && rsv1 == Rsv.On) { var msg = "A non data frame is compressed."; throw new WebSocketException(CloseStatusCode.ProtocolError, msg); } if (opcode.IsControl()) { if (fin == Fin.More) { var msg = "A control frame is fragmented."; throw new WebSocketException(CloseStatusCode.ProtocolError, msg); } if (payloadLen > 125) { var msg = "A control frame has too long payload length."; throw new WebSocketException(CloseStatusCode.ProtocolError, msg); } } var frame = new WebSocketFrame { _fin = fin, _rsv1 = rsv1, _rsv2 = rsv2, _rsv3 = rsv3, _opcode = (Opcode)opcode, _mask = mask, _payloadLength = payloadLen }; return(frame); }
internal static void Read(Stream stream, bool unmask, Action <WebSocketFrame> completed, Action <Exception> error) { WebSocketFrame frame = new WebSocketFrame(); frame.readHeader(stream, unmask, completed, error); }
private static string dump(WebSocketFrame frame) { int num2; string str1; ulong length = frame.Length; long num3 = (long)(length / (long)4); int num4 = (int)(length % (long)4); if (num3 < (long)10000) { num2 = 4; str1 = "{0,4}"; } else if (num3 < (long)65536) { num2 = 4; str1 = "{0,4:X}"; } else if (num3 >= 4294967296L) { num2 = 16; str1 = "{0,16:X}"; } else { num2 = 8; str1 = "{0,8:X}"; } string str2 = string.Format("{{0,{0}}}", num2); string str3 = string.Format("\r\n{0} 01234567 89ABCDEF 01234567 89ABCDEF\r\n{0}+--------+--------+--------+--------+\\n", str2); string str4 = string.Format("{0}|{{1,8}} {{2,8}} {{3,8}} {{4,8}}|\n", str1); string str5 = string.Format("{0}+--------+--------+--------+--------+", str2); StringBuilder stringBuilder = new StringBuilder(64); Action <string, string, string, string> action = new Func <Action <string, string, string, string> >(() => { long num1 = (long)0; return((string arg1, string arg2, string arg3, string arg4) => { StringBuilder cSu0024u003cu003e8_locals1 = stringBuilder; string str = str4; object[] objArray = new object[5]; long num = num1 + (long)1; num1 = num; objArray[0] = num; objArray[1] = arg1; objArray[2] = arg2; objArray[3] = arg3; objArray[4] = arg4; cSu0024u003cu003e8_locals1.AppendFormat(str, objArray); }); })(); stringBuilder.AppendFormat(str3, string.Empty); byte[] array = frame.ToArray(); for (long i = (long)0; i <= num3; i += (long)1) { long num5 = i * (long)4; if (i < num3) { action(Convert.ToString(array[checked ((IntPtr)num5)], 2).PadLeft(8, '0'), Convert.ToString(array[checked ((IntPtr)(num5 + (long)1))], 2).PadLeft(8, '0'), Convert.ToString(array[checked ((IntPtr)(num5 + (long)2))], 2).PadLeft(8, '0'), Convert.ToString(array[checked ((IntPtr)(num5 + (long)3))], 2).PadLeft(8, '0')); } else if (num4 > 0) { action(Convert.ToString(array[checked ((IntPtr)num5)], 2).PadLeft(8, '0'), (num4 >= 2 ? Convert.ToString(array[checked ((IntPtr)(num5 + (long)1))], 2).PadLeft(8, '0') : string.Empty), (num4 == 3 ? Convert.ToString(array[checked ((IntPtr)(num5 + (long)2))], 2).PadLeft(8, '0') : string.Empty), string.Empty); } } stringBuilder.AppendFormat(str5, string.Empty); return(stringBuilder.ToString()); }
internal static WebSocketFrame CreatePingFrame(byte[] data, bool mask) { WebSocketFrame webSocketFrames = new WebSocketFrame(WebSocketSharp.Fin.Final, WebSocketSharp.Opcode.Ping, new WebSocketSharp.PayloadData(data), false, mask); return(webSocketFrames); }
static WebSocketFrame() { WebSocketFrame.EmptyPingBytes = WebSocketFrame.CreatePingFrame(false).ToArray(); }
private static WebSocketFrame processHeader(byte[] header) { string headerStr = string.Empty; for (int i = 0; i < header.Length; i++) { headerStr += header[i].ToString("x2") + ", "; } if (header.Length != 2) { throw new WebSocketException( "The header part of a frame cannot be read from the data source. header = " + headerStr); } // FIN var fin = (header[0] & 0x80) == 0x80 ? Fin.Final : Fin.More; // RSV1 var rsv1 = (header[0] & 0x40) == 0x40 ? Rsv.On : Rsv.Off; // RSV2 var rsv2 = (header[0] & 0x20) == 0x20 ? Rsv.On : Rsv.Off; // RSV3 var rsv3 = (header[0] & 0x10) == 0x10 ? Rsv.On : Rsv.Off; // Opcode var opcode = (Opcode)(header[0] & 0x0f); // MASK var mask = (header[1] & 0x80) == 0x80 ? Mask.On : Mask.Off; // Payload Length var payloadLen = (byte)(header[1] & 0x7f); // Check if valid header. var err = isControl(opcode) && payloadLen > 125 ? "A control frame has payload data which is greater than the allowable max length." : isControl(opcode) && fin == Fin.More ? "A control frame is fragmented." : !isData(opcode) && rsv1 == Rsv.On ? "A non data frame is compressed." : null; if (err != null) { throw new WebSocketException(CloseStatusCode.ProtocolError, err); } var frame = new WebSocketFrame(); frame._fin = fin; frame._rsv1 = rsv1; frame._rsv2 = rsv2; frame._rsv3 = rsv3; frame._opcode = opcode; frame._mask = mask; frame._payloadLength = payloadLen; return(frame); }
private static string dump(WebSocketFrame frame) { int num4; string str;
private static WebSocketFrame read(byte[] header, Stream stream, bool unmask) { Fin fin = (((header[0] & 0x80) == 128) ? Fin.Final : Fin.More); Rsv rsv = (((header[0] & 0x40) == 64) ? Rsv.On : Rsv.Off); Rsv rsv2 = (((header[0] & 0x20) == 32) ? Rsv.On : Rsv.Off); Rsv rsv3 = (((header[0] & 0x10) == 16) ? Rsv.On : Rsv.Off); Opcode opcode = (Opcode)(header[0] & 0xFu); Mask mask = (((header[1] & 0x80) == 128) ? Mask.Mask : Mask.Unmask); byte b = (byte)(header[1] & 0x7Fu); string text = ((isControl(opcode) && b > 125) ? "A control frame has a payload data which is greater than the allowable max size." : ((isControl(opcode) && fin == Fin.More) ? "A control frame is fragmented." : ((isData(opcode) || rsv != Rsv.On) ? null : "A non data frame is compressed."))); if (text != null) { throw new WebSocketException(CloseStatusCode.ProtocolError, text); } WebSocketFrame webSocketFrame = new WebSocketFrame(); webSocketFrame._fin = fin; webSocketFrame._rsv1 = rsv; webSocketFrame._rsv2 = rsv2; webSocketFrame._rsv3 = rsv3; webSocketFrame._opcode = opcode; webSocketFrame._mask = mask; webSocketFrame._payloadLength = b; int num = ((b >= 126) ? ((b != 126) ? 8 : 2) : 0); byte[] array = ((num <= 0) ? new byte[0] : stream.ReadBytes(num)); if (num > 0 && array.Length != num) { throw new WebSocketException("The 'Extended Payload Length' of a frame cannot be read from the data source."); } webSocketFrame._extPayloadLength = array; bool flag = mask == Mask.Mask; byte[] array2 = ((!flag) ? new byte[0] : stream.ReadBytes(4)); if (flag && array2.Length != 4) { throw new WebSocketException("The 'Masking Key' of a frame cannot be read from the data source."); } webSocketFrame._maskingKey = array2; ulong num2 = ((b < 126) ? b : ((b != 126) ? array.ToUInt64(ByteOrder.Big) : array.ToUInt16(ByteOrder.Big))); byte[] array3 = null; if (num2 != 0) { if (b > 126 && num2 > long.MaxValue) { throw new WebSocketException(CloseStatusCode.TooBig, "The length of 'Payload Data' of a frame is greater than the allowable max length."); } array3 = ((b <= 126) ? stream.ReadBytes((int)num2) : stream.ReadBytes((long)num2, 1024)); if (array3.LongLength != (long)num2) { throw new WebSocketException("The 'Payload Data' of a frame cannot be read from the data source."); } } else { array3 = new byte[0]; } webSocketFrame._payloadData = new PayloadData(array3, flag); if (unmask && flag) { webSocketFrame.Unmask(); } return(webSocketFrame); }
public void ReadFrameAsync(Action <WebSocketFrame> completed, Action <Exception> error) { WebSocketFrame.ParseAsync(_innerStream, true, completed, error); }
public bool WriteFrame(WebSocketFrame frame) { return(Write(frame.ToByteArray())); }
public void Print(bool dumped) { Console.WriteLine((dumped ? WebSocketFrame.dump(this) : WebSocketFrame.print(this))); }
private static WebSocketFrame read(byte[] header, Stream stream, bool unmask) { /* Header */ // FIN var fin = (header[0] & 0x80) == 0x80 ? Fin.Final : Fin.More; // RSV1 var rsv1 = (header[0] & 0x40) == 0x40 ? Rsv.On : Rsv.Off; // RSV2 var rsv2 = (header[0] & 0x20) == 0x20 ? Rsv.On : Rsv.Off; // RSV3 var rsv3 = (header[0] & 0x10) == 0x10 ? Rsv.On : Rsv.Off; // Opcode var opcode = (Opcode)(header[0] & 0x0f); // MASK var mask = (header[1] & 0x80) == 0x80 ? Mask.Mask : Mask.Unmask; // Payload Length var payloadLen = (byte)(header[1] & 0x7f); // Check if valid header var err = isControl(opcode) && payloadLen > 125 ? "A control frame has a payload data which is greater than the allowable max size." : isControl(opcode) && fin == Fin.More ? "A control frame is fragmented." : !isData(opcode) && rsv1 == Rsv.On ? "A non data frame is compressed." : null; if (err != null) { throw new WebSocketException(CloseStatusCode.ProtocolError, err); } var frame = new WebSocketFrame(); frame._fin = fin; frame._rsv1 = rsv1; frame._rsv2 = rsv2; frame._rsv3 = rsv3; frame._opcode = opcode; frame._mask = mask; frame._payloadLength = payloadLen; /* Extended Payload Length */ var size = payloadLen < 126 ? 0 : payloadLen == 126 ? 2 : 8; var extPayloadLen = size > 0 ? stream.ReadBytes(size) : new byte[0]; if (size > 0 && extPayloadLen.Length != size) { throw new WebSocketException( "The 'Extended Payload Length' of a frame cannot be read from the data source."); } frame._extPayloadLength = extPayloadLen; /* Masking Key */ var masked = mask == Mask.Mask; var maskingKey = masked ? stream.ReadBytes(4) : new byte[0]; if (masked && maskingKey.Length != 4) { throw new WebSocketException( "The 'Masking Key' of a frame cannot be read from the data source."); } frame._maskingKey = maskingKey; /* Payload Data */ ulong len = payloadLen < 126 ? payloadLen : payloadLen == 126 ? extPayloadLen.ToUInt16(ByteOrder.Big) : extPayloadLen.ToUInt64(ByteOrder.Big); byte[] data = null; if (len > 0) { // Check if allowable max length. if (payloadLen > 126 && len > PayloadData.MaxLength) { throw new WebSocketException( CloseStatusCode.TooBig, "The length of 'Payload Data' of a frame is greater than the allowable max length."); } data = payloadLen > 126 ? stream.ReadBytes((long)len, 1024) : stream.ReadBytes((int)len); if (data.LongLength != (long)len) { throw new WebSocketException( "The 'Payload Data' of a frame cannot be read from the data source."); } } else { data = new byte[0]; } frame._payloadData = new PayloadData(data, masked); if (unmask && masked) { frame.Unmask(); } return(frame); }
public string PrintToString(bool dumped) { return(dumped ? WebSocketFrame.dump(this) : WebSocketFrame.print(this)); }
private static string Dump(WebSocketFrame frame) { var len = frame.Length; var cnt = (long)(len / 4); var rem = (int)(len % 4); int cntDigit; string cntFmt; if (cnt < 10000) { cntDigit = 4; cntFmt = "{0,4}"; } else if (cnt < 0x010000) { cntDigit = 4; cntFmt = "{0,4:X}"; } else if (cnt < 0x0100000000) { cntDigit = 8; cntFmt = "{0,8:X}"; } else { cntDigit = 16; cntFmt = "{0,16:X}"; } var spFormat = String.Format("{{0,{0}}}", cntDigit); var headerFormat = String.Format( @" {0} 01234567 89ABCDEF 01234567 89ABCDEF {0}+--------+--------+--------+--------+\n", spFormat); var lineFormat = String.Format( "{0}|{{1,8}} {{2,8}} {{3,8}} {{4,8}}|\n", cntFmt ); var footerFmt = String.Format( "{0}+--------+--------+--------+--------+", spFormat ); var buff = new StringBuilder(64); Action <string, string, string, string> linePrinter() { long lineCnt = 0; return((arg1, arg2, arg3, arg4) => { buff.AppendFormat(lineFormat, ++lineCnt, arg1, arg2, arg3, arg4); }); } var printLine = linePrinter(); var bytes = frame.ToArray(); buff.AppendFormat(headerFormat, String.Empty); for (long i = 0; i <= cnt; i++) { var j = i * 4; if (i < cnt) { printLine( Convert.ToString(bytes[j], 2).PadLeft(8, '0'), Convert.ToString(bytes[j + 1], 2).PadLeft(8, '0'), Convert.ToString(bytes[j + 2], 2).PadLeft(8, '0'), Convert.ToString(bytes[j + 3], 2).PadLeft(8, '0') ); continue; } if (rem > 0) { printLine( Convert.ToString(bytes[j], 2).PadLeft(8, '0'), rem >= 2 ? Convert.ToString(bytes[j + 1], 2).PadLeft(8, '0') : String.Empty, rem == 3 ? Convert.ToString(bytes[j + 2], 2).PadLeft(8, '0') : String.Empty, String.Empty ); } } buff.AppendFormat(footerFmt, String.Empty); return(buff.ToString()); }
private static WebSocketFrame readHeader(Stream stream) { return(WebSocketFrame.processHeader(stream.ReadBytes(2))); }
internal MessageEventArgs(WebSocketFrame frame) { _opcode = frame.Opcode; _rawData = frame.PayloadData.ApplicationData; }
private static WebSocketFrame parse(byte [] header, Stream stream, bool unmask) { /* Header */ // FIN var fin = (header [0] & 0x80) == 0x80 ? Fin.Final : Fin.More; // RSV1 var rsv1 = (header [0] & 0x40) == 0x40 ? Rsv.On : Rsv.Off; // RSV2 var rsv2 = (header [0] & 0x20) == 0x20 ? Rsv.On : Rsv.Off; // RSV3 var rsv3 = (header [0] & 0x10) == 0x10 ? Rsv.On : Rsv.Off; // Opcode var opcode = (Opcode)(header [0] & 0x0f); // MASK var mask = (header [1] & 0x80) == 0x80 ? Mask.Mask : Mask.Unmask; // Payload Length var payloadLen = (byte)(header [1] & 0x7f); // Check if correct frame. var incorrect = isControl(opcode) && fin == Fin.More ? "A control frame is fragmented." : !isData(opcode) && rsv1 == Rsv.On ? "A non data frame is compressed." : null; if (incorrect != null) { throw new WebSocketException(CloseStatusCode.IncorrectData, incorrect); } // Check if consistent frame. if (isControl(opcode) && payloadLen > 125) { throw new WebSocketException( CloseStatusCode.InconsistentData, "The length of payload data of a control frame is greater than 125 bytes."); } var frame = new WebSocketFrame(); frame._fin = fin; frame._rsv1 = rsv1; frame._rsv2 = rsv2; frame._rsv3 = rsv3; frame._opcode = opcode; frame._mask = mask; frame._payloadLength = payloadLen; /* Extended Payload Length */ var size = payloadLen < 126 ? 0 : payloadLen == 126 ? 2 : 8; var extPayloadLen = size > 0 ? stream.ReadBytes(size) : new byte [0]; if (size > 0 && extPayloadLen.Length != size) { throw new WebSocketException( "The 'Extended Payload Length' of a frame cannot be read from the data source."); } frame._extPayloadLength = extPayloadLen; /* Masking Key */ var masked = mask == Mask.Mask; var maskingKey = masked ? stream.ReadBytes(4) : new byte [0]; if (masked && maskingKey.Length != 4) { throw new WebSocketException( "The 'Masking Key' of a frame cannot be read from the data source."); } frame._maskingKey = maskingKey; /* Payload Data */ ulong len = payloadLen < 126 ? payloadLen : payloadLen == 126 ? extPayloadLen.ToUInt16(ByteOrder.Big) : extPayloadLen.ToUInt64(ByteOrder.Big); byte [] data = null; if (len > 0) { // Check if allowable payload data length. if (payloadLen > 126 && len > PayloadData.MaxLength) { throw new WebSocketException( CloseStatusCode.TooBig, "The length of 'Payload Data' of a frame is greater than the allowable length."); } data = payloadLen > 126 ? stream.ReadBytes((long)len, 1024) : stream.ReadBytes((int)len); if (data.LongLength != (long)len) { throw new WebSocketException( "The 'Payload Data' of a frame cannot be read from the data source."); } } else { data = new byte [0]; } Debug.Log("WebSocketFrame parse is : data: " + System.Text.Encoding.Default.GetString(data)); var payload = new PayloadData(data, masked); if (masked && unmask) { payload.Mask(maskingKey); frame._mask = Mask.Unmask; frame._maskingKey = new byte [0]; } frame._payloadData = payload; return(frame); }