close method

  1. @override
Future<HttpClientResponse> close()
override

Close the request for input. Returns the value of done.

Implementation

@override
Future<HttpClientResponse> close() async {
  final response = await _inner.close();

  if (!ApiLogService().isEnabled) return response;

  final sessionId = ApiLogService().currentSessionId ?? 'unknown';
  final logId = const Uuid().v4();
  final url = uri.toString();
  final method = this.method;
  final requestHeaders = <String, String>{};
  headers.forEach((name, values) {
    requestHeaders[name] = values.join(', ');
  });

  final screenName = ScreenTracker().currentScreen;
  final requestBody = _decodeBody(_bodyBytes, headers.contentType);

  return LoggingHttpClientResponse(response, (responseBodyBytes) {
    final endTime = DateTime.now();
    final duration = endTime.difference(_startTime);

    final responseHeaders = <String, String>{};
    response.headers.forEach((name, values) {
      responseHeaders[name] = values.join(', ');
    });

    final responseBody = _decodeBody(
      responseBodyBytes,
      response.headers.contentType,
    );

    final log = ApiLogModel(
      id: logId,
      sessionId: sessionId,
      method: method,
      url: url,
      requestHeaders: requestHeaders,
      requestBody: requestBody,
      responseHeaders: responseHeaders,
      responseBody: responseBody,
      statusCode: response.statusCode,
      timestamp: _startTime,
      duration: duration,
      screenName: screenName,
      isError: response.statusCode >= 400,
    );

    ApiLogService().addLog(log);
  });
}