void nsPACMan::StartLoading() { mLoadPending = false; // CancelExistingLoad was called... if (!mLoader) { ProcessPendingQ(NS_ERROR_ABORT); return; } if (NS_SUCCEEDED(mLoader->Init(this))) { // Always hit the origin server when loading PAC. nsCOMPtr<nsIIOService> ios = do_GetIOService(); if (ios) { nsCOMPtr<nsIChannel> channel; // NOTE: This results in GetProxyForURI being called ios->NewChannelFromURI(mPACURI, getter_AddRefs(channel)); if (channel) { channel->SetLoadFlags(nsIRequest::LOAD_BYPASS_CACHE); channel->SetNotificationCallbacks(this); if (NS_SUCCEEDED(channel->AsyncOpen(mLoader, nsnull))) return; } } } CancelExistingLoad(); ProcessPendingQ(NS_ERROR_UNEXPECTED); }
void nsPACMan::Shutdown() { CancelExistingLoad(); ProcessPendingQ(NS_ERROR_ABORT); mPAC = nsnull; mShutdown = true; }
nsresult nsPACMan::PostQuery(PendingPACQuery *query) { MOZ_ASSERT(!NS_IsMainThread(), "wrong thread"); if (mShutdown) { query->Complete(NS_ERROR_NOT_AVAILABLE, EmptyCString()); return NS_OK; } // add a reference to the query while it is in the pending list RefPtr<PendingPACQuery> addref(query); mPendingQ.insertBack(addref.forget().take()); ProcessPendingQ(); return NS_OK; }
NS_IMETHODIMP nsPACMan::OnStreamComplete(nsIStreamLoader *loader, nsISupports *context, nsresult status, PRUint32 dataLen, const PRUint8 *data) { if (mLoader != loader) { // If this happens, then it means that LoadPACFromURI was called more // than once before the initial call completed. In this case, status // should be NS_ERROR_ABORT, and if so, then we know that we can and // should delay any processing. if (status == NS_ERROR_ABORT) return NS_OK; } mLoader = nsnull; if (NS_SUCCEEDED(status) && HttpRequestSucceeded(loader)) { // Get the URI spec used to load this PAC script. nsCAutoString pacURI; { nsCOMPtr<nsIRequest> request; loader->GetRequest(getter_AddRefs(request)); nsCOMPtr<nsIChannel> channel = do_QueryInterface(request); if (channel) { nsCOMPtr<nsIURI> uri; channel->GetURI(getter_AddRefs(uri)); if (uri) uri->GetAsciiSpec(pacURI); } } if (!mPAC) { mPAC = do_CreateInstance(NS_PROXYAUTOCONFIG_CONTRACTID, &status); if (!mPAC) NS_WARNING("failed to instantiate PAC component"); } if (NS_SUCCEEDED(status)) { // We assume that the PAC text is ASCII (or ISO-Latin-1). We've had this // assumption forever, and some real-world PAC scripts actually have some // non-ASCII text in comment blocks (see bug 296163). const char *text = (const char *) data; status = mPAC->Init(pacURI, NS_ConvertASCIItoUTF16(text, dataLen)); } // Even if the PAC file could not be parsed, we did succeed in loading the // data for it. mLoadFailureCount = 0; } else { // We were unable to load the PAC file (presumably because of a network // failure). Try again a little later. OnLoadFailure(); } // Reset mPAC if necessary if (mPAC && NS_FAILED(status)) mPAC = nsnull; ProcessPendingQ(status); return NS_OK; }