Beispiel #1
0
 /// <summary>
 /// Initiates the WS close handshake.
 /// </summary>
 /// <param name="reason">the status code.</param>
 /// <param name="lastSeenStreamId">the last stream id.</param>
 public void Close(StatusCode reason, int lastSeenStreamId)
 {
     if (this.opened)
     {
         List <byte> byteList = new List <byte>();
         byteList.AddRange(BinaryHelper.Int16ToBytes((Int16)reason));
         byteList.AddRange(BinaryHelper.Int32ToBytes(lastSeenStreamId));
         this.webSocket.Close(byteList.ToArray());
     }
 }
Beispiel #2
0
        /// <summary>
        /// Serializes the data frame.
        /// </summary>
        /// <param name="frame">The frame.</param>
        /// <returns>Binary representation of the frame.</returns>
        private static byte[] SerializeDataFrame(DataFrame frame)
        {
            var data = new byte[8 + frame.Length];

            BinaryHelper.Int32ToBytes(frame.StreamId, new ArraySegment <byte>(data, 0, 4));
            data[4] = frame.Flags;
            BinaryHelper.Int32ToBytes(frame.Length, new ArraySegment <byte>(data, 5, 3));
            Buffer.BlockCopy(frame.Data, 0, data, 8, frame.Length);

            return(data);
        }
Beispiel #3
0
        /// <summary>
        /// Serializes the control frame.
        /// </summary>
        /// <param name="frame">The frame.</param>
        /// <returns>Serialized control frame.</returns>
        private byte[] SerializeControlFrame(ControlFrame frame)
        {
            var byteList = new List <byte>();

            byteList.Add((byte)(((frame.Version & 0xFF00) >> 8) | 0x80));
            byteList.Add((byte)(frame.Version & 0x00FF));

            byteList.Add((byte)(((Int16)frame.Type & 0xFF00) >> 8));
            byteList.Add((byte)((Int16)frame.Type & 0x00FF));

            byteList.AddRange(BinaryHelper.Int32ToBytes(frame.StreamId));

            var headersArray = new byte[0];

            switch (frame.Type)
            {
            case FrameType.SynStream:
                byteList.Add(Convert.ToByte(frame.Flags | (frame.IsFinal ? 0x01 : 0x00)));
                byteList.Add(Convert.ToByte(frame.Priority >> 5));
                byteList.Add(Unused);
                byteList.Add(Unused);
                headersArray = SerializeControlFrameHeaders(frame.Headers);
                break;

            case FrameType.RTS:
                byteList.AddRange(BinaryHelper.Int32ToBytes((int)frame.StatusCode));
                break;

            case FrameType.SynReply:
                byteList.Add(frame.Flags);
                byteList.Add(Unused);
                byteList.Add(Unused);
                byteList.Add(Unused);
                headersArray = SerializeControlFrameHeaders(frame.Headers);
                break;

            case FrameType.CreditUpdate:
                byteList.AddRange(BinaryHelper.Int64ToBytes(((CreditUpdateFrame)frame).CreditAddition));
                break;
            }

            if (headersArray.Length > 0)
            {
                ProcessorRun(ref headersArray, DirectionProcessType.Outbound, frame.Flags);
            }

            byteList.AddRange(headersArray);
            return(byteList.ToArray());
        }
Beispiel #4
0
        private byte[] SerializeControlFrameHeaders(SMHeaders frameHeaders)
        {
            var headers = new List <byte>();

            foreach (KeyValuePair <string, string> pair in frameHeaders)
            {
                byte[] nameBin = Encoding.UTF8.GetBytes(pair.Key);

                headers.AddRange(BinaryHelper.Int32ToBytes(nameBin.Length));
                headers.AddRange(nameBin);

                byte[] valBin = Encoding.UTF8.GetBytes(pair.Value);
                headers.AddRange(BinaryHelper.Int32ToBytes(valBin.Length));

                headers.AddRange(valBin);
            }

            return(headers.ToArray());
        }