onResponse method

  1. @override
void onResponse(
  1. Response response,
  2. ResponseInterceptorHandler handler
)
override

Called when the response is about to be resolved.

Implementation

@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
  final compactFormat = NumberFormat.compact().format;

  final method = response.requestOptions.method;
  final uri = response.requestOptions.uri;
  final parameters = response.requestOptions.queryParameters.length;
  final requestBodyLength = switch (response.requestOptions.data) {
    String s => s.length,
    List l => l.length,
    FormData f => f.length,
    Map m => m.length,
    _ => null,
  };

  final requestLog = [
    method,
    "${uri.origin}${uri.path}",
    if (parameters > 0) "$parameters param${parameters != 1 ? 's' : ''}",
    if (requestBodyLength case final l?) "${compactFormat(l)}B",
  ].join(' ');

  final statusCode = response.statusCode;
  final contentType = response.headers
      .value(HttpHeaders.contentTypeHeader)
      ?.split(';')
      .first;
  final contentLengthHeader = response.headers.value(
    HttpHeaders.contentLengthHeader,
  );
  final responseBodyLength =
      int.tryParse(contentLengthHeader ?? '') ??
      switch (response.data) {
        String s => s.length,
        List l => l.length,
        Map m => m.length,
        _ => null,
      };
  final cookies = response.headers[HttpHeaders.setCookieHeader]?.length;

  final responseLog = [
    statusCode,
    if (contentType case final t) t,
    if (responseBodyLength case final l?) '${compactFormat(l)}B',
    if (cookies case final c? when c > 0) "$c cookie${c != 1 ? 's' : ''}",
  ].join(' ');

  final message = "$requestLog => $responseLog";
  log(message, name: 'HTTP');
  firebase.log(message);
  handler.next(response);
}