public WebSocketFrameParseResult(WebSocketFrame webSocketFrame, byte[] overhead)
        {
            if (webSocketFrame == null) throw new ArgumentNullException(nameof(webSocketFrame));
            if (overhead == null) throw new ArgumentNullException(nameof(overhead));

            WebSocketFrame = webSocketFrame;
            Overhead = overhead;
        }
        /// <summary>
        /// It will send the given frame to the server.
        /// </summary>
        public void Send(WebSocketFrame frame)
        {
            if (frame == null)
            {
                throw new ArgumentNullException("frame is null!");
            }

            if (closed)
            {
                return;
            }

            byte[] rawData = frame.Get();
            lock (SendLock)
            {
                Stream.Write(rawData, 0, rawData.Length);
                Stream.Flush();

                if (frame.Type == WebSocketFrameTypes.ConnectionClose)
                {
                    closeSent = true;
                }
            }
        }
예제 #3
0
        private void WriteWebSocketFrame(DataWriter writer, WebSocketFrame frame)
        {
            if (frame.PayloadLength > MaxPacketLength)
            {
                throw new Exception("packet length exceeds maxPacketLength.");
            }

            var stream = (SendStream)writer.BaseStream;

            writer.Write((byte)(((frame.IsFrameEndOf ? 1 : 0) << 7) | (int)frame.Opcode));
            if (frame.PayloadLength < 126)
            {
                writer.Write((byte)(((stream.IsMask ? 1 : 0) << 7) | frame.PayloadLength));
            }
            else if (frame.PayloadLength < ushort.MaxValue)
            {
                writer.Write((byte)(((stream.IsMask ? 1 : 0) << 7) | 126));
                writer.Write(((ushort)frame.PayloadLength).SwapUInt16());
            }
            else
            {
                writer.Write((byte)(((stream.IsMask ? 1 : 0) << 7) | 127));
                writer.Write(((ulong)frame.PayloadLength).SwapUInt64());
            }

            if (!stream.IsMask)
            {
                writer.Write(frame.PayloadData);
            }
            else
            {
                writer.Write(stream.MaskingKey);
                writer.Write(frame.PayloadData);
                stream.GobackMasking(frame.PayloadLength);
            }
        }
        /// <summary>
        /// It will send the given frame to the server.
        /// </summary>
        public void Send(WebSocketFrame frame)
        {
            if (frame == null)
            {
                throw new ArgumentNullException("frame is null!");
            }

            if (closed || closeSent)
            {
                return;
            }

            lock (SendLock)
            {
                this.unsentFrames.Add(frame);

                if (!sendThreadCreated)
                {
#if NETFX_CORE
#pragma warning disable 4014
                    Windows.System.Threading.ThreadPool.RunAsync(SendThreadFunc);
#pragma warning restore 4014
#else
                    ThreadPool.QueueUserWorkItem(SendThreadFunc);
#endif
                    sendThreadCreated = true;
                }
            }

            Interlocked.Add(ref this._bufferedAmount, frame.Data != null ? frame.Data.Length : 0);

            //if (HTTPManager.Logger.Level <= Logger.Loglevels.All)
            //    HTTPManager.Logger.Information("WebSocketResponse", "Signaling SendThread!");

            newFrameSignal.Set();
        }
        public Dictionary <string, Dictionary <string, bool> > Broadping(string message)
        {
            Dictionary <string, Dictionary <string, bool> > strs;

            if ((message == null ? false : message.Length != 0))
            {
                byte[] numArray = null;
                string str      = ((ServerState)this._state).CheckIfAvailable(false, true, false) ?? WebSocket.CheckPingParameter(message, out numArray);
                if (str == null)
                {
                    strs = this.broadping(WebSocketFrame.CreatePingFrame(numArray, false).ToArray(), this._waitTime);
                }
                else
                {
                    this._logger.Error(str);
                    strs = null;
                }
            }
            else
            {
                strs = this.Broadping();
            }
            return(strs);
        }
