Exemplo n.º 1
0
        public void PublishFrame_Qos_GuaranteedDispatch_SendsReply()
        {
            FrameBuilder fb = new FrameBuilder();

            fb.WriteByte((byte)QoS.GuaranteedDispatch);
            fb.WriteArray(BitConverter.GetBytes((UInt32)123456));
            fb.WriteString("Test");
            fb.WriteMultiByte(3);
            fb.WriteArray(new byte[] { 0xAA, 0xBB, 0xCC });
            var data = fb.GetData();
            var frm  = new Frame();

            frm.payload   = data;
            frm.frameType = FrameType.Publish;
            A.CallTo(() => subManFake.DispatchMessage(A <string> .Ignored, A <byte[]> .Ignored, A <QoS> .Ignored)).Returns(PostResult.Dispatched);
            peerMan.FrameReceived(frm, rpFake);
            A.CallTo(() => rpFake.SendPublishReply(123456, Core.StatusCodes.PublishStatus.Ack)).MustHaveHappened();
        }
Exemplo n.º 2
0
        private void HandlePublish(Frame frame, IPeer source)
        {
            // the 5 offset is added because we dont process QoS and Framenumber yet.
            var qos   = (QoS)frame.payload[0];
            var msgId = BitConverter.ToUInt32(frame.payload, 1);

            var len = Util.ExtractMultiByte(frame.payload, 5);

            var buff = new byte[len.value];

            Array.Copy(frame.payload, 5 + (int)len.numBytesUsed, buff, 0, (int)len.value);
            var channelName = Encoding.UTF8.GetString(buff);

            var payloadLenOffset = 5 + len.numBytesUsed + len.value;
            var payloadLen       = Util.ExtractMultiByte(frame.payload, (int)payloadLenOffset);

            var payloadBuff = new byte[payloadLen.value];

            Array.Copy(frame.payload, (int)(payloadLenOffset + payloadLen.numBytesUsed), payloadBuff, 0, (int)payloadLen.value);
            var res = subMan.DispatchMessage(channelName, payloadBuff, qos);

            switch (qos)
            {
            case QoS.BestEffort:
                // No answer in BestEffort case, we favor throughput here.
                break;

            case QoS.GuaranteedDelivery:
                // If GuaranteedDelivery was requested, we send a failure notice if we did not
                // get a positive answer
                source.SendPublishReply(msgId, res == PostResult.Delivered ? Core.StatusCodes.PublishStatus.AckDelivery
                                                                               : Core.StatusCodes.PublishStatus.NakDelivery);

                break;

            case QoS.GuaranteedDispatch:
                source.SendPublishReply(msgId, res >= PostResult.DeliveryError ? Core.StatusCodes.PublishStatus.Ack
                                                                                   : Core.StatusCodes.PublishStatus.NakDispatch);
                break;
            }
        }