buildRequestDetails function
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'] ?? ''));
}