예제 #6
0
        /// <summary>
        ///     Receives the asynchronous.
        /// </summary>
        /// <param name="socket">The socket.</param>
        /// <param name="result">The result.</param>
        /// <param name="buffer">The buffer.</param>
        /// <returns></returns>
        public override async Task ReceiveAsync(WebSocket socket, WebSocketReceiveResult result, byte[] buffer)
        {
            var beaconId = WebSocketManager.GetId(socket);
            var frame    = WebSocketFrame.Decode(Encoding.UTF8.GetString(buffer));

            switch (frame.Type)
            {
            case FrameType.Connect:
            case FrameType.ToBeacon:
                Console.WriteLine("Server doesn't need to handle Connect/ToBeacon frames");
                break;

            case FrameType.Stager:
                // Get stager from server channel
                var stager     = GetStager(beaconId, frame.Buffer[0] == 0x64);
                var stageFrame = new WebSocketFrame(FrameType.Stager, beaconId.InternalId, stager);
                // Send stager to beacon channel
                await SendMessageAsync(beaconId, stageFrame.Encode());

                break;

            case FrameType.ToServer:
                // Send frame to server channel
                SendFrame(beaconId, frame.Buffer);
                // Read frame from server channel
                var respFrame = new WebSocketFrame(FrameType.ToBeacon, beaconId.InternalId, ReadFrame(beaconId));
                // Send frame to beacon channel
                await SendMessageAsync(beaconId, respFrame.Encode());

                break;

            default:
                Console.WriteLine("Unknown frame type...");
                break;
            }
        }
예제 #7
0
        private void streamData(object sender, ElapsedEventArgs e)
        {
            streamTimer.Interval = streamRate;

            DataSources dataSources = new DataSources();

            if (toRun.Count + subscriptions.Count > 0)
            {
                try
                {
                    List <string> entries = new List <string>();

                    APIEntry entry = null;

                    lock (subscriptionLock)
                    {
                        dataSources.vessel = kspAPI.getVessel();

                        //Only parse the paused argument if the active vessel is null
                        if (dataSources.vessel != null)
                        {
                            toRun.UnionWith(subscriptions);

                            foreach (string s in toRun)
                            {
                                DataSources dataSourcesClone = dataSources.Clone();
                                string      trimedQuotes     = s.Trim();
                                string      refArg           = trimedQuotes;
                                kspAPI.parseParams(ref refArg, ref dataSourcesClone);

                                kspAPI.process(refArg, out entry);

                                if (entry != null)
                                {
                                    dataSourcesClone.setVarName(trimedQuotes);
                                    entries.Add(entry.formatter.format(entry.function(dataSourcesClone), dataSourcesClone.getVarName()));
                                }
                            }

                            toRun.Clear();

                            if (entry != null)
                            {
                                WebSocketFrame frame  = new WebSocketFrame(ASCIIEncoding.UTF8.GetBytes(entry.formatter.pack(entries)));
                                byte[]         bFrame = frame.AsBytes();
                                dataRates.addDownLinkPoint(System.DateTime.Now, bFrame.Length * UpLinkDownLinkRate.BITS_PER_BYTE);
                                clientConnection.Send(bFrame);
                            }
                        }
                        else
                        {
                            sendNullMessage();
                        }
                    }
                }
                catch (NullReferenceException)
                {
                    PluginLogger.debug("Swallowing null reference exception, potentially due to async game state change.");
                    sendNullMessage();
                }
                catch (Exception ex)
                {
                    PluginLogger.debug("Closing socket due to potential client disconnect:" + ex.GetType().ToString());
                    close();
                }
            }
            else
            {
                sendNullMessage();
            }
        }
예제 #8
0
    // As server, used to broadcast
    internal void Send (Opcode opcode, byte[] data, Dictionary<CompressionMethod, byte[]> cache)
    {
      lock (_forSend) {
        lock (_forConn) {
          if (_readyState != WebSocketState.Open) {
            _logger.Error ("The sending has been interrupted.");
            return;
          }

          try {
            byte[] cached;
            if (!cache.TryGetValue (_compression, out cached)) {
              cached = new WebSocketFrame (
                Fin.Final,
                opcode,
                data.Compress (_compression),
                _compression != CompressionMethod.None,
                false)
                .ToArray ();

              cache.Add (_compression, cached);
            }

            sendBytes (cached);
          }
          catch (Exception ex) {
            _logger.Fatal (ex.ToString ());
          }
        }
      }
    }
