/// <exception cref="System.IO.IOException"></exception>
        private void ReceivePack(ProgressMonitor monitor)
        {
            OnReceivePack();
            InputStream input = @in;

            if (sideband)
            {
                input = new SideBandInputStream(input, monitor, GetMessageWriter());
            }
            ObjectInserter ins = local.NewObjectInserter();

            try
            {
                PackParser parser = ins.NewPackParser(input);
                parser.SetAllowThin(thinPack);
                parser.SetObjectChecking(transport.IsCheckFetchedObjects());
                parser.SetLockMessage(lockMessage);
                packLock = parser.Parse(monitor);
                ins.Flush();
            }
            finally
            {
                ins.Release();
            }
        }
        public virtual void TestNonMarkingInputStream()
        {
            TestRepository d = new TestRepository <FileRepository>(db);
            RevBlob        a = d.Blob("a");

            TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024);
            PackHeader(pack, 1);
            pack.Write((Constants.OBJ_REF_DELTA) << 4 | 4);
            a.CopyRawTo(pack);
            Deflate(pack, new byte[] { unchecked ((int)(0x1)), unchecked ((int)(0x1)), unchecked (
                                           (int)(0x1)), (byte)('b') });
            Digest(pack);
            InputStream @in = new _ByteArrayInputStream_319(pack.ToByteArray());
            PackParser  p   = Index(@in);

            p.SetAllowThin(true);
            p.SetCheckEofAfterPackFooter(false);
            p.SetExpectDataAfterPackFooter(true);
            try
            {
                p.Parse(NullProgressMonitor.INSTANCE);
                NUnit.Framework.Assert.Fail("PackParser should have failed");
            }
            catch (IOException e)
            {
                NUnit.Framework.Assert.AreEqual(e.Message, JGitText.Get().inputStreamMustSupportMark
                                                );
            }
        }
Beispiel #3
0
        /// <exception cref="System.IO.IOException"></exception>
        private void VerifyOpenPack(bool thin)
        {
            byte[] packData = os.ToByteArray();
            if (thin)
            {
                PackParser p = Index(packData);
                try
                {
                    p.Parse(NullProgressMonitor.INSTANCE);
                    NUnit.Framework.Assert.Fail("indexer should grumble about missing object");
                }
                catch (IOException)
                {
                }
            }
            // expected
            ObjectDirectoryPackParser p_1 = (ObjectDirectoryPackParser)Index(packData);

            p_1.SetKeepEmpty(true);
            p_1.SetAllowThin(thin);
            p_1.SetIndexVersion(2);
            p_1.Parse(NullProgressMonitor.INSTANCE);
            pack = p_1.GetPackFile();
            NUnit.Framework.Assert.IsNotNull(pack, "have PackFile after parsing");
        }
