in src/main/java/org/apache/sling/resourceresolver/impl/helper/URI.java [2260:2348]
protected void parseAuthority(String original, boolean escaped) throws URIException {
// Reset flags
_is_reg_name = _is_server = _is_hostname = _is_IPv4address = _is_IPv6reference = false;
// set the charset to do escape encoding
String charset = getProtocolCharset();
boolean hasPort = true;
int from = 0;
int next = original.indexOf('@');
if (next != -1) { // neither -1 and 0
// each protocol extented from URI supports the specific userinfo
_userinfo = (escaped)
? original.substring(0, next).toCharArray()
: encode(original.substring(0, next), allowed_userinfo, charset);
from = next + 1;
}
next = original.indexOf('[', from);
if (next >= from) {
next = original.indexOf(']', from);
if (next == -1) {
throw new URIException(URIException.PARSING, "IPv6reference");
}
next++;
// In IPv6reference, '[', ']' should be excluded
_host = (escaped)
? original.substring(from, next).toCharArray()
: encode(original.substring(from, next), allowed_IPv6reference, charset);
// Set flag
_is_IPv6reference = true;
} else { // only for !_is_IPv6reference
next = original.indexOf(':', from);
if (next == -1) {
next = original.length();
hasPort = false;
}
// REMINDME: it doesn't need the pre-validation
_host = original.substring(from, next).toCharArray();
if (validate(_host, IPv4address)) {
// Set flag
_is_IPv4address = true;
} else if (validate(_host, hostname)) {
// Set flag
_is_hostname = true;
} else {
// Set flag
_is_reg_name = true;
}
}
if (_is_reg_name) {
// Reset flags for a server-based naming authority
_is_server = _is_hostname = _is_IPv4address = _is_IPv6reference = false;
// set a registry-based naming authority
if (escaped) {
_authority = original.toCharArray();
if (!validate(_authority, reg_name)) {
throw new URIException("Invalid authority");
}
} else {
_authority = encode(original, allowed_reg_name, charset);
}
} else {
if (original.length() - 1 > next && hasPort && original.charAt(next) == ':') { // not empty
from = next + 1;
try {
_port = Integer.parseInt(original.substring(from));
} catch (NumberFormatException error) {
throw new URIException(URIException.PARSING, "invalid port number");
}
}
// set a server-based naming authority
StringBuilder buf = new StringBuilder();
if (_userinfo != null) { // has_userinfo
buf.append(_userinfo);
buf.append('@');
}
if (_host != null) {
buf.append(_host);
if (_port != -1) {
buf.append(':');
buf.append(_port);
}
}
_authority = buf.toString().toCharArray();
// Set flag
_is_server = true;
}
}