예제 #9
0
    private bool processPingFrame (WebSocketFrame frame)
    {
      if (send (new WebSocketFrame (Opcode.Pong, frame.PayloadData, _client).ToArray ()))
        _logger.Trace ("Returned a Pong.");

      if (_emitOnPing)
        enqueueToMessageEventQueue (new MessageEventArgs (frame));

      return true;
    }
        public void OpCodeText(object sender, FrameEventArgs e)
        {
            WebSocketFrame frame = new WebSocketFrame(ASCIIEncoding.UTF8.GetBytes("Echo: " + e.frame.PayloadAsUTF8()));

            e.clientConnection.Send(frame.AsBytes());
        }
예제 #11
0
 internal MessageEventArgs(WebSocketFrame frame)
 {
     _opcode = frame.Opcode;
     _rawData = frame.PayloadData.ApplicationData;
 }
 internal WebSocketResponse(WebSocketFrame frame)
     : base(frame.Opcode, frame.Payload)
 {
 }
 protected override int NewRsv(WebSocketFrame msg) => msg.Rsv ^ WebSocketRsv.Rsv1;
예제 #14
0
 internal MessageEventArgs(WebSocketFrame frame)
 {
     _opcode = frame.Opcode;
       _rawData = frame.PayloadData.ApplicationData;
       _data = convertToString (_opcode, _rawData);
 }
예제 #15
0
        private void streamData(object sender, ElapsedEventArgs e)
        {
            streamTimer.Interval = streamRate;

            DataSources dataSources = new DataSources();

            if (toRun.Count + subscriptions.Count > 0)
            {
                try
                {
                    List<string> entries = new List<string>();

                    APIEntry entry = null;

                    lock (subscriptionLock)
                    {
                        dataSources.vessel = kspAPI.getVessel();

                        //Only parse the paused argument if the active vessel is null
                        if (dataSources.vessel != null)
                        {
                            toRun.UnionWith(subscriptions);

                            foreach (string s in toRun)
                            {
                                DataSources dataSourcesClone = dataSources.Clone();
                                string trimedQuotes = s.Trim();
                                string refArg = trimedQuotes;
                                kspAPI.parseParams(ref refArg, ref dataSourcesClone);

                                kspAPI.process(refArg, out entry);

                                if (entry != null)
                                {
                                    entry.formatter.setVarName(trimedQuotes);
                                    entries.Add(entry.formatter.format(entry.function(dataSourcesClone)));
                                }
                            }

                            toRun.Clear();

                            if (entry != null)
                            {
                                WebSocketFrame frame = new WebSocketFrame(ASCIIEncoding.UTF8.GetBytes(entry.formatter.pack(entries)));
                                byte[] bFrame = frame.AsBytes();
                                dataRates.addDownLinkPoint(System.DateTime.Now, bFrame.Length * UpLinkDownLinkRate.BITS_PER_BYTE);
                                clientConnection.Send(bFrame);
                            }
                        }
                        else
                        {
                            sendNullMessage();
                        }
                    }
                }
                catch(NullReferenceException)
                {
                    PluginLogger.debug("Swallowing null reference exception, potentially due to async game state change.");
                    sendNullMessage();
                }
                catch (Exception ex)
                {
                    PluginLogger.debug("Closing socket due to potential client disconnect:" + ex.GetType().ToString());
                    close();
                }
            }
            else
            {
                sendNullMessage();
            }
        }
예제 #16
0
 public bool MustSkip(WebSocketFrame frame)
 {
     return((frame is TextWebSocketFrame || frame is BinaryWebSocketFrame) && frame.Content.ReadableBytes < 100);
 }
