saveCookies method

Future<void> saveCookies(
  1. Response response
)

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,
        ),
      ),
    );
  }
}