in src/main/java/org/apache/commons/validator/UrlValidator.java [293:372]
protected boolean isValidAuthority(final String authority) {
if (authority == null) {
return false;
}
final InetAddressValidator inetAddressValidator =
InetAddressValidator.getInstance();
final Matcher authorityMatcher = AUTHORITY_PATTERN.matcher(authority);
if (!authorityMatcher.matches()) {
return false;
}
boolean hostname = false;
// check if authority is IP address or hostname
String hostIP = authorityMatcher.group(PARSE_AUTHORITY_HOST_IP);
final boolean ipV4Address = inetAddressValidator.isValid(hostIP);
if (!ipV4Address) {
// Domain is hostname name
hostname = DOMAIN_PATTERN.matcher(hostIP).matches();
}
//rightmost hostname will never start with a digit.
if (hostname) {
// LOW-TECH FIX FOR VALIDATOR-202
// TODO: Rewrite to use ArrayList and .add semantics: see VALIDATOR-203
final char[] chars = hostIP.toCharArray();
int size = 1;
for (final char element : chars) {
if (element == '.') {
size++;
}
}
final String[] domainSegment = new String[size];
boolean match = true;
int segmentCount = 0;
int segmentLength = 0;
while (match) {
final Matcher atomMatcher = ATOM_PATTERN.matcher(hostIP);
match = atomMatcher.matches();
if (match) {
domainSegment[segmentCount] = atomMatcher.group(1);
segmentLength = domainSegment[segmentCount].length() + 1;
hostIP =
segmentLength >= hostIP.length()
? ""
: hostIP.substring(segmentLength);
segmentCount++;
}
}
final String topLevel = domainSegment[segmentCount - 1];
// First letter of top level must be an alpha
// Make sure there's a host name preceding the authority.
if (topLevel.length() < TOP_LEVEL_MIN_LEN || topLevel.length() > TOP_LEVEL_MAX_LEN || !ALPHA_PATTERN.matcher(topLevel.substring(0, 1)).matches()
|| segmentCount < 2) {
return false;
}
}
if (!hostname && !ipV4Address) {
return false;
}
final String port = authorityMatcher.group(PARSE_AUTHORITY_PORT);
if (port != null && !PORT_PATTERN.matcher(port).matches()) {
return false;
}
final String extra = authorityMatcher.group(PARSE_AUTHORITY_EXTRA);
if (!GenericValidator.isBlankOrNull(extra)) {
return false;
}
return true;
}