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); }
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); }
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()); }
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); }
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); }
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]); } }
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()); }