Beispiel #4
0
 /// <exception cref="NGit.Errors.TransportException"></exception>
 protected internal override void DoFetch(ProgressMonitor monitor, ICollection <Ref
                                                                                > want, ICollection <ObjectId> have)
 {
     VerifyPrerequisites();
     try
     {
         ObjectInserter ins = transport.local.NewObjectInserter();
         try
         {
             PackParser parser = ins.NewPackParser(bin);
             parser.SetAllowThin(true);
             parser.SetObjectChecking(transport.IsCheckFetchedObjects());
             parser.SetLockMessage(lockMessage);
             packLock = parser.Parse(NullProgressMonitor.INSTANCE);
             ins.Flush();
         }
         finally
         {
             ins.Release();
         }
     }
     catch (IOException err)
     {
         Close();
         throw new TransportException(transport.uri, err.Message, err);
     }
     catch (RuntimeException err)
     {
         Close();
         throw new TransportException(transport.uri, err.Message, err);
     }
 }
        public virtual void TestDataAfterPackFooterSplitObjectRead()
        {
            byte[] data = Constants.Encode("0123456789");
            // Build a pack ~17k
            int objects = 900;

            TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(32 * 1024);
            PackHeader(pack, objects);
            for (int i = 0; i < objects; i++)
            {
                pack.Write((Constants.OBJ_BLOB) << 4 | 10);
                Deflate(pack, data);
            }
            Digest(pack);
            byte[] packData   = pack.ToByteArray();
            byte[] streamData = new byte[packData.Length + 1];
            System.Array.Copy(packData, 0, streamData, 0, packData.Length);
            streamData[packData.Length] = unchecked ((int)(0x7e));
            InputStream @in = new ByteArrayInputStream(streamData);
            PackParser  p   = Index(@in);

            p.SetAllowThin(true);
            p.SetCheckEofAfterPackFooter(false);
            p.SetExpectDataAfterPackFooter(true);
            p.Parse(NullProgressMonitor.INSTANCE);
            NUnit.Framework.Assert.AreEqual(unchecked ((int)(0x7e)), @in.Read());
        }
        public virtual void TestDataAfterPackFooterSplitHeaderRead()
        {
            TestRepository d = new TestRepository <FileRepository>(db);

            byte[]  data    = Constants.Encode("a");
            RevBlob b       = d.Blob(data);
            int     objects = 248;

            TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(32 * 1024);
            PackHeader(pack, objects + 1);
            int           offset = 13;
            StringBuilder sb     = new StringBuilder();

            for (int i = 0; i < offset; i++)
            {
                sb.Append(i);
            }
            offset = sb.ToString().Length;
            int lenByte = (Constants.OBJ_BLOB) << 4 | (offset & unchecked ((int)(0x0F)));

            offset >>= 4;
            if (offset > 0)
            {
                lenByte |= 1 << 7;
            }
            pack.Write(lenByte);
            while (offset > 0)
            {
                lenByte  = offset & unchecked ((int)(0x7F));
                offset >>= 6;
                if (offset > 0)
                {
                    lenByte |= 1 << 7;
                }
                pack.Write(lenByte);
            }
            Deflate(pack, Constants.Encode(sb.ToString()));
            for (int i_1 = 0; i_1 < objects; i_1++)
            {
                // The last pack header written falls across the 8192 byte boundary
                // between [8189:8210]
                pack.Write((Constants.OBJ_REF_DELTA) << 4 | 4);
                b.CopyRawTo(pack);
                Deflate(pack, new byte[] { unchecked ((int)(0x1)), unchecked ((int)(0x1)), unchecked (
                                               (int)(0x1)), (byte)('b') });
            }
            Digest(pack);
            byte[] packData   = pack.ToByteArray();
            byte[] streamData = new byte[packData.Length + 1];
            System.Array.Copy(packData, 0, streamData, 0, packData.Length);
            streamData[packData.Length] = unchecked ((int)(0x7e));
            InputStream @in = new ByteArrayInputStream(streamData);
            PackParser  p   = Index(@in);

            p.SetAllowThin(true);
            p.SetCheckEofAfterPackFooter(false);
            p.SetExpectDataAfterPackFooter(true);
            p.Parse(NullProgressMonitor.INSTANCE);
            NUnit.Framework.Assert.AreEqual(unchecked ((int)(0x7e)), @in.Read());
        }
        public virtual void TestMaxObjectSizeDeltaResultSize()
        {
            TestRepository d = new TestRepository <FileRepository>(db);
            RevBlob        a = d.Blob("0123456789");

            TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024);
            PackHeader(pack, 1);
            pack.Write((Constants.OBJ_REF_DELTA) << 4 | 4);
            a.CopyRawTo(pack);
            Deflate(pack, new byte[] { 10, 11, 1, (byte)('a') });
            Digest(pack);
            PackParser p = Index(new ByteArrayInputStream(pack.ToByteArray()));

            p.SetAllowThin(true);
            p.SetMaxObjectSizeLimit(11);
            p.Parse(NullProgressMonitor.INSTANCE);
            p = Index(new ByteArrayInputStream(pack.ToByteArray()));
            p.SetAllowThin(true);
            p.SetMaxObjectSizeLimit(10);
            try
            {
                p.Parse(NullProgressMonitor.INSTANCE);
                NUnit.Framework.Assert.Fail("PackParser should have failed");
            }
            catch (TooLargeObjectInPackException e)
            {
                NUnit.Framework.Assert.IsTrue(e.Message.Contains("11"));
                // result obj size
                NUnit.Framework.Assert.IsTrue(e.Message.Contains("10"));
            }
        }
        public virtual void TestDataAfterPackFooterSingleRead()
        {
            TestRepository d = new TestRepository <FileRepository>(db);
            RevBlob        a = d.Blob("a");

            TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(32 * 1024);
            PackHeader(pack, 1);
            pack.Write((Constants.OBJ_REF_DELTA) << 4 | 4);
            a.CopyRawTo(pack);
            Deflate(pack, new byte[] { unchecked ((int)(0x1)), unchecked ((int)(0x1)), unchecked (
                                           (int)(0x1)), (byte)('b') });
            Digest(pack);
            byte[] packData   = pack.ToByteArray();
            byte[] streamData = new byte[packData.Length + 1];
            System.Array.Copy(packData, 0, streamData, 0, packData.Length);
            streamData[packData.Length] = unchecked ((int)(0x7e));
            InputStream @in = new ByteArrayInputStream(streamData);
            PackParser  p   = Index(@in);

            p.SetAllowThin(true);
            p.SetCheckEofAfterPackFooter(false);
            p.SetExpectDataAfterPackFooter(true);
            p.Parse(NullProgressMonitor.INSTANCE);
            NUnit.Framework.Assert.AreEqual(unchecked ((int)(0x7e)), @in.Read());
        }
        public virtual void TestMaxObjectSizeFullBlob()
        {
            TestRepository d = new TestRepository <FileRepository>(db);

            byte[] data = Constants.Encode("0123456789");
            d.Blob(data);
            TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024);
            PackHeader(pack, 1);
            pack.Write((Constants.OBJ_BLOB) << 4 | 10);
            Deflate(pack, data);
            Digest(pack);
            PackParser p = Index(new ByteArrayInputStream(pack.ToByteArray()));

            p.SetMaxObjectSizeLimit(11);
            p.Parse(NullProgressMonitor.INSTANCE);
            p = Index(new ByteArrayInputStream(pack.ToByteArray()));
            p.SetMaxObjectSizeLimit(10);
            p.Parse(NullProgressMonitor.INSTANCE);
            p = Index(new ByteArrayInputStream(pack.ToByteArray()));
            p.SetMaxObjectSizeLimit(9);
            try
            {
                p.Parse(NullProgressMonitor.INSTANCE);
                NUnit.Framework.Assert.Fail("PackParser should have failed");
            }
            catch (TooLargeObjectInPackException e)
            {
                NUnit.Framework.Assert.IsTrue(e.Message.Contains("10"));
                // obj size
                NUnit.Framework.Assert.IsTrue(e.Message.Contains("9"));
            }
        }
        public virtual void TestPackWithTrailingGarbage()
        {
            TestRepository d = new TestRepository <FileRepository>(db);
            RevBlob        a = d.Blob("a");

            TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024);
            PackHeader(pack, 1);
            pack.Write((Constants.OBJ_REF_DELTA) << 4 | 4);
            a.CopyRawTo(pack);
            Deflate(pack, new byte[] { unchecked ((int)(0x1)), unchecked ((int)(0x1)), unchecked (
                                           (int)(0x1)), (byte)('b') });
            Digest(pack);
            PackParser p = Index(new UnionInputStream(new ByteArrayInputStream(pack.ToByteArray
                                                                                   ()), new ByteArrayInputStream(new byte[] { unchecked ((int)(0x7e)) })));

            p.SetAllowThin(true);
            p.SetCheckEofAfterPackFooter(true);
            try
            {
                p.Parse(NullProgressMonitor.INSTANCE);
                NUnit.Framework.Assert.Fail("Pack with trailing garbage was accepted");
            }
            catch (IOException err)
            {
                NUnit.Framework.Assert.AreEqual(MessageFormat.Format(JGitText.Get().expectedEOFReceived
                                                                     , "\\x7e"), err.Message);
            }
        }
