nsresult nsUrlClassifierStreamUpdater::FetchNext() { if (mPendingUpdates.Length() == 0) { return NS_OK; } PendingUpdate &update = mPendingUpdates[0]; LOG(("Fetching update url: %s\n", update.mUrl.get())); nsresult rv = FetchUpdate(update.mUrl, EmptyCString(), update.mTable); if (NS_FAILED(rv)) { LOG(("Error fetching update url: %s\n", update.mUrl.get())); // We can commit the urls that we've applied so far. This is // probably a transient server problem, so trigger backoff. mDownloadErrorCallback->HandleEvent(EmptyCString()); mDownloadError = true; mDBService->FinishUpdate(); return rv; } mPendingUpdates.RemoveElementAt(0); return NS_OK; }
nsresult nsUrlClassifierStreamUpdater::FetchUpdate(const nsACString & aUpdateUrl, const nsACString & aRequestBody, const nsACString & aStreamTable, const nsACString & aServerMAC) { nsCOMPtr<nsIURI> uri; nsresult rv = NS_NewURI(getter_AddRefs(uri), aUpdateUrl); NS_ENSURE_SUCCESS(rv, rv); LOG(("Fetching update from %s\n", PromiseFlatCString(aUpdateUrl).get())); return FetchUpdate(uri, aRequestBody, aStreamTable, aServerMAC); }
void UpdateEntity::Start(void* h) { svy::CHttpClient http; //使用第一个参数连接服务器 NetConfig::SERVICE netcfg = mNetCfg_.mSvrs[0]; CString a(netcfg.ip); a += _T(":") + svy::strFormat(_T("%d"),netcfg.port); a = svy::catUrl(a, netcfg.act); a.Replace('\\','/'); http.AddHeader(_T("SENDER"),_T("SERVYOU001")); http.AddHeader(_T("ZCBM"), _T("")); http.AddHeader(_T("SWJG_DM"), _T("19901000000")); http.AddHeader(_T("JKVERSION"), _T("V1.0.055")); http.AddHeader(_T("ACTIONCODE"), _T("5002")); http.AddHeader(_T("HAS_BODY"), _T("1")); http.AddHeader(_T("IS_CRYPT"), _T("0")); http.AddHeader(_T("IS_COMPRESS"), _T("0")); http.AddHeader(_T("RESERVE_HEAD"), _T("tdp")); http.AddHeader(_T("CREATE_DATE"), CTime::GetCurrentTime().Format(_T("%Y/%m/%d"))); http.SetAgent(_T("Mozilla/3.0 (compatible; Indy Library)")); std::string f = BuildBody(BUILD_XML_FILE); http.AddParam("file0", f, svy::CHttpClient::ParamFile); http.EnableWriteHeader(true); http.PerformParam(a); long hCode = svy::CHttpClient::PerformUrl(http.GetCURL()); //上传结束后删除文件 ::DeleteFileA(f.c_str()); if (hCode != 200) { CString msg = svy::strFormat(_T("%s failed %d"),a, hCode); LOG_FILE(svy::Log::L_ERROR,msg); return; } std::string result = http.GetHeader(); //留下罪证 LOG_FILE(svy::Log::L_INFO,(LPCTSTR)CA2CT(result.c_str()) ); //解析返回的数据 result = http.GetStream(); if (!result.size()) { LOG_FILE(svy::Log::L_INFO,_T("缺少body数据")); return; } FetchUpdate(result); }
nsresult nsUrlClassifierStreamUpdater::FetchUpdate(const nsACString & aUpdateUrl, const nsACString & aRequestBody, const nsACString & aStreamTable) { LOG(("(pre) Fetching update from %s\n", PromiseFlatCString(aUpdateUrl).get())); nsCOMPtr<nsIURI> uri; nsresult rv = NS_NewURI(getter_AddRefs(uri), aUpdateUrl); NS_ENSURE_SUCCESS(rv, rv); nsAutoCString urlSpec; uri->GetAsciiSpec(urlSpec); LOG(("(post) Fetching update from %s\n", urlSpec.get())); return FetchUpdate(uri, aRequestBody, aStreamTable); }
NS_IMETHODIMP nsUrlClassifierStreamUpdater::DownloadUpdates( const nsACString &aRequestTables, const nsACString &aRequestBody, const nsACString &aUpdateUrl, nsIUrlClassifierCallback *aSuccessCallback, nsIUrlClassifierCallback *aUpdateErrorCallback, nsIUrlClassifierCallback *aDownloadErrorCallback, bool *_retval) { NS_ENSURE_ARG(aSuccessCallback); NS_ENSURE_ARG(aUpdateErrorCallback); NS_ENSURE_ARG(aDownloadErrorCallback); if (mIsUpdating) { LOG(("Already updating, queueing update %s from %s", aRequestBody.Data(), aUpdateUrl.Data())); *_retval = false; PendingRequest *request = mPendingRequests.AppendElement(); request->mTables = aRequestTables; request->mRequest = aRequestBody; request->mUrl = aUpdateUrl; request->mSuccessCallback = aSuccessCallback; request->mUpdateErrorCallback = aUpdateErrorCallback; request->mDownloadErrorCallback = aDownloadErrorCallback; return NS_OK; } if (aUpdateUrl.IsEmpty()) { NS_ERROR("updateUrl not set"); return NS_ERROR_NOT_INITIALIZED; } nsresult rv; if (!mInitialized) { // Add an observer for shutdown so we can cancel any pending list // downloads. quit-application is the same event that the download // manager listens for and uses to cancel pending downloads. nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService(); if (!observerService) return NS_ERROR_FAILURE; observerService->AddObserver(this, gQuitApplicationMessage, false); mDBService = do_GetService(NS_URLCLASSIFIERDBSERVICE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); mInitialized = true; } rv = mDBService->BeginUpdate(this, aRequestTables); if (rv == NS_ERROR_NOT_AVAILABLE) { LOG(("Service busy, already updating, queuing update %s from %s", aRequestBody.Data(), aUpdateUrl.Data())); *_retval = false; PendingRequest *request = mPendingRequests.AppendElement(); request->mTables = aRequestTables; request->mRequest = aRequestBody; request->mUrl = aUpdateUrl; request->mSuccessCallback = aSuccessCallback; request->mUpdateErrorCallback = aUpdateErrorCallback; request->mDownloadErrorCallback = aDownloadErrorCallback; return NS_OK; } if (NS_FAILED(rv)) { return rv; } mSuccessCallback = aSuccessCallback; mUpdateErrorCallback = aUpdateErrorCallback; mDownloadErrorCallback = aDownloadErrorCallback; mIsUpdating = true; *_retval = true; LOG(("FetchUpdate: %s", aUpdateUrl.Data())); //LOG(("requestBody: %s", aRequestBody.Data())); return FetchUpdate(aUpdateUrl, aRequestBody, EmptyCString()); }
NS_IMETHODIMP nsUrlClassifierStreamUpdater::DownloadUpdates( const nsACString &aRequestTables, const nsACString &aRequestBody, const nsACString &aClientKey, nsIUrlClassifierCallback *aSuccessCallback, nsIUrlClassifierCallback *aUpdateErrorCallback, nsIUrlClassifierCallback *aDownloadErrorCallback, bool *_retval) { NS_ENSURE_ARG(aSuccessCallback); NS_ENSURE_ARG(aUpdateErrorCallback); NS_ENSURE_ARG(aDownloadErrorCallback); if (mIsUpdating) { LOG(("already updating, skipping update")); *_retval = false; return NS_OK; } if (!mUpdateUrl) { NS_ERROR("updateUrl not set"); return NS_ERROR_NOT_INITIALIZED; } nsresult rv; if (!mInitialized) { // Add an observer for shutdown so we can cancel any pending list // downloads. quit-application is the same event that the download // manager listens for and uses to cancel pending downloads. nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService(); if (!observerService) return NS_ERROR_FAILURE; observerService->AddObserver(this, gQuitApplicationMessage, false); mDBService = do_GetService(NS_URLCLASSIFIERDBSERVICE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); mInitialized = true; } rv = mDBService->BeginUpdate(this, aRequestTables, aClientKey); if (rv == NS_ERROR_NOT_AVAILABLE) { LOG(("already updating, skipping update")); *_retval = false; return NS_OK; } else if (NS_FAILED(rv)) { return rv; } mSuccessCallback = aSuccessCallback; mUpdateErrorCallback = aUpdateErrorCallback; mDownloadErrorCallback = aDownloadErrorCallback; mIsUpdating = true; *_retval = true; nsAutoCString urlSpec; mUpdateUrl->GetAsciiSpec(urlSpec); LOG(("FetchUpdate: %s", urlSpec.get())); //LOG(("requestBody: %s", aRequestBody.Data())); LOG(("Calling into FetchUpdate")); return FetchUpdate(mUpdateUrl, aRequestBody, EmptyCString(), EmptyCString()); }