示例#1
0
        public void ValidGetCandidatesTests(Media media, MultiStatus status, Offset offset, Limit limit, Order order)
        {
            var request = new Dictionary <string, string>()
            {
                [GetCandidatesParam.jobId.ToString()] = "35"
            };

            CommonMapper.ValidOffsetMapper[offset](request);
            CommonMapper.ValidLimitMapper[limit](request);
            CommonMapper.ValidMultiStatusMapper[status](request);
            CommonMapper.ValidMediaMapper[media](request);
            request[GetCandidatesParam.order.ToString()] = order.GetEnumStringValue();
            var defaultManager = new DefaultManager(new MatchingProUIConnection(TestConfig.GetValueFromConfig("MatchingProWeb")));
            var response       = defaultManager.Send <object>(Endpoints.Candidates, request, HttpMethod.GET);

            PrAssert.That(response, PrIs.SuccessfulResponse().And.HttpCode(System.Net.HttpStatusCode.OK));
        }
        private byte[] JoinPackets(int id, byte total, bool bzipped, MultiStatus status) {
            var multiPkt = bzipped ? status.BzipDict[id] : status.PlainDict[id];
            var len = multiPkt.Sum(pkt => pkt.Length);
            for (var i = total; i < multiPkt.Length; i++)
                len -= multiPkt[i].Length;
            var replyPkt = new byte[len];
            var pos = 0;
            for (var i = 0; i < total; i++) {
                Buffer.BlockCopy(multiPkt[i], 0, replyPkt, pos, multiPkt[i].Length);
                pos += multiPkt[i].Length;
            }
            if (bzipped) {
                //var input = new MemoryStream(replyPkt);
                //var output = new MemoryStream();
                //BZip2.Decompress(input, output, true);
                //replyPkt = output.ToArray();
            }
            var valid = true;
            if (total + 1 < multiPkt.Length) {
                //var size = BitConverter.ToInt32(multiPkt[total + 1], 0);
                //var crc = BitConverter.ToInt32(multiPkt[total + 1], 4);
                //if (replyPkt.Length * 8 != size) valid = false;
                //var checkCrc = new Crc32();
                //checkCrc.Update(replyPkt);
                //if (checkCrc.Value != crc) valid = false;
            }

            if (!valid) {
                throw new Exception("split packet not decompressed properly");
                //TODO: check if at least header is intact so query can be retried
            }
            return replyPkt;
        }
        private byte[] CollectPacket(byte[] reply, int pos, MultiStatus status) {
            //TODO: test if this works on old source server or mockup
            var id = BitConverter.ToInt32(reply, pos);
            pos += 4;
            var bzipped = (id & 0x80000000) != 0;
            var total = reply[pos++];
            var number = reply[pos++];
            pos += 2; //ignoring next short
            if (bzipped) {
                throw new Exception("bzip2 compression not implemented");
                /*
                if (!status.BzipDict.ContainsKey(id))
                {
                    status.BzipDict[id] = new byte[total + 2][];
                    status.BzipDict[id][total] = new byte[1];
                }
                if (number == 0)
                {
                    status.BzipDict[id][total + 1] = reply.Skip(pos).Take(4).ToArray();
                    pos += 4;
                }
                status.BzipDict[id][number] = reply.Skip(pos).ToArray();
                var runTotal = status.BzipDict[id][total][0]++;
                if (runTotal == total) JoinPackets(id, total, true);
                 */
            }
            //else
            if (!status.PlainDict.ContainsKey(id)) {
                status.PlainDict[id] = new byte[total + 1][];
                status.PlainDict[id][total] = new byte[1];
            }
            status.PlainDict[id][number] = reply.Skip(pos).ToArray();
            var runTotal = status.PlainDict[id][total][0]++;
            if (runTotal == total)
                return JoinPackets(id, total, false, status);

            return null;
        }
        private byte[] ProcessPacketHeader(byte[] reply, MultiStatus status) {
            Contract.Requires<ArgumentNullException>(reply != null);

            var pos = 0;
            byte[] header = {0xFF, 0xFF, 0xFF};
            var match = header.All(b => reply[pos++] == b);
            if (!match)
                return null;

            if (reply[pos] == 0xFF)
                return reply;
            if (reply[pos] == 0xFE)
                return CollectPacket(reply, ++pos, status);
            return null;
        }
 private async Task<byte[]> ReceiveMultiple(MultiStatus status) {
     // TODO: Keep looping for multi packets (process each header to find if there are more)
     // and concatenate them in the right order
     var response = await Receive().ConfigureAwait(false);
     return ProcessPacketHeader(response.Buffer, status);
 }
 private async Task<byte[]> SendAndReceiveUntilEnd(byte[] msg) {
     _state.StartSW();
     var i = 0;
     try {
         await SendPacket(msg).ConfigureAwait(false);
         byte[] response = null;
         var multiStatus = new MultiStatus();
         while (response == null) {
             try {
                 response = await ReceiveMultiple(multiStatus).ConfigureAwait(false);
             } finally {
                 if (i == 0)
                     _state.StopSW();
             }
             i++;
         }
         return response;
     } finally {
         if (i == 0)
             _state.StopSW();
     }
 }