Beispiel #11
0
        public virtual void TestDelta_SmallObjectChain()
        {
            ObjectInserter.Formatter fmt = new ObjectInserter.Formatter();
            byte[] data0 = new byte[512];
            Arrays.Fill(data0, unchecked ((byte)unchecked ((int)(0xf3))));
            ObjectId id0 = fmt.IdFor(Constants.OBJ_BLOB, data0);

            TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(64 * 1024);
            PackHeader(pack, 4);
            ObjectHeader(pack, Constants.OBJ_BLOB, data0.Length);
            Deflate(pack, data0);
            byte[]   data1  = Clone(unchecked ((int)(0x01)), data0);
            byte[]   delta1 = Delta(data0, data1);
            ObjectId id1    = fmt.IdFor(Constants.OBJ_BLOB, data1);

            ObjectHeader(pack, Constants.OBJ_REF_DELTA, delta1.Length);
            id0.CopyRawTo(pack);
            Deflate(pack, delta1);
            byte[]   data2  = Clone(unchecked ((int)(0x02)), data1);
            byte[]   delta2 = Delta(data1, data2);
            ObjectId id2    = fmt.IdFor(Constants.OBJ_BLOB, data2);

            ObjectHeader(pack, Constants.OBJ_REF_DELTA, delta2.Length);
            id1.CopyRawTo(pack);
            Deflate(pack, delta2);
            byte[]   data3  = Clone(unchecked ((int)(0x03)), data2);
            byte[]   delta3 = Delta(data2, data3);
            ObjectId id3    = fmt.IdFor(Constants.OBJ_BLOB, data3);

            ObjectHeader(pack, Constants.OBJ_REF_DELTA, delta3.Length);
            id2.CopyRawTo(pack);
            Deflate(pack, delta3);
            Digest(pack);
            PackParser ip = Index(pack.ToByteArray());

            ip.SetAllowThin(true);
            ip.Parse(NullProgressMonitor.INSTANCE);
            NUnit.Framework.Assert.IsTrue(wc.Has(id3), "has blob");
            ObjectLoader ol = wc.Open(id3);

            NUnit.Framework.Assert.IsNotNull(ol, "created loader");
            NUnit.Framework.Assert.AreEqual(Constants.OBJ_BLOB, ol.GetType());
            NUnit.Framework.Assert.AreEqual(data3.Length, ol.GetSize());
            NUnit.Framework.Assert.IsFalse(ol.IsLarge(), "is large");
            NUnit.Framework.Assert.IsNotNull(ol.GetCachedBytes());
            CollectionAssert.AreEquivalent(data3, ol.GetCachedBytes());
            ObjectStream @in = ol.OpenStream();

            NUnit.Framework.Assert.IsNotNull(@in, "have stream");
            NUnit.Framework.Assert.AreEqual(Constants.OBJ_BLOB, @in.GetType());
            NUnit.Framework.Assert.AreEqual(data3.Length, @in.GetSize());
            byte[] act = new byte[data3.Length];
            IOUtil.ReadFully(@in, act, 0, data3.Length);
            NUnit.Framework.Assert.IsTrue(Arrays.Equals(act, data3), "same content");
            NUnit.Framework.Assert.AreEqual(-1, @in.Read(), "stream at EOF");
            @in.Close();
        }
        private void RegisterPackScheme()
        {
            if (UriParser.IsKnownScheme("pack"))
            {
                return;
            }

            var packParser = new PackParser();

            UriParser.Register(packParser, "pack", 0);
        }
        /// <exception cref="System.IO.IOException"></exception>
        private void OpenPack(TemporaryBuffer.Heap buf)
        {
            if (inserter == null)
            {
                inserter = src.NewObjectInserter();
            }
            byte[]     raw = buf.ToByteArray();
            PackParser p   = inserter.NewPackParser(new ByteArrayInputStream(raw));

            p.SetAllowThin(true);
            p.Parse(PM);
        }
        public virtual void TestPackWithDuplicateBlob()
        {
            byte[] data = Constants.Encode("0123456789abcdefg");
            TestRepository <Repository> d = new TestRepository <Repository>(db);

            NUnit.Framework.Assert.IsTrue(db.HasObject(d.Blob(data)));
            TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024);
            PackHeader(pack, 1);
            pack.Write((Constants.OBJ_BLOB) << 4 | unchecked ((int)(0x80)) | 1);
            pack.Write(1);
            Deflate(pack, data);
            Digest(pack);
            PackParser p = Index(new ByteArrayInputStream(pack.ToByteArray()));

            p.SetAllowThin(false);
            p.Parse(NullProgressMonitor.INSTANCE);
        }
        public virtual void TestTinyThinPack()
        {
            TestRepository d = new TestRepository <FileRepository>(db);
            RevBlob        a = d.Blob("a");

            TemporaryBuffer.Heap pack = new TemporaryBuffer.Heap(1024);
            PackHeader(pack, 1);
            pack.Write((Constants.OBJ_REF_DELTA) << 4 | 4);
            a.CopyRawTo(pack);
            Deflate(pack, new byte[] { unchecked ((int)(0x1)), unchecked ((int)(0x1)), unchecked (
                                           (int)(0x1)), (byte)('b') });
            Digest(pack);
            PackParser p = Index(new ByteArrayInputStream(pack.ToByteArray()));

            p.SetAllowThin(true);
            p.Parse(NullProgressMonitor.INSTANCE);
        }