예제 #17
0
        private void SendThreadFunc(object param)
        {
            List <WebSocketFrame> localFrames = new List <WebSocketFrame>();

            try
            {
                while (!closed && !closeSent)
                {
                    if (HTTPManager.Logger.Level <= Logger.Loglevels.Information)
                    {
                        HTTPManager.Logger.Information("WebSocketResponse", "SendThread - Waiting...");
                    }
                    newFrameSignal.WaitOne();

                    try
                    {
                        lock (SendLock)
                        {
                            // add frames reversed in order
                            for (int i = this.unsentFrames.Count - 1; i >= 0; --i)
                            {
                                localFrames.Add(this.unsentFrames[i]);
                            }

                            this.unsentFrames.Clear();
                        }

                        if (HTTPManager.Logger.Level <= Logger.Loglevels.Information)
                        {
                            HTTPManager.Logger.Information("WebSocketResponse", "SendThread - Wait is over, " + localFrames.Count.ToString() + " new frames!");
                        }

                        while (localFrames.Count > 0)
                        {
                            WebSocketFrame frame = localFrames[localFrames.Count - 1];
                            localFrames.RemoveAt(localFrames.Count - 1);

                            if (!closeSent)
                            {
                                byte[] rawData = frame.Get();
                                Stream.Write(rawData, 0, rawData.Length);
                                Stream.Flush();

                                if (frame.Type == WebSocketFrameTypes.ConnectionClose)
                                {
                                    closeSent = true;
                                }
                            }

                            Interlocked.Add(ref this._bufferedAmount, -frame.Data.Length);
                        }
                    }
                    catch (Exception ex)
                    {
                        if (HTTPUpdateDelegator.IsCreated)
                        {
                            this.baseRequest.Exception = ex;
                            this.baseRequest.State     = HTTPRequestStates.Error;
                        }
                        else
                        {
                            this.baseRequest.State = HTTPRequestStates.Aborted;
                        }

                        closed = true;
                    }
                }
            }
            finally
            {
                sendThreadCreated = false;

                HTTPManager.Logger.Information("WebSocketResponse", "SendThread - Closed!");
            }
        }
 internal WebSocketRequest(IHttpRequest handshake, WebSocketFrame frame)
     : base(frame.Opcode, frame.Payload)
 {
     _handshake = handshake;
     _frame     = frame;
 }
예제 #19
0
 private string checkIfValidReceivedFrame(WebSocketFrame frame)
 {
     var masked = frame.IsMasked;
       return _client && masked
      ? "A frame from the server is masked."
      : !_client && !masked
        ? "A frame from a client isn't masked."
        : frame.IsCompressed && _compression == CompressionMethod.None
          ? "A compressed frame is without the available decompression method."
          : null;
 }
 protected override bool AppendFrameTail(WebSocketFrame msg) => true;
예제 #21
0
    private bool checkReceivedFrame (WebSocketFrame frame, out string message)
    {
      message = null;

      var masked = frame.IsMasked;
      if (_client && masked) {
        message = "A frame from the server is masked.";
        return false;
      }

      if (!_client && !masked) {
        message = "A frame from a client isn't masked.";
        return false;
      }

      if (_inContinuation && frame.IsData) {
        message = "A data frame has been received while receiving continuation frames.";
        return false;
      }

      if (frame.IsCompressed && _compression == CompressionMethod.None) {
        message = "A compressed frame has been received without any agreement for it.";
        return false;
      }

      if (frame.Rsv2 == Rsv.On) {
        message = "The RSV2 of a frame is non-zero without any negotiation for it.";
        return false;
      }

      if (frame.Rsv3 == Rsv.On) {
        message = "The RSV3 of a frame is non-zero without any negotiation for it.";
        return false;
      }

      return true;
    }
예제 #22
0
 public bool MustSkip(WebSocketFrame frame)
 {
     return(frame.Content.ReadableBytes < 100);
 }
예제 #23
0
 protected abstract int NewRsv(WebSocketFrame msg);
예제 #24
0
 public abstract Task ProcessFrame(WebSocketFrame f);
예제 #25
0
    private bool processDataFrame (WebSocketFrame frame)
    {
      enqueueToMessageEventQueue (
        frame.IsCompressed
        ? new MessageEventArgs (
            frame.Opcode, frame.PayloadData.ApplicationData.Decompress (_compression))
        : new MessageEventArgs (frame));

      return true;
    }
