NS_IMETHODIMP nsAuthURLParser::ParseAuthority(const char *auth, PRInt32 authLen, PRUint32 *usernamePos, PRInt32 *usernameLen, PRUint32 *passwordPos, PRInt32 *passwordLen, PRUint32 *hostnamePos, PRInt32 *hostnameLen, PRInt32 *port) { nsresult rv; NS_PRECONDITION(auth, "null pointer"); if (authLen < 0) authLen = strlen(auth); if (authLen == 0) { SET_RESULT(username, 0, -1); SET_RESULT(password, 0, -1); SET_RESULT(hostname, 0, 0); if (port) *port = -1; return NS_OK; } // search backwards for @ const char *p = auth + authLen - 1; for (; (*p != '@') && (p > auth); --p); if ( *p == '@' ) { // auth = <user-info@server-info> rv = ParseUserInfo(auth, p - auth, usernamePos, usernameLen, passwordPos, passwordLen); if (NS_FAILED(rv)) return rv; rv = ParseServerInfo(p + 1, authLen - (p - auth + 1), hostnamePos, hostnameLen, port); if (NS_FAILED(rv)) return rv; OFFSET_RESULT(hostname, p + 1 - auth); } else { // auth = <server-info> SET_RESULT(username, 0, -1); SET_RESULT(password, 0, -1); rv = ParseServerInfo(auth, authLen, hostnamePos, hostnameLen, port); if (NS_FAILED(rv)) return rv; } return NS_OK; }
const char* wxURI::ParseAuthority(const char* uri) { // authority = [ userinfo "@" ] host [ ":" port ] if ( uri[0] == '/' && uri[1] == '/' ) { //skip past the two slashes uri += 2; // ############# DEVIATION FROM RFC ######################### // Don't parse the server component for file URIs if(m_scheme != "file") { //normal way uri = ParseUserInfo(uri); uri = ParseServer(uri); return ParsePort(uri); } } return uri; }