/// <summary> /// Reads next message from stream /// </summary> protected override async Task Read() { WebSocketReader reader = new WebSocketReader(); WebSocketMessage message = await reader.Read(Stream); if (message == null) { Disconnect(); return; } KeepAlive(); switch (message.OpCode) { case SocketOpCode.Binary: case SocketOpCode.UTF8: SetOnMessageReceived(message); break; case SocketOpCode.Terminate: Disconnect(); break; case SocketOpCode.Pong: break; case SocketOpCode.Ping: Pong(); break; } }
public void FragmentationWithCompressTest() { var reader = WebSocketReader.Create(true, ProxyConfig.MaxByteArrayLength); var tcs1 = new TaskCompletionSource <WebSocketMessage>(); reader.MessageReceived += message => tcs1.TrySetResult(message); var source = "hogefugapiyo"; byte[] payloadData1; using (var stream = new MemoryStream()) { using (var deflate = new DeflateStream(stream, CompressionMode.Compress, true)) { var sourceBytes = Encoding.UTF8.GetBytes(source); deflate.Write(sourceBytes, 0, sourceBytes.Length); } payloadData1 = stream.ToArray(); } var frameData1 = new List <byte> { 0b01000010, 0b00000100 }; frameData1.AddRange(payloadData1.Take(4)); reader.HandleReceive(frameData1.ToArray(), frameData1.Count); var frameData2 = new List <byte> { 0b10000000, 0b00001010 }; frameData2.AddRange(payloadData1.Skip(4).ToArray()); reader.HandleReceive(frameData2.ToArray(), frameData2.Count); var message1 = tcs1.GetResult(); Encoding.UTF8.GetString(message1.PayloadData).Is(source); var message2data = new List <byte> { 0b10000010, 0b00001100 }; message2data.AddRange(Encoding.UTF8.GetBytes(source)); var tcs2 = new TaskCompletionSource <WebSocketMessage>(); reader.MessageReceived += message => tcs2.TrySetResult(message); reader.HandleReceive(message2data.ToArray(), message2data.Count); var message2 = tcs2.GetResult(); Encoding.UTF8.GetString(message2.PayloadData).Is(source); }
public void TooLongMessageTest() { var reader1 = WebSocketReader.Create(true, 7); var bigFrame1 = new byte[] { 0b10000010, // FIN, Binary 0b00001000, // noMask, 8bytes }
private void ListenClient(WebSocketClient client) { using (Stream ns = GetStream(client)) { client.Stream = ns; WebSocketReader reader = new WebSocketReader(); string header = HttpUtils.ReadHeader(ns); Regex getRegex = new Regex(@"^GET(.*)HTTP\/1\.1", RegexOptions.IgnoreCase); Match getRegexMatch = getRegex.Match(header); if (getRegexMatch.Success) { DoHandshake(ns, header); client.Writer = new WebSocketWriter(ns); Clients.Add(client); OnConnect?.Invoke(client); } else { RemoveClient(client); } while (Running && Clients.IndexOf(client) != -1) { WebSocketFrame frame = reader.Read(ns, client); if (frame == null || frame.Opcode == WebSocketOpcode.ConnectionCloseFrame) { RemoveClient(client); break; } if (frame.Opcode == WebSocketOpcode.PongFrame) { client.Pong = true; } else if (frame.Opcode == WebSocketOpcode.TextFrame) { try { string json = Encoding.UTF8.GetString(frame.Data); var message = JsonConvert.DeserializeObject <WebSocketMessage>(json); On[message.ID]?.Invoke(client, new MessageEventArgs(message)); } catch (Exception e) { } } } } }
private void HandleClient(object td) { NetComputer comp=(NetComputer)td; TcpClient peer=comp.Peer; // If the scripting subsystem didn't hook the message // it will be handled by the default message handler. // Get a stream object for reading and writing NetworkStream stream=peer.GetStream(); WebSocketReader reader=new WebSocketReader(stream); bool websocketClosed=false; while(websocketClosed==false) { MessageIn msg=reader.ReadMessage(out websocketClosed); if(!websocketClosed) { Logger.Write(LogLevel.Debug, "Received message {0} from {1}", (Protocol)msg.getId(), comp); processMessage(comp, msg); } } //Disconnect IPEndPoint remoteEndPoint=(IPEndPoint)(peer.Client.RemoteEndPoint); Logger.Write(LogLevel.Information, "Client {0}:{1} disconnected", remoteEndPoint.Address, remoteEndPoint.Port); // Reset the peer's client information. computerDisconnected(comp); clients.Remove(comp); }
public static void HandleBase64(this WebSocketReader reader, string base64) { var bytes = Convert.FromBase64String(base64); reader.HandleReceive(bytes, bytes.Length); }
public static void HandleReceive(this WebSocketReader reader, string value) { var bytes = value.HexToBytes(); reader.HandleReceive(bytes, bytes.Length); }
public void CompressWithMaskTest() { var reader = WebSocketReader.Create(true, ProxyConfig.MaxByteArrayLength); var tcs1 = new TaskCompletionSource <WebSocketMessage>(); reader.MessageReceived += message => tcs1.TrySetResult(message); var source = "hogefugapiyo"; byte[] payloadData1; using (var stream = new MemoryStream()) { using (var deflate = new DeflateStream(stream, CompressionMode.Compress, true)) { var sourceBytes = Encoding.UTF8.GetBytes(source); deflate.Write(sourceBytes, 0, sourceBytes.Length); } payloadData1 = stream.ToArray(); } var maskKey = new byte[] { 0b11001100, 0b11001100, 0b11111111, 0b00000000 }; var frameData1 = new List <byte> { 0b11000010, 0b10001110, maskKey[0], maskKey[1], maskKey[2], maskKey[3] }; for (int i = 0; i < payloadData1.Length; i++) { payloadData1[i] ^= maskKey[i % 4]; } frameData1.AddRange(payloadData1); reader.HandleReceive(frameData1.ToArray(), frameData1.Count); var message1 = tcs1.GetResult(); Encoding.UTF8.GetString(message1.PayloadData).Is(source); var message2data = new List <byte> { 0b10000010, 0b10001100, maskKey[0], maskKey[1], maskKey[2], maskKey[3] }; var payloadData2 = Encoding.UTF8.GetBytes(source); for (int i = 0; i < payloadData2.Length; i++) { payloadData2[i] ^= maskKey[i % 4]; } message2data.AddRange(payloadData2); var tcs2 = new TaskCompletionSource <WebSocketMessage>(); reader.MessageReceived += message => tcs2.TrySetResult(message); reader.HandleReceive(message2data.ToArray(), message2data.Count); var message2 = tcs2.GetResult(); Encoding.UTF8.GetString(message2.PayloadData).Is(source); }