diff --git a/src/AngleSharp.Core.Tests/Library/CookieHandling.cs b/src/AngleSharp.Core.Tests/Library/CookieHandling.cs index 96728203bc..1e6457d890 100644 --- a/src/AngleSharp.Core.Tests/Library/CookieHandling.cs +++ b/src/AngleSharp.Core.Tests/Library/CookieHandling.cs @@ -405,6 +405,57 @@ public void DateTimeShouldBeAccepted_Issue663() "c-s=expires=1531601411~access=/clientimg/richmond/*!/content/richmond/*~md5=c56447496f01a9cd01bbec1b3a293357; path=/; secure"); } + [Test] + public void DataUrlShouldNotDeliverAnyCookie_Issue702() + { + var mcp = new MemoryCookieProvider(); + var url = Url.Create("data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="); + var cookie = mcp.GetCookie(url); + Assert.IsEmpty(cookie); + } + + [Test] + public void NoOriginShouldNotDeliverAnyCookie_Issue702() + { + var mcp = new MemoryCookieProvider(); + var url = new Url(""); + var cookie = mcp.GetCookie(url); + Assert.IsEmpty(cookie); + } + + [Test] + public void ShouldChangeSelectedCookiesOnRedirect_Issue548() + { + var requester = new MockRequester(); + var mcp = new MemoryCookieProvider(); + var config = Configuration.Default.With(mcp).With(requester).WithDefaultLoader(); + var context = BrowsingContext.New(config); + var receivedCookieHeader = "THECOOKIE=value1"; + var url = new Url("http://example.com/path1"); + //request 1: /path1, set a cookie THECOOKIE=value1 + requester.BuildResponse(req => VirtualResponse.Create(r => r + .Address("http://example.com/path1") + .Content("") + .Header(HeaderNames.SetCookie, receivedCookieHeader))); + context.OpenAsync("http://example.com/path1"); + //request 2: /path1/somefile.jsp redirects to /path2/file2.jsp + requester.BuildResponses(new Func[] { + req => VirtualResponse.Create(r => r + .Address("http://example.com/path1/somefile.jsp") + .Content("") + .Status(System.Net.HttpStatusCode.Redirect) + .Header(HeaderNames.Location, "http://example.com/path2/file2.jsp")), + req => { + receivedCookieHeader = req.Headers.GetOrDefault(HeaderNames.Cookie, String.Empty); + return VirtualResponse.Create(r => r + .Address("http://example.com/path2/file2.jsp") + .Content("")); + } + }); + context.OpenAsync("http://example.com/path1/somefile.jsp"); + Assert.AreEqual(String.Empty, receivedCookieHeader); + } + private static Task LoadDocumentWithFakeRequesterAndCookie(IResponse initialResponse, Func onRequest) { diff --git a/src/AngleSharp.Core.Tests/Mocks/MockRequester.cs b/src/AngleSharp.Core.Tests/Mocks/MockRequester.cs index 71dbea152f..0b715141d4 100644 --- a/src/AngleSharp.Core.Tests/Mocks/MockRequester.cs +++ b/src/AngleSharp.Core.Tests/Mocks/MockRequester.cs @@ -1,4 +1,4 @@ -namespace AngleSharp.Core.Tests.Mocks +namespace AngleSharp.Core.Tests.Mocks { using AngleSharp.Io; using System; @@ -38,6 +38,21 @@ public void BuildResponse(Func answer) _answer = answer; } + public void BuildResponses(IEnumerable> answers) + { + var enumerator = answers.GetEnumerator(); + _answer = req => + { + if (!enumerator.MoveNext()) + { + var content = new MemoryStream(Encoding.UTF8.GetBytes(String.Empty)); + return new DefaultResponse { Address = req.Address, Content = content, StatusCode = System.Net.HttpStatusCode.NotFound }; + } + + return enumerator.Current(req); + }; + } + public IResponse Request(Request request) { OnRequest?.Invoke(request); diff --git a/src/AngleSharp/Io/DefaultHttpRequester.cs b/src/AngleSharp/Io/DefaultHttpRequester.cs index be4a9f08e7..543ea89012 100644 --- a/src/AngleSharp/Io/DefaultHttpRequester.cs +++ b/src/AngleSharp/Io/DefaultHttpRequester.cs @@ -1,4 +1,4 @@ -namespace AngleSharp.Io +namespace AngleSharp.Io { using AngleSharp.Common; using AngleSharp.Text; @@ -316,7 +316,10 @@ private void SetHeaders() foreach (var header in _request.Headers) { - AddHeader(header.Key, header.Value); + if (!header.Key.Is(HeaderNames.Cookie)) + { + AddHeader(header.Key, header.Value); + } } }