Process and store cookies in a cookie store, or directly use it as a http client.
This package should mostly conform to RFC 6265 with some minor exceptions
-
Cookie
-
CookieStore
-
CookieClient
http client (using http package)
A CookieKey
is used, to uniquely identify a cookie in a CookieStore
. It is a combination of the cookie's name, domain and path.
Cookies can be parsed from a Set-Cookie
header field:
Cookie cookie = Cookie.fromSetCookieHeader(
"foo=bar; Domain=example.com; Path=/; Secure; HttpOnly",
// Optional, defaults to DateTime.now()
time: DateTime.now(),
// Optional, is important for validation and when the 'Domain' attribute is omitted
domain: Uri(host: "example.com"),
);
print(cookie.domain); // => example.com
print(cookie.path); // => /
print(cookie.secure); // => true
print(cookie.httpOnly); // => true
Note:
DateTime
objects are always converted to UTC, since this is required by the standard.
This is a simpler form of Cookie
that only contains the name, value and a map of attributes. It can be parsed from a Set-Cookie
header field, the same way as Cookie
.
A CookieStore
can be used to store cookies and retrieve them for a given domain and path. This class implements Map<CookieKey, Cookie>
.
CookieStore store = CookieStore();
DateTime time = DateTime.utc(2015, 10, 21, 7, 0);
store.executeHeaders([
"foo=bar; Domain=example.com; Path=/; Secure; HttpOnly",
"foo=baz; Path=/bar; HttpOnly; Expires=Wed, 21 Oct 2015 07:28:00 GMT",
"bar=foo; Domain=bar.example.com; Secure; Max-Age=3600",
], domain: Uri(host: "bar.example.com"), time: time);
print(store.cookiesFor(uri: Uri(host: "bar.example.com"), time: time));
// => [foo=bar; Domain=example.com; Secure; HttpOnly,
// bar=foo; Expires=Wed, 21 Oct 2015 08:00:00 GMT; Domain=bar.example.com; Secure]
time = time.add(Duration(hours: 2));
store.pump(time: time);
print(store.cookiesFor(uri: Uri(host: "bar.example.com"), time: time));
// => [foo=bar; Domain=example.com; Secure; HttpOnly]
A CookieClient
is a wrapper around the http package's Client
that uses a CookieStore
to manage cookies.
CookieClient client = CookieClient();
final client = CookieClient();
await client.get(Uri.parse('https://www.nytimes.com/'));
await client.get(Uri.parse('https://edition.cnn.com/'));
groupBy(client.store.cookies, (c) => c.domain).forEach((key, value) {
print("$key:");
for (var cookie in value) {
print('\t$cookie');
}
});
print(client.store[CookieKey('geoData', Uri(host: 'cnn.com'))]);
client.close();
Feel free to open an issue or a PR if you find a bug or have a feature request!