detectWafCdns function
Implementation
List<String> detectWafCdns(Map<String, String>? headers, String? cname) {
final found = <String>{};
try {
if (headers != null) {
final lower = <String, String>{};
for (final e in headers.entries) {
lower[e.key.toLowerCase()] = e.value.toLowerCase();
}
if (lower.containsKey('server') && lower['server']!.contains('vercel')) {
found.add('Vercel');
}
if (lower.containsKey('x-vercel-id')) found.add('Vercel');
if (lower.containsKey('server') &&
lower['server']!.contains('cloudflare')) {
found.add('Cloudflare');
}
if (lower.containsKey('cf-ray') || lower.containsKey('cf-cache-status')) {
found.add('Cloudflare');
}
if (lower.containsKey('server') && lower['server']!.contains('akamai')) {
found.add('Akamai');
}
if (lower.containsKey('via') && lower['via']!.contains('varnish')) {
found.add('Varnish/CDN');
}
if (lower.containsKey('server') && lower['server']!.contains('fastly')) {
found.add('Fastly');
}
if (lower.containsKey('x-amz-cf-id')) found.add('CloudFront');
if (lower.containsKey('x-powered-by') &&
lower['x-powered-by']!.contains('next')) {
found.add('Next.js');
}
}
if (cname != null && cname.isNotEmpty) {
final cn = cname.toLowerCase();
if (cn.endsWith('.vercel.app') || cn.contains('.now.sh')) {
found.add('Vercel');
}
if (cn.endsWith('.cdn.cloudflare.net') || cn.contains('cloudflare')) {
found.add('Cloudflare');
}
if (cn.contains('akamai') || cn.endsWith('.akamaized.net')) {
found.add('Akamai');
}
if (cn.endsWith('.netlify.app') || cn.contains('netlify')) {
found.add('Netlify');
}
if (cn.endsWith('.cloudfront.net')) found.add('CloudFront');
}
} catch (_) {}
return found.toList();
}