Esempio n. 1
0
 public void FinishReceiveData(bool success)
 {
     _webSocketReceiving = 0;
     if (!success)
     {
         _webSocketReceiveState = WebSocketReceiveState.Close;
         _webSocketReceiveTcs?.TrySetCanceled();
         _webSocketTcsReceivedClose?.TrySetResult(null);
         return;
     }
     ParseWebSocketReceivedData();
 }
Esempio n. 2
0
 public void FinishReceiveData(bool success)
 {
     _webSocketReceiving = 0;
     if (!success)
     {
         _webSocketReceiveState = WebSocketReceiveState.Close;
         var tcs = _webSocketReceiveTcs;
         if (tcs != null)
         {
             tcs.SetCanceled();
         }
         var tcs2 = _webSocketTcsReceivedClose;
         if (tcs2 != null)
         {
             tcs2.TrySetResult(null);
         }
         return;
     }
     ParseWebSocketReceivedData();
 }
Esempio n. 3
0
 void WebSocketAcceptMethod(IDictionary <string, object> dictionary, Func <IDictionary <string, object>, Task> func)
 {
     TraceSources.CoreDebug.TraceInformation("ID{0,-5} WebSocketAcceptMethod", _handlerId);
     if (dictionary != null)
     {
         object value;
         if (dictionary.TryGetValue("websocket.SubProtocol", out value) && value is string)
         {
             RespHeaders.Remove("Sec-WebSocket-Protocol");
             RespHeaders.Add("Sec-WebSocket-Protocol", new[] { (string)value });
         }
     }
     _webSocketFunc = func;
     _inWebSocket   = true;
     StartWaitingTillEndOfAppFunc();
     _webSocketReceiveState             = WebSocketReceiveState.Header;
     _webSocketNextSendIsStartOfMessage = true;
     _webSocketSendBufferUsedSize       = 0;
     Callback.UpgradeToWebSocket();
 }
Esempio n. 4
0
        void ParseWebSocketReceivedData()
        {
            if (Callback.ReceiveDataLength == 0)
            {
                StartReciveDataIfNotAlreadyReceiving();
                return;
            }
            if (_webSocketReceiveTcs == null)
            {
                return;
            }
            if (_webSocketReceiveState == WebSocketReceiveState.Header)
            {
                var len = ParseHeader(Callback.Buffer, Callback.ReceiveDataOffset, Callback.ReceiveDataLength);
                if (len > 0)
                {
                    Callback.ConsumeReceiveData(len);
                    _webSocketReceiveState = WebSocketReceiveState.Body;
                    _maskIndex             = 0;
                }
                else if (len < 0)
                {
                    _webSocketReceiveState = WebSocketReceiveState.Error;
                }
            }
            if (_webSocketReceiveState == WebSocketReceiveState.Body)
            {
                if (_webSocketFrameOpcode == 0x8)
                {
                    if (Callback.ReceiveDataLength < (int)_webSocketFrameLen)
                    {
                        StartReciveDataIfNotAlreadyReceiving();
                        return;
                    }
                    var buf = Callback.Buffer;
                    var o   = Callback.ReceiveDataOffset;
                    Unmask(buf, o, buf, o, (int)_webSocketFrameLen);
                    if (_webSocketFrameLen >= 2)
                    {
                        _webSocketEnv.Add("websocket.ClientCloseStatus", buf[o] * 256 + buf[o + 1]);
                        _webSocketEnv.Add("websocket.ClientCloseDescription",
                                          new String(Encoding.UTF8.GetChars(buf, o + 2, (int)_webSocketFrameLen - 2)));
                    }
                    else
                    {
                        _webSocketEnv.Add("websocket.ClientCloseStatus", 0);
                        _webSocketEnv.Add("websocket.ClientCloseDescription", "");
                    }
                    TraceSources.CoreDebug.TraceInformation(
                        "ID{0,-5} Received WebSocketClose Status:{1} Desc:{2}",
                        _handlerId,
                        _webSocketEnv["websocket.ClientCloseStatus"],
                        _webSocketEnv["websocket.ClientCloseDescription"]);

                    Callback.ConsumeReceiveData((int)_webSocketFrameLen);
                    _webSocketReceiveState = WebSocketReceiveState.Closing;
                    var tcs = _webSocketReceiveTcs;
                    if (tcs != null)
                    {
                        _webSocketReceiveTcs = null;
                        tcs.SetResult(new WebSocketReceiveTuple(0x8, true, 0));
                    }
                    var tcs2 = _webSocketTcsReceivedClose;
                    if (tcs2 != null)
                    {
                        tcs2.TrySetResult(null);
                    }
                    return;
                }
                var len = (int)Math.Min(_webSocketFrameLen, (ulong)_webSocketReceiveSegment.Count);
                if (Callback.ReceiveDataLength < len)
                {
                    len = Callback.ReceiveDataLength;
                }
                Unmask(Callback.Buffer, Callback.ReceiveDataOffset, _webSocketReceiveSegment.Array,
                       _webSocketReceiveSegment.Offset, len);
                Callback.ConsumeReceiveData(len);
                _webSocketFrameLen      -= (ulong)len;
                _webSocketReceiveCount  += len;
                _webSocketReceiveSegment = new ArraySegment <byte>(_webSocketReceiveSegment.Array, _webSocketReceiveSegment.Offset + len, _webSocketReceiveSegment.Count - len);
                if (_webSocketFrameLen == 0)
                {
                    var tcs = _webSocketReceiveTcs;
                    if (tcs != null)
                    {
                        _webSocketReceiveTcs = null;
                        TraceSources.CoreDebug.TraceInformation("ID{0,-5} Received WebSocketFrame Opcode:{1} Last:{2} Length:{3}", _handlerId, _webSocketFrameOpcode, _webSocketFrameLast, _webSocketReceiveCount);
                        tcs.SetResult(new WebSocketReceiveTuple(_webSocketFrameOpcode, _webSocketFrameLast, _webSocketReceiveCount));
                    }
                    _webSocketReceiveState = WebSocketReceiveState.Header;
                }
                else if (_webSocketReceiveSegment.Count == 0)
                {
                    var tcs = _webSocketReceiveTcs;
                    if (tcs != null)
                    {
                        _webSocketReceiveTcs = null;
                        TraceSources.CoreDebug.TraceInformation("ID{0,-5} Received WebSocketFrame Opcode:{1} Last:{2} Length:{3}", _handlerId, _webSocketFrameOpcode, false, _webSocketReceiveCount);
                        tcs.SetResult(new WebSocketReceiveTuple(_webSocketFrameOpcode, false, _webSocketReceiveCount));
                    }
                }
                if (Callback.ReceiveDataLength == 0)
                {
                    StartReciveDataIfNotAlreadyReceiving();
                }
            }
            else if (_webSocketReceiveState == WebSocketReceiveState.Error)
            {
                var tcs = _webSocketReceiveTcs;
                if (tcs != null)
                {
                    _webSocketReceiveTcs = null;
                    tcs.SetCanceled();
                }
            }
        }