예제 #26
0
 public abstract Task ProcessReceivedFrame(WebSocketFrame f);
예제 #27
0
    private bool processReceivedFrame (WebSocketFrame frame)
    {
      var msg = checkIfValidReceivedFrame (frame);
      if (msg != null)
        return processUnsupportedFrame (frame, CloseStatusCode.ProtocolError, msg);

      frame.Unmask ();
      return frame.IsFragmented
             ? processFragmentedFrame (frame)
             : frame.IsData
               ? processDataFrame (frame)
               : frame.IsPing
                 ? processPingFrame (frame)
                 : frame.IsPong
                   ? processPongFrame (frame)
                   : frame.IsClose
                     ? processCloseFrame (frame)
                     : processUnsupportedFrame (frame, CloseStatusCode.UnsupportedData, null);
    }
예제 #28
0
        private bool processCloseFrame(WebSocketFrame frame)
        {
            enqueueToMessageEventQueue(new MessageEventArgs(frame));

              return false;
        }
예제 #29
0
    private bool processCloseFrame (WebSocketFrame frame)
    {
      var payload = frame.PayloadData;
      close (new CloseEventArgs (payload), !payload.IncludesReservedCloseStatusCode, false);

      return false;
    }
 public void OpCodeText(object sender, FrameEventArgs e)
 {
     WebSocketFrame frame = new WebSocketFrame(ASCIIEncoding.UTF8.GetBytes("Echo: " + e.frame.PayloadAsUTF8()));
     e.clientConnection.Send(frame.AsBytes());
 }
예제 #31
0
        protected void sendNullMessage()
        {
            WebSocketFrame frame = new WebSocketFrame(ASCIIEncoding.UTF8.GetBytes("{}"));

            clientConnection.Send(frame.AsBytes());
        }
예제 #32
0
 public async Task SendMessageAsync(WebSocketFrame frame)
 {
     await Channel.WriteAndFlushAsync(frame);
 }
예제 #33
0
 protected override void Decode(IChannelHandlerContext ctx, WebSocketFrame msg, List <object> output)
 {
     // unused
 }
예제 #34
0
        private bool processFragments(WebSocketFrame first)
        {
            using (var buff = new MemoryStream ()) {
            buff.WriteBytes (first.PayloadData.ApplicationData);
            if (!concatenateFragmentsInto (buff))
              return false;

            byte[] data;
            if (_compression != CompressionMethod.None) {
              data = buff.DecompressToArray (_compression);
            }
            else {
              buff.Close ();
              data = buff.ToArray ();
            }

            enqueueToMessageEventQueue (new MessageEventArgs (first.Opcode, data));
            return true;
              }
        }
 public MessageEventArgs(WebSocketUser user, WebSocketFrame message)
 {
     User    = user;
     Message = message;
 }
예제 #36
0
    private bool processReceivedFrame (WebSocketFrame frame)
    {
      string msg;
      if (!checkReceivedFrame (frame, out msg))
        throw new WebSocketException (CloseStatusCode.ProtocolError, msg);

      frame.Unmask ();
      return frame.IsFragment
             ? processFragmentFrame (frame)
             : frame.IsData
               ? processDataFrame (frame)
               : frame.IsPing
                 ? processPingFrame (frame)
                 : frame.IsPong
                   ? processPongFrame (frame)
                   : frame.IsClose
                     ? processCloseFrame (frame)
                     : processUnsupportedFrame (frame);
    }
예제 #37
0
 private bool processFragmentedFrame(WebSocketFrame frame)
 {
     // Must process first fragment.
       return frame.IsContinuation || processFragments (frame);
 }
