saveCookies method
Save cookies from the response including redirected requests.
Implementation
Future<void> saveCookies(Response response) async {
final setCookies = response.headers[HttpHeaders.setCookieHeader];
if (setCookies == null || setCookies.isEmpty) {
return;
}
final List<Cookie> cookies = setCookies
.map((str) => str.split(_setCookieReg))
.expand((cookie) => cookie)
.where((cookie) => cookie.isNotEmpty)
.map((str) => _fromSetCookieValue(str))
.whereType<Cookie>() // Use .nonNulls when the minimum SDK is 3.0.
.toList();
// Saving cookies for the original site.
// Spec: https://www.rfc-editor.org/rfc/rfc7231#section-7.1.2.
final originalUri = response.requestOptions.uri;
final realUri = originalUri.resolveUri(response.realUri);
await cookieJar.saveFromResponse(realUri, cookies);
// Handle `Set-Cookie` when `followRedirects` is false
// and the response returns a redirect status code.
final statusCode = response.statusCode ?? 0;
// 300 indicates the URL has multiple choices, so here we use list literal.
final locations = response.headers[HttpHeaders.locationHeader] ?? [];
// We don't want to explicitly consider recursive redirections
// cookie handling here, because when `followRedirects` is set to false,
// users will be available to handle cookies themselves.
final redirected = statusCode >= 300 && statusCode < 400;
if (redirected && locations.isNotEmpty) {
final originalUri = response.realUri;
await Future.wait(
locations.map(
(location) => cookieJar.saveFromResponse(
// Resolves the location based on the current Uri.
originalUri.resolve(location),
cookies,
),
),
);
}
}