Esempio n. 5
0
        void ParseWebSocketReceivedData()
        {
            if (Callback.ReceiveDataLength == 0)
            {
                StartReciveDataIfNotAlreadyReceiving();
                return;
            }
            if (_webSocketReceiveTcs == null) return;
            if (_webSocketReceiveState == WebSocketReceiveState.Header)
            {
                var len = ParseHeader(Callback.Buffer, Callback.ReceiveDataOffset, Callback.ReceiveDataLength);
                if (len > 0)
                {
                    Callback.ConsumeReceiveData(len);
                    _webSocketReceiveState = WebSocketReceiveState.Body;
                    _maskIndex = 0;
                }
                else if (len < 0)
                {
                    _webSocketReceiveState = WebSocketReceiveState.Error;
                }
            }
            if (_webSocketReceiveState == WebSocketReceiveState.Body)
            {
                if (_webSocketFrameOpcode == 0x8)
                {
                    if (Callback.ReceiveDataLength < (int)_webSocketFrameLen)
                    {
                        StartReciveDataIfNotAlreadyReceiving();
                        return;
                    }
                    var buf = Callback.Buffer;
                    var o = Callback.ReceiveDataOffset;
                    Unmask(buf, o, buf, o, (int)_webSocketFrameLen);
                    if (_webSocketFrameLen >= 2)
                    {
                        _webSocketEnv.Add("websocket.ClientCloseStatus", buf[o] * 256 + buf[o + 1]);
                        _webSocketEnv.Add("websocket.ClientCloseDescription",
                                          new String(Encoding.UTF8.GetChars(buf, o + 2, (int)_webSocketFrameLen - 2)));
                    }
                    else
                    {
                        _webSocketEnv.Add("websocket.ClientCloseStatus", 0);
                        _webSocketEnv.Add("websocket.ClientCloseDescription", "");
                    }
                    TraceSources.CoreDebug.TraceInformation(
                        "ID{0,-5} Received WebSocketClose Status:{1} Desc:{2}",
                        _handlerId,
                        _webSocketEnv["websocket.ClientCloseStatus"],
                        _webSocketEnv["websocket.ClientCloseDescription"]);

                    Callback.ConsumeReceiveData((int)_webSocketFrameLen);
                    _webSocketReceiveState = WebSocketReceiveState.Closing;
                    var tcs = _webSocketReceiveTcs;
                    if (tcs != null)
                    {
                        _webSocketReceiveTcs = null;
                        tcs.SetResult(new WebSocketReceiveTuple(0x8, true, 0));
                    }
                    var tcs2 = _webSocketTcsReceivedClose;
                    if (tcs2 != null)
                    {
                        tcs2.TrySetResult(null);
                    }
                    return;
                }
                var len = (int)Math.Min(_webSocketFrameLen, (ulong)_webSocketReceiveSegment.Count);
                if (Callback.ReceiveDataLength < len) len = Callback.ReceiveDataLength;
                Unmask(Callback.Buffer, Callback.ReceiveDataOffset, _webSocketReceiveSegment.Array,
                       _webSocketReceiveSegment.Offset, len);
                Callback.ConsumeReceiveData(len);
                _webSocketFrameLen -= (ulong)len;
                _webSocketReceiveCount += len;
                _webSocketReceiveSegment = new ArraySegment<byte>(_webSocketReceiveSegment.Array, _webSocketReceiveSegment.Offset + len, _webSocketReceiveSegment.Count - len);
                if (_webSocketFrameLen == 0)
                {
                    var tcs = _webSocketReceiveTcs;
                    if (tcs != null)
                    {
                        _webSocketReceiveTcs = null;
                        TraceSources.CoreDebug.TraceInformation("ID{0,-5} Received WebSocketFrame Opcode:{1} Last:{2} Length:{3}", _handlerId, _webSocketFrameOpcode, _webSocketFrameLast, _webSocketReceiveCount);
                        tcs.SetResult(new WebSocketReceiveTuple(_webSocketFrameOpcode, _webSocketFrameLast, _webSocketReceiveCount));
                    }
                    _webSocketReceiveState = WebSocketReceiveState.Header;
                }
                else if (_webSocketReceiveSegment.Count == 0)
                {
                    var tcs = _webSocketReceiveTcs;
                    if (tcs != null)
                    {
                        _webSocketReceiveTcs = null;
                        TraceSources.CoreDebug.TraceInformation("ID{0,-5} Received WebSocketFrame Opcode:{1} Last:{2} Length:{3}", _handlerId, _webSocketFrameOpcode, false, _webSocketReceiveCount);
                        tcs.SetResult(new WebSocketReceiveTuple(_webSocketFrameOpcode, false, _webSocketReceiveCount));
                    }
                }
                if (Callback.ReceiveDataLength == 0)
                {
                    StartReciveDataIfNotAlreadyReceiving();
                }
            }
            else if (_webSocketReceiveState == WebSocketReceiveState.Error)
            {
                var tcs = _webSocketReceiveTcs;
                if (tcs != null)
                {
                    _webSocketReceiveTcs = null;
                    tcs.SetCanceled();
                }
            }
        }
