Example #1
0
        void StartClosingHandshake(CloseEventCode code, string reason)
        {
            Debug.Log("WebSocketChannel closing");
            if (closing)
            {
                return;
            }

            List <byte> buf = new List <byte> ();

            if (!receivedClosingHandshake && code != CloseEventCode.CloseEventCodeNotSpecified)
            {
                byte hb = (byte)((int)code >> 8);
                byte lb = (byte)code;
                buf.Add(hb);
                buf.Add(lb);
                buf.AddRange(System.Text.UTF8Encoding.UTF8.GetBytes(reason));
            }
            Send(buf.ToArray());               // OpCode.OpCodeClose,
            closing = true;
        }
Example #2
0
        void StartClosingHandshake(CloseEventCode code, string reason)
        {
            if (closing)
            {
                return;
            }

            List <byte> buf = new List <byte> ();

            //if (!receivedClosingHandshake && code != CloseEventCode.CloseEventCodeNotSpecified) {
            if (!receivedClosingHandshake)
            {
                byte hb = (byte)((int)code >> 8);
                byte lb = (byte)code;
                buf.Add(hb);
                buf.Add(lb);
                buf.AddRange(enc.GetBytes(reason));
                outgoing.Add(new OutgoingMessage(OpCode.OpCodeClose, buf.ToArray()));
            }


            closing = true;
        }
Example #3
0
        bool ProcessFrame(List <byte> buffer)
        {
            FrameData frame;

            if (ParseFrame(buffer, out frame) != ParseFrameResult.FrameOK)
            {
                return(false);
            }

            switch (frame.opCode)
            {
            case OpCode.OpCodeContinuation:
                // An unexpected continuation frame is received without any leading frame.
                if (!hasContinuousFrame)
                {
                    Debug.LogWarning("Received unexpected continuation frame.");
                    return(false);
                }
                continuousFrameData.AddRange(new SubArray(buffer, frame.payload, frame.payloadLength));
                RemoveProcessed(buffer, frame.end);
                if (frame.final)
                {
                    continuousFrameData = new List <byte> ();
                    hasContinuousFrame  = false;
                    if (continuousFrameOpCode == OpCode.OpCodeText)
                    {
                        var message = "";
                        if (continuousFrameData.Count > 0)
                        {
                            var array = continuousFrameData.ToArray();
                            message = enc.GetString(array, 0, array.Length);
                        }
                        OnTextMessage(message);
                    }
                    else if (continuousFrameOpCode == OpCode.OpCodeBinary)
                    {
                        OnBinaryMessage(continuousFrameData.ToArray());
                    }
                }
                break;

            case OpCode.OpCodeText:
                if (frame.final)
                {
                    String message = "";
                    if (frame.payloadLength > 0)
                    {
                        var payload = new byte[frame.payloadLength];
                        buffer.CopyTo(frame.payload, payload, 0, frame.payloadLength);
                        message = enc.GetString(payload, 0, payload.Length);
                    }
                    OnTextMessage(message);
                    RemoveProcessed(buffer, frame.end);
                }
                else
                {
                    hasContinuousFrame    = true;
                    continuousFrameOpCode = OpCode.OpCodeText;
                    continuousFrameData.AddRange(new SubArray(buffer, frame.payload, frame.payloadLength));
                    RemoveProcessed(buffer, frame.end);
                }
                break;

            case OpCode.OpCodeBinary:
                if (frame.final)
                {
                    byte[] payload = new byte[frame.payloadLength];
                    buffer.CopyTo(frame.payload, payload, 0, frame.payloadLength);
                    OnBinaryMessage(payload);
                    RemoveProcessed(buffer, frame.end);
                }
                else
                {
                    hasContinuousFrame    = true;
                    continuousFrameOpCode = OpCode.OpCodeBinary;
                    continuousFrameData.AddRange(new SubArray(buffer, frame.payload, frame.payloadLength));
                    RemoveProcessed(buffer, frame.end);
                }
                break;

            case OpCode.OpCodeClose:
                if (frame.payloadLength >= 2)
                {
                    byte highByte = buffer [frame.payload + 0];
                    byte lowByte  = buffer [frame.payload + 1];
                    closeEventCode = (CloseEventCode)(highByte << 8 | lowByte);
                }
                else
                {
                    closeEventCode = CloseEventCode.CloseEventCodeNoStatusRcvd;
                }
                if (frame.payloadLength >= 3)
                {
                    byte[] payload = new byte[frame.payloadLength - 2];
                    buffer.CopyTo(2, payload, 0, frame.payloadLength - 2);
                    closeEventReason = enc.GetString(payload, 0, payload.Length);
                }
                else
                {
                    closeEventReason = "";
                }
                RemoveProcessed(buffer, frame.end);
                receivedClosingHandshake = true;
                StartClosingHandshake(closeEventCode, closeEventReason);
                break;

            case OpCode.OpCodePing:

                var reply = new byte[frame.payloadLength];
                buffer.CopyTo(frame.payload, reply, 0, frame.payloadLength);
                RemoveProcessed(buffer, frame.end);

                // reply with Pong!
                lock (outgoing) {
                    outgoing.Add(new OutgoingMessage(OpCode.OpCodePong, reply));
                }

                break;

            case OpCode.OpCodePong:
                // do nothing with a pong, just remove processed bytes
                RemoveProcessed(buffer, frame.end);
                break;

            default:
                Debug.LogError("SHOULD NOT REACH HERE");
                break;
            }
            ;

            return(buffer.Count != 0);
        }
Example #4
0
 public void Close(CloseEventCode code, string reason)
 {
     StartClosingHandshake(code, reason);
 }