buildRequestDetails function

Future<RequestDetails> buildRequestDetails(
  1. RequestInfo request
)

Implementation

Future<RequestDetails> buildRequestDetails(RequestInfo request) async {
  final uri = request.uri;
  String? ipAddress = await getPublicIP();

  const maskOptions =
      MaskOptions(maskWith: '*', fields: ['authorization'], prefixes: ['x-']);

  final headers = Map.fromEntries(
    request.headers.entries.map((entry) {
      final key = entry.key.toLowerCase();
      final value = entry.value;
      return MapEntry(key, value);
    }),
  );

  dynamic parsedBody;
  if (request.body == null) {
    parsedBody = <String, dynamic>{};
  } else if (request.body.isNotEmpty) {
    final contentType = request.headers['content-type'];
    if (contentType?.contains('application/json') == true) {
      try {
        parsedBody = (json.decode(request.body) as Map<String, dynamic>)
            .map((key, value) => MapEntry(key.toString(), value));
      } catch (e) {
        parsedBody = {'error': 'Invalid JSON format'};
      }
    } else if (contentType?.contains('application/x-www-form-urlencoded') ==
        true) {
      parsedBody = Uri.splitQueryString(request.body);
    } else {
      parsedBody = request.body;
    }
  } else {
    parsedBody = <String, dynamic>{};
  }

  return RequestDetails(
      host: uri.hasPort ? "${uri.host}:${uri.port}" : uri.host,
      headers: maskData(headers, maskOptions),
      userAgent: headers['user-agent'],
      cookies: _extractCookies(request.headers),
      ip: ipAddress,
      requestBody: parsedBody,
      protocol: uri.scheme,
      hostName: uri.host,
      query: uri.queryParameters,
      uaVersionBrand: headers['sec-ch-ua'] ?? '',
      uaMobile: headers['sec-ch-ua-mobile'] ?? '',
      uaPlatform: headers['sec-ch-ua-platform'] ?? '',
      subdomains: uri.host.split('.').reversed.skip(2).toList(),
      reqAcceptEncoding: headers['accept-encoding'],
      reqAcceptLanguage: headers['accept-language'],
      rawHeaders:
          request.headers.entries.map((e) => '${e.key}: ${e.value}').toList(),
      path: uri.path,
      userDetails: UserDetails(
          id: headers['user-id'] ?? '', name: headers['user-name'] ?? ''));
}