示例#1
0
        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;
                }
示例#3
0
        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);
        }