예제 #38
0
        void HandleWebSocketFrame(IChannelHandlerContext ctx, WebSocketFrame frame)
        {
            // Check for closing frame
            if (frame is CloseWebSocketFrame)
            {
                this.handshaker.CloseAsync(ctx.Channel, (CloseWebSocketFrame)frame.Retain());
                return;
            }

            if (frame is PingWebSocketFrame)
            {
                ctx.WriteAsync(new PongWebSocketFrame((IByteBuffer)frame.Content.Retain()));
                return;
            }

            if (frame is TextWebSocketFrame)
            {
                // Echo the frame
                String requestmsg = ((TextWebSocketFrame)frame).Text();

                IMMessage iMMessage = new IMMessage();
                iMMessage = JsonHandler.DeserializeJsonToObject <IMMessage>(requestmsg);

                //0为登陆,保存管道
                if (iMMessage.msgType == 0)
                {
                    #region 登陆
                    //app
                    if (iMMessage.pipetype == "0")
                    {
                        try
                        {
                            IChannel jieshourenctx = AppUsers[iMMessage.uid];
                            AppUsers.Add(iMMessage.uid, ctx.Channel);
                        }
                        catch
                        {
                            AppUsers.Remove(iMMessage.uid);
                            AppUsers.Add(iMMessage.uid, ctx.Channel);
                        }
                    }
                    //web
                    if (iMMessage.pipetype == "1")
                    {
                        try
                        {
                            IChannel jieshourenctx = WebUsers[iMMessage.uid];
                            WebUsers.Add(iMMessage.uid, ctx.Channel);
                        }
                        catch
                        {
                            WebUsers.Remove(iMMessage.uid);
                            WebUsers.Add(iMMessage.uid, ctx.Channel);
                        }
                    }

                    #endregion

                    List <IMMessage> list = new List <IMMessage>();

                    #region 取出所有消息并且反序列化
                    //取出所有消息并且反序列化
                    var b = redisHelper.ListRange(iMMessage.uid).ToList();
                    foreach (var item in b)
                    {
                        IMMessage sendiMMessage = new IMMessage();
                        sendiMMessage = JsonHandler.DeserializeJsonToObject <IMMessage>(item);
                        list.Add(sendiMMessage);
                    }
                    //删除此键
                    if (b.Count() != 0)
                    {
                        //删除
                        redisHelper.KeyDelete(iMMessage.uid);
                    }
                    #endregion
                    //遍历发送
                    foreach (var senditem in list)
                    {
                        if (senditem.msgStatus == "0" && senditem.receiveId == iMMessage.uid)
                        {
                            ctx.WriteAsync(new TextWebSocketFrame("来自历史纪录:" + senditem.toString()));
                            var a = redisHelper.ListRightPush <IMMessage>("send", senditem);
                        }
                    }
                    ctx.Flush();
                }
                //发信
                else
                {
                    try
                    {
                        IChannel receiveNameApp = AppUsers[iMMessage.receiveId];
                        IChannel receiveNameWeb = WebUsers[iMMessage.receiveId];
                        //没有登陆地
                        if (receiveNameApp == null && receiveNameWeb == null)
                        {
                            //写入缓存
                            iMMessage.msgStatus = "0";
                            redisHelper.ListRightPush <IMMessage>(iMMessage.receiveId, iMMessage);
                            ctx.WriteAsync(new TextWebSocketFrame("发送成功"));
                        }
                        else
                        {
                            if (receiveNameApp != null)
                            {
                                receiveNameApp.WriteAsync(new TextWebSocketFrame("接收到了:" + requestmsg));
                                receiveNameApp.Flush();
                            }
                            if (receiveNameWeb != null)
                            {
                                receiveNameWeb.WriteAsync(new TextWebSocketFrame("接收到了:" + requestmsg));
                                receiveNameWeb.Flush();
                            }
                        }
                        //ctx.WriteAsync(frame.Retain());
                        ctx.WriteAsync(new TextWebSocketFrame("发送成功"));
                        var a = redisHelper.ListRightPush <IMMessage>("send", iMMessage);
                    }
                    catch
                    {
                    }
                }
                return;
            }

            if (frame is BinaryWebSocketFrame)
            {
                // Echo the frame
                ctx.WriteAsync(frame.Retain());
            }
        }
예제 #39
0
        private bool processPingFrame(WebSocketFrame frame)
        {
            if (send (new WebSocketFrame (Opcode.Pong, frame.PayloadData, _client).ToByteArray ()))
            _logger.Trace ("Returned a Pong.");

              return true;
        }
