예제 #1
0
        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);
        }
예제 #2
0
        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 }));
        }
예제 #3
0
 public WebSocketFrame ReadFrame()
 {
     return(WebSocketFrame.Parse(_innerStream, true));
 }
예제 #4
0
 internal MessageEventArgs(WebSocketFrame frame)
 {
     _opcode  = frame.Opcode;
     _rawData = frame.PayloadData.ApplicationData;
     _data    = convertToString(_opcode, _rawData);
 }
예제 #5
0
 private static void readHeaderAsync(Stream stream, Action <WebSocketFrame> completed, Action <Exception> error)
 {
     stream.ReadBytesAsync(2, (byte[] bytes) => completed(WebSocketFrame.processHeader(bytes)), error);
 }
예제 #6
0
        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());
        }
예제 #7
0
        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);
        }
예제 #8
0
        internal static void Read(Stream stream, bool unmask, Action <WebSocketFrame> completed, Action <Exception> error)
        {
            WebSocketFrame frame = new WebSocketFrame();

            frame.readHeader(stream, unmask, completed, error);
        }
예제 #9
0
        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());
        }
예제 #10
0
        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);
        }
예제 #11
0
 static WebSocketFrame()
 {
     WebSocketFrame.EmptyPingBytes = WebSocketFrame.CreatePingFrame(false).ToArray();
 }
예제 #12
0
        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);
        }
예제 #13
0
 private static string dump(WebSocketFrame frame)
 {
     int    num4;
     string str;
예제 #14
0
        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);
        }
예제 #15
0
 public void ReadFrameAsync(Action <WebSocketFrame> completed, Action <Exception> error)
 {
     WebSocketFrame.ParseAsync(_innerStream, true, completed, error);
 }
예제 #16
0
 public bool WriteFrame(WebSocketFrame frame)
 {
     return(Write(frame.ToByteArray()));
 }
예제 #17
0
 public void Print(bool dumped)
 {
     Console.WriteLine((dumped ? WebSocketFrame.dump(this) : WebSocketFrame.print(this)));
 }
예제 #18
0
        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);
        }
예제 #19
0
 public string PrintToString(bool dumped)
 {
     return(dumped ? WebSocketFrame.dump(this) : WebSocketFrame.print(this));
 }
예제 #20
0
        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());
        }
예제 #21
0
 private static WebSocketFrame readHeader(Stream stream)
 {
     return(WebSocketFrame.processHeader(stream.ReadBytes(2)));
 }
예제 #22
0
 internal MessageEventArgs(WebSocketFrame frame)
 {
     _opcode  = frame.Opcode;
     _rawData = frame.PayloadData.ApplicationData;
 }
예제 #23
0
        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);
        }