Exemple #1
0
        public void ReadsListOfLists()
        {
            var bytes   = Encoding.ASCII.GetBytes("l3:foo3:barl3:buz3:baree");
            var reader  = new BEncodeSerializer();
            var cursor  = 0;
            var element = (BList)reader.Deserialize(bytes, ref cursor);

            Assert.Equal(BEncodeType.List, element.Type);
            var elem0 = element[0];

            Assert.Equal(BEncodeType.String, elem0.Type);
            Assert.Equal("foo", (BString)elem0);
            var elem1 = element[1];

            Assert.Equal(BEncodeType.String, elem1.Type);
            Assert.Equal("bar", (BString)elem1);
            var elem2 = element[2];

            Assert.Equal(BEncodeType.List, elem2.Type);
            var lst = (BList)elem2;

            Assert.Equal(2, lst.Count);
            var item0 = lst[0];

            Assert.Equal(BEncodeType.String, item0.Type);
            Assert.Equal("buz", (BString)item0);
            var item1 = lst[1];

            Assert.Equal(BEncodeType.String, item1.Type);
            Assert.Equal("bar", (BString)item1);
        }
Exemple #2
0
        public void ReadDictionarySimple(string input, string[] values)
        {
            var bytes   = new ReadOnlySpan <byte>(Encoding.ASCII.GetBytes(input));
            var reader  = new BEncodeSerializer();
            var cursor  = 0;
            var element = (BDictionary)reader.Deserialize(bytes, ref cursor);

            Assert.Equal(BEncodeType.Dictionary, element.Type);
            var dic = new Dictionary <string, string>();

            for (var i = 0; i < values.Length; i += 2)
            {
                var key   = values[i];
                var value = values[i + 1];
                dic.Add(key, value);
            }
            Assert.Equal(dic.Count, element.Count);
            foreach (var(key, value) in element)
            {
                Assert.True(dic.ContainsKey(key));
                var val = (BString)element[key];
                Assert.Equal(BEncodeType.String, val.Type);
                Assert.Equal(dic[key], val);
            }
        }
        /// <summary>
        /// Serializes torrent to stream
        /// </summary>
        /// <param name="stream"><see cref="Stream"/> to serialize to</param>
        /// <param name="torrent"><see cref="Torrent"/> to serialize</param>
        /// <exception cref="ArgumentNullException">When <paramref name="stream"/> or <paramref name="torrent"/> is null</exception>
        public void Serialize(Stream stream, Torrent torrent)
        {
            torrent = torrent ?? throw new ArgumentNullException(nameof(torrent));
            stream  = stream ?? throw new ArgumentNullException(nameof(stream));
            var dic    = ParserHelper.GetTorrentDictionary(torrent);
            var writer = new BEncodeSerializer();

            writer.Serialize(stream, dic);
        }
Exemple #4
0
        public void ReadsString(string input, string expected)
        {
            var bytes   = new ReadOnlySpan <byte>(Encoding.ASCII.GetBytes(input));
            var reader  = new BEncodeSerializer();
            var cursor  = 0;
            var element = (BString)reader.Deserialize(bytes, ref cursor);

            Assert.Equal(BEncodeType.String, element.Type);
            Assert.Equal(expected, element.ToString());
        }
Exemple #5
0
        public void ReadsDouble(string input, double value)
        {
            var bytes   = new ReadOnlySpan <byte>(Encoding.ASCII.GetBytes(input));
            var reader  = new BEncodeSerializer();
            var cursor  = 0;
            var element = (BNumber)reader.Deserialize(bytes, ref cursor);

            Assert.Equal(BEncodeType.Number, element.Type);
            Assert.Equal(value, element);
        }
Exemple #6
0
        public static Torrent ParseTorrent(ReadOnlySpan <byte> bytes, int offset, Encoding defaultStringEncoding)
        {
            var reader         = new BEncodeSerializer();
            var dictionary     = (BDictionary)reader.Deserialize(bytes, ref offset);
            var torrent        = new Torrent();
            var stringEncoding = Encoding.UTF8;

            if (dictionary.TryGetValue(Constants.EncodingKey, out IBEncodedObject enc))
            {
                stringEncoding   = Encoding.GetEncoding((BString)enc);
                torrent.Encoding = stringEncoding;
            }
            else
            {
                stringEncoding = defaultStringEncoding;
            }

            foreach (var(key, value) in dictionary)
            {
                if (key == Constants.AnnounceKey)
                {
                    var announce = (BString)value;
                    if (string.IsNullOrEmpty(announce))
                    {
                        throw new ParsingException(MalformedTorrent);
                    }
                    torrent.Announce = new Uri((BString)value);
                }
                else if (key == Constants.InfoKey)
                {
                    var dic = (BDictionary)value;
                    torrent.Info = ParseInfoSection(dic);
                }
                else if (key == Constants.EncodingKey)
                {
                    // do nothing;
                }
                else
                {
                    torrent.Extensions.Add(key, value);
                }
            }

            if (torrent.Info == null)
            {
                throw new ParsingException(MalformedTorrent);
            }

            return(torrent);
        }
Exemple #7
0
        public void ReadsListSimple(string input, string[] values)
        {
            var bytes   = new ReadOnlySpan <byte>(Encoding.ASCII.GetBytes(input));
            var reader  = new BEncodeSerializer();
            var cursor  = 0;
            var element = (BList)reader.Deserialize(bytes, ref cursor);

            Assert.Equal(BEncodeType.List, element.Type);
            Assert.Equal(values.Length, element.Count);
            for (var i = 0; i < values.Length; i++)
            {
                Assert.Equal(BEncodeType.String, element[i].Type);
                Assert.Equal(values[i], (BString)element[i]);
            }
        }
Exemple #8
0
        public void ReadListOfDictionaries()
        {
            var bytes   = Encoding.ASCII.GetBytes("ld3:foo3:bared3:buz3:butee");
            var reader  = new BEncodeSerializer();
            var cursor  = 0;
            var element = (BList)reader.Deserialize(bytes, ref cursor);

            Assert.Equal(BEncodeType.List, element.Type);
            Assert.Equal(2, element.Count);
            var elem0 = (BDictionary)element[0];

            Assert.Equal(BEncodeType.Dictionary, elem0.Type);
            Assert.Single(elem0.Keys);
            Assert.Single(elem0.Values);
            Assert.Equal("foo", elem0.Keys.First());
            Assert.Equal("bar", (BString)elem0.Values.First());
            var elem1 = (BDictionary)element[1];

            Assert.Equal(BEncodeType.Dictionary, elem1.Type);
            Assert.Single(elem1.Keys);
            Assert.Single(elem1.Values);
            Assert.Equal("buz", elem1.Keys.First());
            Assert.Equal("but", (BString)elem1.Values.First());
        }