nsresult nsPACMan::AsyncGetProxyForURI(nsIURI *uri, nsPACManCallback *callback) { NS_ENSURE_STATE(!mShutdown); MaybeReloadPAC(); PendingPACQuery *query = new PendingPACQuery(this, uri, callback); if (!query) return NS_ERROR_OUT_OF_MEMORY; NS_ADDREF(query); PR_APPEND_LINK(query, &mPendingQ); // If we're waiting for the PAC file to load, then delay starting the query. // See OnStreamComplete. However, if this is the PAC URI then query right // away since we know the result will be DIRECT. We could shortcut some code // in this case by issuing the callback directly from here, but that would // require extra code, so we just go through the usual async code path. int isPACURI = IsPACURI(uri); if (IsLoading() && !isPACURI) return NS_OK; nsresult rv = query->Start(isPACURI ? 0 : nsIDNSService::RESOLVE_SPECULATE); if (rv == NS_ERROR_DNS_LOOKUP_QUEUE_FULL && !isPACURI) { query->OnLookupComplete(NULL, NULL, NS_OK); rv = NS_OK; } else if (NS_FAILED(rv)) { NS_WARNING("failed to start PAC query"); PR_REMOVE_LINK(query); NS_RELEASE(query); } return rv; }
nsresult nsPACMan::AsyncGetProxyForURI(nsIURI *uri, nsPACManCallback *callback, bool mainThreadResponse) { MOZ_ASSERT(NS_IsMainThread(), "wrong thread"); if (mShutdown) return NS_ERROR_NOT_AVAILABLE; // Maybe Reload PAC if (!mPACURISpec.IsEmpty() && !mScheduledReload.IsNull() && TimeStamp::Now() > mScheduledReload) { LOG(("nsPACMan::AsyncGetProxyForURI reload as scheduled\n")); LoadPACFromURI(EmptyCString()); } RefPtr<PendingPACQuery> query = new PendingPACQuery(this, uri, callback, mainThreadResponse); if (IsPACURI(uri)) { // deal with this directly instead of queueing it query->Complete(NS_OK, EmptyCString()); return NS_OK; } return mPACThread->Dispatch(query, nsIEventTarget::DISPATCH_NORMAL); }
nsresult nsPACMan::GetProxyForURI(nsIURI *uri, nsACString &result) { NS_ENSURE_STATE(!mShutdown); if (IsPACURI(uri)) { result.Truncate(); return NS_OK; } MaybeReloadPAC(); if (IsLoading()) return NS_ERROR_IN_PROGRESS; if (!mPAC) return NS_ERROR_NOT_AVAILABLE; nsCAutoString spec, host; uri->GetAsciiSpec(spec); uri->GetAsciiHost(host); return mPAC->GetProxyForURI(spec, host, result); }