public void XdrReaderPerformanceTest(int rounds, int iterations) { var testArray = new byte[32]; Array.Fill(testArray, (byte)100); var stream = new XdrBufferWriter(); for (var i = 0; i < iterations; i++) { stream.WriteInt32(435); stream.WriteString("oiewurouqwe"); stream.WriteVariable(testArray); } var serialized = stream.ToArray(); PerfCounter.MeasureTime(() => { for (var r = 0; r < rounds; r++) { var reader = new XdrBufferReader(serialized); for (var i = 0; i < iterations; i++) { reader.ReadInt32(); reader.ReadString(); reader.ReadVariableAsSpan(); } } }, () => $"({rounds} rounds, {iterations} iterations)"); }
public async Task Listen() { try { while (webSocket.State != WebSocketState.Closed && webSocket.State != WebSocketState.Aborted && !cancellationToken.IsCancellationRequested) { var result = await webSocket.GetWebsocketBuffer(MaxMessageSize, cancellationToken); using (result.messageBuffer) if (!cancellationToken.IsCancellationRequested) { //the client send close message if (result.messageType == WebSocketMessageType.Close) { if (webSocket.State != WebSocketState.CloseReceived) { continue; } await sendMessageSemaphore.WaitAsync(); try { var timeoutTokenSource = new CancellationTokenSource(1000); await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "Close", CancellationToken.None); } finally { sendMessageSemaphore.Release(); cancellationTokenSource.Cancel(); } } else { MessageEnvelope envelope = null; try { var reader = new XdrBufferReader(result.messageBuffer.Buffer, result.messageBuffer.Length); envelope = XdrConverter.Deserialize <MessageEnvelope>(reader); if (!await HandleMessage(envelope)) { throw new UnexpectedMessageException($"No handler registered for message type {envelope.Message.MessageType}."); } } catch (BaseClientException exc) { Global.ExtensionsManager.HandleMessageFailed(this, envelope, exc); var statusCode = exc.GetStatusCode(); //prevent recursive error sending if (!(envelope == null || envelope.Message is ResultMessage)) { _ = SendMessage(envelope.CreateResult(statusCode)); } if (statusCode == ResultStatusCodes.InternalError || !Global.IsAlpha) { logger.Error(exc); } } } } } } catch (OperationCanceledException) { } catch (Exception e) { Global.ExtensionsManager.HandleMessageFailed(this, null, e); var closureStatus = WebSocketCloseStatus.InternalServerError; var desc = default(string); if (e is WebSocketException webSocketException && webSocketException.WebSocketErrorCode == WebSocketError.ConnectionClosedPrematurely) //connection already closed by the other side { return; }
public void XdrCompatibilityTest() { var testArray = new byte[32]; Array.Fill(testArray, (byte)100); //forward compatibility var legacyXdrSerializationStream = new XdrDataOutputStream(); legacyXdrSerializationStream.WriteInt(435); legacyXdrSerializationStream.WriteUInt(435); legacyXdrSerializationStream.WriteLong(43546345634657565L); legacyXdrSerializationStream.WriteDoubleArray(new double[] { 435.15, 64656.11 }); legacyXdrSerializationStream.WriteString("oiewurouqwe"); legacyXdrSerializationStream.WriteVarOpaque(32, testArray); var bufferReader = new XdrBufferReader(legacyXdrSerializationStream.ToArray()); Assert.AreEqual(435, bufferReader.ReadInt32()); Assert.AreEqual((uint)435, bufferReader.ReadUInt32()); Assert.AreEqual(43546345634657565L, bufferReader.ReadInt64()); { var length = bufferReader.ReadInt32(); var value = new double[length]; for (var i = 0; i < length; i++) { value[i] = bufferReader.ReadDouble(); } Assert.AreEqual(new double[] { 435.15, 64656.11 }, value); } Assert.AreEqual("oiewurouqwe", bufferReader.ReadString()); Assert.AreEqual(testArray, bufferReader.ReadVariable()); using var streamReader = new XdrStreamReader(new MemoryStream(legacyXdrSerializationStream.ToArray())); Assert.AreEqual(435, streamReader.ReadInt32()); Assert.AreEqual((uint)435, streamReader.ReadUInt32()); Assert.AreEqual(43546345634657565L, streamReader.ReadInt64()); { var length = streamReader.ReadInt32(); var value = new double[length]; for (var i = 0; i < length; i++) { value[i] = streamReader.ReadDouble(); } Assert.AreEqual(new double[] { 435.15, 64656.11 }, value); } Assert.AreEqual("oiewurouqwe", streamReader.ReadString()); Assert.AreEqual(testArray, streamReader.ReadVariable()); //backward compatibility var bufferWriter = new XdrBufferWriter(); bufferWriter.WriteInt32(435); bufferWriter.WriteUInt32((uint)435); { var arr = new double[] { 435.15, 64656.11 }; bufferWriter.WriteInt32(arr.Length); foreach (var d in arr) { bufferWriter.WriteDouble(d); } } bufferWriter.WriteString("oiewurouqwe"); bufferWriter.WriteVariable(testArray); var legacyXdrReader = new XdrDataInputStream(bufferWriter.ToArray()); Assert.AreEqual(435, legacyXdrReader.ReadInt()); Assert.AreEqual((uint)435, legacyXdrReader.ReadUInt()); Assert.AreEqual(new double[] { 435.15, 64656.11 }, legacyXdrReader.ReadDoubleArray()); Assert.AreEqual("oiewurouqwe", legacyXdrReader.ReadString()); Assert.AreEqual(testArray, legacyXdrReader.ReadVarOpaque(32)); using var memoryStream = new MemoryStream(); var streamWriter = new XdrStreamWriter(memoryStream); streamWriter.WriteInt32(435); streamWriter.WriteUInt32((uint)435); { var arr = new double[] { 435.15, 64656.11 }; streamWriter.WriteInt32(arr.Length); foreach (var d in arr) { streamWriter.WriteDouble(d); } } streamWriter.WriteString("oiewurouqwe"); streamWriter.WriteVariable(testArray); var res = memoryStream.ToArray(); var reference = bufferWriter.ToArray(); CollectionAssert.AreEqual(reference, res); }