{"record":{"id":"8e5cfd4107d67ac5","repo":"XX-net/XX-Net","slug":"dns-query-s-not-valid-type-d","errorCode":null,"errorMessage":"DNS query:%s not valid, type:%d","messagePattern":"DNS query:(.+?) not valid, type:(.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"code/default/smart_router/local/dns_query.py","lineNumber":673,"sourceCode":"    def query_unknown_domain(self, domain, dns_type):\n        res = self.local_dns_resolve.query(domain, dns_type)\n        if res:\n            return res\n\n        return self.parallel_query.query(domain, dns_type, [\n            self.https_query.query,\n            self.tls_query.query,\n            self.tcp_query.query,\n            query_dns_from_xxnet\n        ])\n\n    def query(self, domain, dns_type=1, history=[]):\n        domain = utils.to_bytes(domain)\n        if utils.check_ip_valid(domain):\n            return [domain]\n\n        if not self.is_valid_hostname(domain):\n            xlog.warn(\"DNS query:%s not valid, type:%d\", domain, dns_type)\n            return []\n\n        ips = g.domain_cache.get_ips(domain, dns_type)\n        if ips:\n            return ips\n\n        rule = g.user_rules.check_host(domain, 0)\n        if rule == \"black\":\n            # user define black list like advertisement or malware server.\n            ips = [\"127.0.0.1\"]\n            xlog.debug(\"DNS query:%s in black\", domain)\n            return ips\n\n        elif b\".\" not in domain or g.gfwlist.in_white_list(domain) or rule in [\"direct\"] or g.config.pac_policy == \"all_Direct\":\n            ips = self.local_dns_resolve.query(domain, timeout=1)\n            g.domain_cache.set_ips(domain, ips, dns_type)\n            return ips\n","sourceCodeStart":655,"sourceCodeEnd":691,"githubUrl":"https://github.com/XX-net/XX-Net/blob/cfa5bc17b67676e467f37ec50766127e0ab5f0aa/code/default/smart_router/local/dns_query.py#L655-L691","documentation":"The caller asked to resolve a hostname that failed the is_valid_hostname check (bad characters, wrong label length, or empty), so the resolver refuses to query and returns []. This is input validation, not a network failure.","triggerScenarios":"Calling BaseResolver.query() (or subclass) with a domain containing invalid characters, labels longer than 63 chars, total length over 253, or a malformed name produced by upstream parsing.","commonSituations":"Passing a hostname with underscores or wildcards, a trailing artifact like a null byte, or garbage extracted from a URL/SNI field; some browsers/apps generate names with underscores that strict validators reject.","solutions":["Log/sanitize the domain before querying: strip invalid characters, verify label lengths","Fix the upstream code that produced the malformed hostname (e.g. URL parser)","Relax is_valid_hostname if underscores must be supported for internal names"],"exampleFix":"// before\nips = resolver.query(domain)\n// after\nif not resolver.is_valid_hostname(domain):\n    domain = sanitize(domain)  # strip invalid chars, truncate labels\nips = resolver.query(domain)","handlingStrategy":"validation","validationCode":"def is_queryable(domain):\n    return bool(domain) and len(domain) <= 253 and all(\n        0 < len(l) <= 63 and all(c.isalnum() or c == '-' for c in l)\n        for l in domain.rstrip('.').split('.'))","typeGuard":"def is_valid_domain_name(d: bytes) -> bool:\n    try:\n        name = d.decode('idna') if isinstance(d, bytes) else d\n        return is_queryable(name.lower().strip('.'))\n    except Exception:\n        return False","tryCatchPattern":null,"preventionTips":["Normalize and validate hostnames at the boundary where they enter your system","Never feed raw SNI/URL fragments into the resolver","Strip trailing dots and lowercase before validating"],"tags":["dns","validation","hostname"],"backgroundTag":"invalid-hostname","analyzedSha":"cfa5bc17b67676e467f37ec50766127e0ab5f0aa","analyzedAt":"2026-08-27T19:28:28.225Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}