docs: 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");
              } else {
                  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
              StringBuffer buf = new StringBuffer();
              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;
          }
      }