parseDomain static method

Domain? parseDomain(
  1. String domainName
)

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);
  }
}