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 ; } }
Parse the authority component .