public void FinishReceiveData(bool success) { _webSocketReceiving = 0; if (!success) { _webSocketReceiveState = WebSocketReceiveState.Close; _webSocketReceiveTcs?.TrySetCanceled(); _webSocketTcsReceivedClose?.TrySetResult(null); return; } ParseWebSocketReceivedData(); }
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(); }
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(); }
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(); } } }
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(); } } }
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(); }
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(); }
public void FinishReceiveData(bool success) { _webSocketReceiving = 0; if (!success) { _webSocketReceiveState = WebSocketReceiveState.Close; _webSocketReceiveTcs?.SetCanceled(); _webSocketTcsReceivedClose?.TrySetResult(null); return; } ParseWebSocketReceivedData(); }