예제 #40
0
 protected override int NewRsv(WebSocketFrame msg) =>
 (msg.Rsv & WebSocketRsv.Rsv1) > 0 ? msg.Rsv ^ WebSocketRsv.Rsv1 : msg.Rsv;
예제 #41
0
    private bool processUnsupportedFrame (WebSocketFrame frame)
    {
      _logger.Fatal ("An unsupported frame:" + frame.PrintToString (false));
      fatal ("There is no way to handle it.", CloseStatusCode.PolicyViolation);

      return false;
    }
예제 #42
0
        private bool acceptPingFrame(WebSocketFrame frame)
        {
            var mask = _client ? Mask.Mask : Mask.Unmask;
              if (send (WebSocketFrame.CreatePongFrame (mask, frame.PayloadData)))
            _logger.Trace ("Returned a Pong.");

              return true;
        }
예제 #43
0
 protected override int Rsv(WebSocketFrame msg) =>
 msg is TextWebSocketFrame || msg is BinaryWebSocketFrame
         ? msg.Rsv | WebSocketRsv.Rsv1
         : msg.Rsv;
예제 #44
0
        private bool send(WebSocketFrame frame)
        {
            lock (_forConn) {
            if (_readyState != WebSocketState.Open) {
              _logger.Warn ("Sending has been interrupted.");
              return false;
            }

            return _stream.Write (frame.ToByteArray ());
              }
        }
예제 #45
0
 protected abstract bool AppendFrameTail(WebSocketFrame msg);
예제 #46
0
        private const int MAX_FRAME_SIZE = 1024 * 64;           //Max size of frame - 512kb. Separate data by frames if more

        public WebSocketFrame ReadMessage(NetworkStream stream) //TODO check if frame is too big and separate
        {
            var a = WebSocketFrame.ReadFrame(stream, true);

            return(a);
        }
예제 #47
0
        protected internal override void Decode(IChannelHandlerContext ctx, WebSocketFrame msg, List <object> output)
        {
            if (this.decoder == null)
            {
                if (!(msg is TextWebSocketFrame) && !(msg is BinaryWebSocketFrame))
                {
                    throw new CodecException($"unexpected initial frame type: {msg.GetType().Name}");
                }

                this.decoder = new EmbeddedChannel(ZlibCodecFactory.NewZlibDecoder(ZlibWrapper.None));
            }

            bool readable = msg.Content.IsReadable();

            this.decoder.WriteInbound(msg.Content.Retain());
            if (this.AppendFrameTail(msg))
            {
                this.decoder.WriteInbound(Unpooled.WrappedBuffer(FrameTail));
            }

            CompositeByteBuffer compositeUncompressedContent = ctx.Allocator.CompositeDirectBuffer();

            for (;;)
            {
                var partUncompressedContent = this.decoder.ReadInbound <IByteBuffer>();
                if (partUncompressedContent == null)
                {
                    break;
                }

                if (!partUncompressedContent.IsReadable())
                {
                    partUncompressedContent.Release();
                    continue;
                }

                compositeUncompressedContent.AddComponent(true, partUncompressedContent);
            }

            // Correctly handle empty frames
            // See https://github.com/netty/netty/issues/4348
            if (readable && compositeUncompressedContent.NumComponents <= 0)
            {
                compositeUncompressedContent.Release();
                throw new CodecException("cannot read uncompressed buffer");
            }

            if (msg.IsFinalFragment && this.noContext)
            {
                this.Cleanup();
            }

            WebSocketFrame outMsg;

            if (msg is TextWebSocketFrame)
            {
                outMsg = new TextWebSocketFrame(msg.IsFinalFragment, this.NewRsv(msg), compositeUncompressedContent);
            }
            else if (msg is BinaryWebSocketFrame)
            {
                outMsg = new BinaryWebSocketFrame(msg.IsFinalFragment, this.NewRsv(msg), compositeUncompressedContent);
            }
            else if (msg is ContinuationWebSocketFrame)
            {
                outMsg = new ContinuationWebSocketFrame(msg.IsFinalFragment, this.NewRsv(msg), compositeUncompressedContent);
            }
            else
            {
                throw new CodecException($"unexpected frame type: {msg.GetType().Name}");
            }

            output.Add(outMsg);
        }
