Both can be set when the URI was parsed earlier from a string or when the caller
sets both. There is never a valid case where these separate fields would yield a
completely different URI. Using the IP when available is necessary to make
sure IPv6 literals are output correctly; don't trust the caller to get it right.