Beispiel #16
0
            /// <exception cref="System.IO.IOException"></exception>
            internal virtual void DownloadPack(ProgressMonitor monitor)
            {
                string name = "pack/" + this.packName;

                WalkRemoteObjectDatabase.FileStream s = this.connection.Open(name);
                PackParser parser = this._enclosing.inserter.NewPackParser(s.@in);

                parser.SetAllowThin(false);
                parser.SetObjectChecker(this._enclosing.objCheck);
                parser.SetLockMessage(this._enclosing.lockMessage);
                PackLock Lock = parser.Parse(monitor);

                if (Lock != null)
                {
                    this._enclosing.packLocks.AddItem(Lock);
                }
                this._enclosing.inserter.Flush();
            }
Beispiel #17
0
        /// <summary>
        /// 监听消息
        /// </summary>
        public void RecMessage()
        {
            try
            {
                while (keepserver)
                {
                    #region  照包接收  每次接收一个完整包
                    int offlinecount = 0;

                    //1.包头接收处理
                    int    allheadleftlengh = 27;
                    int    receivedlengh    = 0;
                    byte[] bufferhead       = new byte[27];//定义28位是只接收包头
                    while (allheadleftlengh - receivedlengh > 0)
                    {
                        byte[] buffertemp;
                        if (allheadleftlengh - receivedlengh > config.ReceiveBufferSize * 1024)
                        {
                            buffertemp = new byte[config.ReceiveBufferSize * 1024];
                        }
                        else
                        {
                            buffertemp = new byte[allheadleftlengh - receivedlengh];
                        }
                        int lengh = _clientsocket.Receive(buffertemp);
                        if (lengh <= 0)
                        {
                            if (offlinecount == 3)
                            {
                                throw new Exception("Socket  错误!");
                            }
                            offlinecount += 1;
                            Thread.Sleep(1000 * 2);
                        }
                        Buffer.BlockCopy(buffertemp, 0, bufferhead, receivedlengh, lengh);
                        receivedlengh += lengh;
                    }

                    //2.到此说明包头接收完成   解析包头  处理包体接收
                    PackageInfo packageinfo = new PackageInfo();
                    string      packhead    = Encoding.UTF8.GetString(bufferhead, 0, allheadleftlengh);
                    packageinfo = PackParser.ParserHead(packhead);
                    //测试用
                    //clientsession.ClientSockt.Send(bufferhead);
                    offlinecount = 0;
                    //2.1 处理包体接收
                    int allcontentleftlengh = packageinfo.PackContentLengh;
                    receivedlengh = 0;
                    byte[] buffercontent = new byte[allcontentleftlengh];//定义28位是只接收包头
                    while (allcontentleftlengh - receivedlengh > 0)
                    {
                        byte[] buffertemp;
                        if (allcontentleftlengh - receivedlengh > config.ReceiveBufferSize * 1024)
                        {
                            buffertemp = new byte[config.ReceiveBufferSize * 1024];
                        }
                        else
                        {
                            buffertemp = new byte[allcontentleftlengh - receivedlengh];
                        }
                        int lengh = _clientsocket.Receive(buffertemp);
                        if (lengh <= 0)
                        {
                            if (offlinecount == 3)
                            {
                                throw new Exception("Socket  错误!");
                            }
                            offlinecount += 1;
                            Thread.Sleep(1000 * 2);
                        }
                        Buffer.BlockCopy(buffertemp, 0, buffercontent, receivedlengh, lengh);
                        receivedlengh += lengh;
                    }
                    string packcontent = Encoding.UTF8.GetString(buffercontent, 0, allcontentleftlengh);
                    packageinfo.PackContent = packcontent;

                    if (RecvSuccess != null)
                    {
                        RecvSuccess(this, packageinfo);
                    }
                    #endregion
                }
            }
            catch (Exception ex)
            {
                //Log(ex.Message);
                Stop();
            }
        }