diff --git a/ScrapySharp.Tests/Network/Cookie.txt b/ScrapySharp.Tests/Network/Cookie.txt new file mode 100644 index 0000000..c4d0e30 --- /dev/null +++ b/ScrapySharp.Tests/Network/Cookie.txt @@ -0,0 +1 @@ +key1=204=eBL9WYALz-YPXedwGc-utNT3YXlx7moCeN-dvDDl-7xYtHIZtPEr0OZ2bKWtEJWInrKuEnlR_-JFXZ4mMYIVQrPcTxGCZCCHoeUpdz1kU3cMa38TGrn-uaB6gH7D7A_XKa5bJvjbkatI3mvnPNgjJfd4QrHeDu8hms-c9b6to04; key2=this is a test value; expires=Tue, 08-Dec-2020 01:44:28 GMT; path=/; domain=.localhost.fakedomain; HttpOnly \ No newline at end of file diff --git a/ScrapySharp.Tests/ScrapySharp.Tests.csproj b/ScrapySharp.Tests/ScrapySharp.Tests.csproj index c663c50..ce9f38d 100644 --- a/ScrapySharp.Tests/ScrapySharp.Tests.csproj +++ b/ScrapySharp.Tests/ScrapySharp.Tests.csproj @@ -2,6 +2,12 @@ netcoreapp2.0 + + + + + + @@ -41,5 +47,13 @@ Always + + Always + + + + + Always + \ No newline at end of file diff --git a/ScrapySharp.Tests/When_parse_cookies.cs b/ScrapySharp.Tests/When_parse_cookies.cs new file mode 100644 index 0000000..93769e8 --- /dev/null +++ b/ScrapySharp.Tests/When_parse_cookies.cs @@ -0,0 +1,56 @@ +// ReSharper disable InconsistentNaming + +using System.IO; +using NUnit.Framework; +using ScrapySharp.Html.Dom; +using ScrapySharp.Html.Parsing; +using System.Linq; +using ScrapySharp.Network; +using System.Net; + +namespace ScrapySharp.Tests +{ + [TestFixture] + public class When_parse_cookies + { + [Test] + public void When_parse_standard_cookie() + { + var cookie = GetCookie(); + + CookiesParser parser = new CookiesParser(".localhost.fakedomain"); + var cookieList = parser.ParseCookies(cookie); + + Assert.AreEqual(2, cookieList.Count); + } + + [Test] + public void When_parse_csv_cookie() + { + var csvCookie = GetCookie().Replace(";",","); + + CookiesParser parser = new CookiesParser(".localhost.fakedomain"); + var cookieList = parser.ParseCookies(csvCookie); + + Assert.AreEqual(2, cookieList.Count); + } + + [Test] + public void When_parse_csv_invalid_cookie() + { + string invalidCookie = GetCookie().Replace(";",";,"); + CookiesParser parser = new CookiesParser(".localhost.fakedomain"); + + Assert.Throws(()=> { parser.ParseCookies(invalidCookie); }); + } + + private static string GetCookie() + { + var cookie = File.ReadAllText("Network/Cookie.txt"); + + return cookie; + } + } +} + +// ReSharper restore InconsistentNaming \ No newline at end of file diff --git a/ScrapySharp.Tests/When_parses_using_CssSelector_with_fsharp_tokenizer.cs b/ScrapySharp.Tests/When_parses_using_CssSelector_with_fsharp_tokenizer.cs index d3da672..fe980f1 100644 --- a/ScrapySharp.Tests/When_parses_using_CssSelector_with_fsharp_tokenizer.cs +++ b/ScrapySharp.Tests/When_parses_using_CssSelector_with_fsharp_tokenizer.cs @@ -1,11 +1,10 @@ // ReSharper disable InconsistentNaming -using System.Linq; using HtmlAgilityPack; using NUnit.Framework; using ScrapySharp.Core; using ScrapySharp.Extensions; -using ScrapySharp.Core; +using System.Linq; namespace ScrapySharp.Tests { diff --git a/ScrapySharp/Network/CookiesParser.cs b/ScrapySharp/Network/CookiesParser.cs index b9da92d..2bf997c 100644 --- a/ScrapySharp/Network/CookiesParser.cs +++ b/ScrapySharp/Network/CookiesParser.cs @@ -8,8 +8,9 @@ namespace ScrapySharp.Network public class CookiesParser { private readonly string defaultDomain; - private static readonly Regex splitCookiesRegex = new Regex(@"\s*(?[^=]+)=(?[^;]+)?[,;]+", RegexOptions.Compiled); - + private static readonly Regex splitCookiesRegex = new Regex(@"\s*(?[^=]+)=(?[^;]+)?[;]+", RegexOptions.Compiled); + private static readonly Regex splitCookiesCsvRegex = new Regex(@"\s*(?[^=]+)=(?.*?),(?=[^,]+?(?:=|$))+", RegexOptions.Compiled); + public CookiesParser(string defaultDomain) { this.defaultDomain = defaultDomain; @@ -19,7 +20,11 @@ public List> ParseValuePairs(string cookiesExpressi { var list = new List>(); - var match = splitCookiesRegex.Match(cookiesExpression); + Match match; + if (cookiesExpression.Contains(";")) + match = splitCookiesRegex.Match(cookiesExpression); + else + match = splitCookiesCsvRegex.Match(cookiesExpression); while (match.Success) { @@ -45,7 +50,7 @@ public List ParseCookies(string cookiesExpression) for (int i = 0; i < keyValuePairs.Count; i++) { var pair = keyValuePairs[i]; - if (pair.Key.Equals("path", StringComparison.InvariantCultureIgnoreCase) + if (pair.Key.Equals("path", StringComparison.InvariantCultureIgnoreCase) || pair.Key.Equals("domain", StringComparison.InvariantCultureIgnoreCase) || pair.Key.Equals("expires", StringComparison.InvariantCultureIgnoreCase)) continue;