Adding a cookie to DocumentRequest

730 Views Asked by At

Using AngleSharp v 0.9.9, I'm loading a page with OpenAsync which sets a bunch of cookies, something like:

var configuration = Configuration.Default.WithHttpClientRequester().WithCookies();
var currentContext = BrowsingContext.New(configuration);
// ....
var doc = context.OpenAsync(url, token);

This works fine and I can see the cookies have been set. For example, I can do this:

var cookieProvider = currentContext.Configuration.Services.OfType<ICookieProvider>().First() as MemoryCookieProvider;

And examine it in the debugger and see the cookies in there (for domain=.share.state.nm.us)

Then I need to submit a post:

var request = new DocumentRequest(postUrl);
request.Method = HttpMethod.Post;
request.Headers["Content-Type"] = "application/x-www-form-urlencoded";
request.Headers["User-Agent"] = userAgent;
//...

Which eventually gets submitted:

var download = loader.DownloadAsync(request);

And I can see (using Fiddler) that it's submitting the cookies from the cookieProvider.

However, I need to add a cookie (and possible change the value in another) and no matter what I try, it doesn't seem to include it. For example, I do this:

cookieProvider.Container.Add(new System.Net.Cookie()
{
    Domain = ".share.state.nm.us",
    Name = "psback",
    Value = "somevalue",
    Path = "/"                    
});

And again I can examine the cookieProvider in the debugger and see the cookie I set. But when I actually submit the request and look in fiddler, the new cookie isn't included.

This seems like it should be really simple, what is the correct way to set a new cookie and have it included in subsequent requests?

1

There are 1 best solutions below

0
On

I think there are two potential ways to solve this.

either use document.Cookie for setting a new cookie (would require an active document that already is at the desired domain) or

Use a Filter for getting / manipulating the request before its send. This let's you really just change the used cookie container before actually submitting.

The Filter is set in the DefaultLoader configuration. See https://github.com/AngleSharp/AngleSharp/blob/master/src/AngleSharp/ConfigurationExtensions.cs#L152.