parseDomain static method
Parse the given domainName
to a Domain object.
Returns null if the given domainName
is not parsable.
Implementation
static Domain? parseDomain(String domainName) {
domainName = domainName.trim();
if (domainName.endsWith('.')) {
domainName = domainName.substring(0, domainName.length - 1);
}
if (domainName.startsWith('.')) {
domainName = domainName.substring(1, domainName.length);
}
if (!domainName.contains('.')) {
return null;
}
var tld = domainName.substring(
domainName.lastIndexOf('.') + 1, domainName.length);
var leftPart = _getLeftPart(domainName, tld);
// Check if we have a left part
if (StringUtils.isNullOrEmpty(leftPart)) {
return null;
}
// Check if suffix list contains tld
if (!suffixList.containsKey(tld)) {
return null;
}
// Fetch subTLDs from the suffix list
var subTLDs = suffixList[tld];
if (subTLDs == null || subTLDs.isEmpty) {
// No subTLDs for the given tld, build the domain
return Domain(sld: _trimToLastLabel(leftPart), tld: tld);
} else {
// Iterate over each subTLD
for (var subTldEntry in subTLDs) {
// Remove uncommon chars
subTldEntry = _removeUncommonChars(subTldEntry);
if (domainName.endsWith('.' + subTldEntry + '.' + tld)) {
var labelCount = 0;
// Calculate the allowedLabels
if (subTldEntry == '*') {
// *.de means that label1.label2.de is allowed
labelCount = 3;
} else {
labelCount = subTldEntry.split('.').length + 2;
}
var leftPt = '';
if (domainName.length > (subTldEntry + '.' + tld).length) {
leftPt = _getLeftPart(domainName, subTldEntry + '.' + tld);
// Calculate the amount of labels in the right part: 1 (tld) + subTld length
var rightPartLabels = 1 + subTldEntry.split('.').length;
// Calculate the allowed amount of labels in the left part
var leftPartLabelsAllowed = labelCount - rightPartLabels;
var cuttingIndex = leftPt.indexOf('.', leftPartLabelsAllowed - 1);
String sld;
if (cuttingIndex >= 0) {
sld = leftPt.substring(cuttingIndex + 1);
} else {
sld = leftPt;
}
return Domain(sld: sld, subTld: subTldEntry, tld: tld);
}
return Domain(sld: subTldEntry, tld: tld);
} else if (subTldEntry.contains('*')) {
var left = _getLeftPart(domainName, tld);
var count = left.split('.').length;
if (count > 2) {
left = left.substring(left.indexOf('.', (count - 2) - 1) + 1);
if (left.split('.').length > 1) {
var sld = left.split('.')[0];
var subTld = left.substring(sld.length + 1);
return Domain(sld: sld, subTld: subTld, tld: tld);
} else {
return Domain(sld: left, tld: tld);
}
} else {
return Domain(sld: left, tld: tld);
}
}
}
// No subTld from the suffix list matches
return Domain(sld: _trimToLastLabel(leftPart), tld: tld);
}
}