예제 #48
0
 public WebSocketReadCursor(WebSocketFrame frame, int numBytesRead, int numBytesLeftToRead)
 {
     WebSocketFrame     = frame;
     NumBytesRead       = numBytesRead;
     NumBytesLeftToRead = numBytesLeftToRead;
 }
예제 #49
0
 /// <inheritdoc />
 protected override bool RemoveFrameTail(WebSocketFrame msg) => msg.IsFinalFragment;
예제 #50
0
        private bool processCloseFrame(WebSocketFrame frame)
        {
            var payload = frame.PayloadData;
            close(payload, !payload.ContainsReservedCloseStatusCode, false);

            return false;
        }
예제 #51
0
    private bool processFragmentedFrame (WebSocketFrame frame)
    {
      if (!_inContinuation) {
        // Must process first fragment.
        if (frame.IsContinuation)
          return true;

        _fopcode = frame.Opcode;
        _fragmentsBuffer = new MemoryStream ();
        _inContinuation = true;
      }

      _fragmentsBuffer.WriteBytes (frame.PayloadData.ApplicationData);
      if (frame.IsFinal) {
        using (_fragmentsBuffer) {
          var data = _compression != CompressionMethod.None
                     ? _fragmentsBuffer.DecompressToArray (_compression)
                     : _fragmentsBuffer.ToArray ();

          enqueueToMessageEventQueue (new MessageEventArgs (_fopcode, data));
        }

        _fragmentsBuffer = null;
        _inContinuation = false;
      }

      return true;
    }
예제 #52
0
 private bool processFragmentedFrame(WebSocketFrame frame)
 {
     return frame.IsContinuation // Not first fragment
            ? true
            : processFragments(frame);
 }
예제 #53
0
    private bool processPongFrame (WebSocketFrame frame)
    {
      _receivePong.Set ();
      _logger.Trace ("Received a Pong.");

      return true;
    }
예제 #54
0
        private bool processPingFrame(WebSocketFrame frame)
        {
            var mask = Mask.Unmask;

            return true;
        }
예제 #55
0
    private bool processUnsupportedFrame (WebSocketFrame frame, CloseStatusCode code, string reason)
    {
      _logger.Debug ("An unsupported frame:" + frame.PrintToString (false));
      processException (new WebSocketException (code, reason), null);

      return false;
    }
예제 #56
0
        private bool processPongFrame(WebSocketFrame frame)
        {
            _receivePong.Set();

            return true;
        }
예제 #57
0
 private string checkIfValidReceivedFrame (WebSocketFrame frame)
 {
   var masked = frame.IsMasked;
   return _client && masked
          ? "A frame from the server is masked."
          : !_client && !masked
            ? "A frame from a client isn't masked."
            : _inContinuation && frame.IsData
              ? "A data frame has been received while receiving the fragmented data."
              : frame.IsCompressed && _compression == CompressionMethod.None
                ? "A compressed frame is without an available decompression method."
                : null;
 }
예제 #58
0
        private bool processUnsupportedFrame(WebSocketFrame frame, CloseStatusCode code, string reason)
        {
            processException(new WebSocketException(code, reason), null);

            return false;
        }
 public bool MustSkip(WebSocketFrame frame) => false;
예제 #60
0
 private bool processWebSocketFrame(WebSocketFrame frame)
 {
     return frame.IsCompressed && _compression == CompressionMethod.None
            ? processUnsupportedFrame(
                frame,
                CloseStatusCode.IncorrectData,
                "A compressed data has been received without available decompression method.")
            : frame.IsFragmented
              ? processFragmentedFrame(frame)
              : frame.IsData
                ? processDataFrame(frame)
                : frame.IsPing
                  ? processPingFrame(frame)
                  : frame.IsPong
                    ? processPongFrame(frame)
                    : frame.IsClose
                      ? processCloseFrame(frame)
                      : processUnsupportedFrame(frame, CloseStatusCode.PolicyViolation, null);
 }