in src/main/java/org/apache/commons/validator/routines/UrlValidator.java [378:433]
protected boolean isValidAuthority(final String authority) {
if (authority == null) {
return false;
}
// check manual authority validation if specified
if (authorityValidator != null && authorityValidator.isValid(authority)) {
return true;
}
// convert to ASCII if possible
final String authorityASCII = DomainValidator.unicodeToASCII(authority);
final Matcher authorityMatcher = AUTHORITY_PATTERN.matcher(authorityASCII);
if (!authorityMatcher.matches()) {
return false;
}
// We have to process IPV6 separately because that is parsed in a different group
final String ipv6 = authorityMatcher.group(PARSE_AUTHORITY_IPV6);
if (ipv6 != null) {
final InetAddressValidator inetAddressValidator = InetAddressValidator.getInstance();
if (!inetAddressValidator.isValidInet6Address(ipv6)) {
return false;
}
} else {
final String hostLocation = authorityMatcher.group(PARSE_AUTHORITY_HOST_IP);
// check if authority is hostname or IP address:
// try a hostname first since that's much more likely
if (!this.domainValidator.isValid(hostLocation)) {
// try an IPv4 address
final InetAddressValidator inetAddressValidator = InetAddressValidator.getInstance();
if (!inetAddressValidator.isValidInet4Address(hostLocation)) {
// isn't IPv4, so the URL is invalid
return false;
}
}
final String port = authorityMatcher.group(PARSE_AUTHORITY_PORT);
if (port != null && !port.isEmpty()) {
try {
final int iPort = Integer.parseInt(port);
if (iPort < 0 || iPort > MAX_UNSIGNED_16_BIT_INT) {
return false;
}
} catch (final NumberFormatException nfe) {
return false; // this can happen for big numbers
}
}
}
final String extra = authorityMatcher.group(PARSE_AUTHORITY_EXTRA);
if (extra != null && !extra.trim().isEmpty()){
return false;
}
return true;
}