Esempio n. 6
0
 public void FinishReceiveData(bool success)
 {
     _webSocketReceiving = 0;
     if (!success)
     {
         _webSocketReceiveState = WebSocketReceiveState.Close;
         var tcs = _webSocketReceiveTcs;
         if (tcs != null) tcs.SetCanceled();
         var tcs2 = _webSocketTcsReceivedClose;
         if (tcs2 != null) tcs2.TrySetResult(null);
         return;
     }
     ParseWebSocketReceivedData();
 }
Esempio n. 7
0
 void WebSocketAcceptMethod(IDictionary<string, object> dictionary, Func<IDictionary<string, object>, Task> func)
 {
     TraceSources.CoreDebug.TraceInformation("ID{0,-5} WebSocketAcceptMethod", _handlerId);
     if (dictionary != null)
     {
         object value;
         if (dictionary.TryGetValue("websocket.SubProtocol", out value) && value is string)
         {
             RespHeaders.Remove("Sec-WebSocket-Protocol");
             RespHeaders.Add("Sec-WebSocket-Protocol", new[] { (string)value });
         }
     }
     _webSocketFunc = func;
     _inWebSocket = true;
     _webSocketReceiveState = WebSocketReceiveState.Header;
     _webSocketNextSendIsStartOfMessage = true;
     _webSocketSendBufferUsedSize = 0;
     Callback.UpgradeToWebSocket();
 }
Esempio n. 8
0
 public void FinishReceiveData(bool success)
 {
     _webSocketReceiving = 0;
     if (!success)
     {
         _webSocketReceiveState = WebSocketReceiveState.Close;
         _webSocketReceiveTcs?.SetCanceled();
         _webSocketTcsReceivedClose?.TrySetResult(null);
         return;
     }
     ParseWebSocketReceivedData();
 }