NS_IMETHODIMP nsPACMan::OnStreamComplete(nsIStreamLoader *loader, nsISupports *context, nsresult status, uint32_t dataLen, const uint8_t *data) { MOZ_ASSERT(NS_IsMainThread(), "wrong thread"); 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. LOG(("OnStreamComplete: called more than once\n")); if (status == NS_ERROR_ABORT) return NS_OK; } LOG(("OnStreamComplete: entry\n")); if (NS_SUCCEEDED(status) && HttpRequestSucceeded(loader)) { // Get the URI spec used to load this PAC script. nsAutoCString 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); } } // 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; // we have succeeded in loading the pac file using a bunch of interfaces that // are main thread only, unfortunately we have to initialize the instance of // the PAC evaluator (NS_PROXYAUTOCONFIG_CONTRACTID) on the pac thread, because // that is where it will be used. RefPtr<ExecutePACThreadAction> pending = new ExecutePACThreadAction(this); pending->SetupPAC(text, dataLen, pacURI); if (mPACThread) mPACThread->Dispatch(pending, nsIEventTarget::DISPATCH_NORMAL); LOG(("OnStreamComplete: process the PAC contents\n")); // 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. LOG(("OnStreamComplete: unable to load PAC, retry later\n")); OnLoadFailure(); } if (NS_SUCCEEDED(status)) PostProcessPendingQ(); else PostCancelPendingQ(status); 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; }