aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2016-05-11 22:37:05 -0700
committerGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2016-05-11 22:37:13 -0700
commit5c856703c1a1683fd5494e7e584bd214bcc3990a (patch)
treec4f87cb5de05c93e021cd9aa661f8498b76339ea
parent459d616efb48ecb2c157fecfb88e92a876db893d (diff)
Timeout for MX DNS request
-rw-r--r--src/core/provider/MCAccountValidator.cpp35
-rw-r--r--src/core/provider/MCAccountValidator.h1
2 files changed, 31 insertions, 5 deletions
diff --git a/src/core/provider/MCAccountValidator.cpp b/src/core/provider/MCAccountValidator.cpp
index 3c77e989..71fd1fd3 100644
--- a/src/core/provider/MCAccountValidator.cpp
+++ b/src/core/provider/MCAccountValidator.cpp
@@ -139,13 +139,24 @@ void AccountValidator::cancel()
if (mQueue != NULL)
mQueue->cancelAllOperations();
+ cancelDelayedPerformMethod((Object::Method) &AccountValidator::resolveMXTimeout, NULL);
+
MC_SAFE_RELEASE(mOperation);
MC_SAFE_RELEASE(mResolveMX);
MC_SAFE_RELEASE(mQueue);
- MC_SAFE_RELEASE(mImapSession);
- MC_SAFE_RELEASE(mPopSession);
- MC_SAFE_RELEASE(mSmtpSession);
-
+ if (mImapSession != NULL) {
+ mImapSession->setConnectionLogger(NULL);
+ MC_SAFE_RELEASE(mImapSession);
+ }
+ if (mPopSession != NULL) {
+ mPopSession->setConnectionLogger(NULL);
+ MC_SAFE_RELEASE(mPopSession);
+ }
+ if (mSmtpSession != NULL) {
+ mSmtpSession->setConnectionLogger(NULL);
+ MC_SAFE_RELEASE(mSmtpSession);
+ }
+
Operation::cancel();
}
@@ -166,6 +177,8 @@ void AccountValidator::resolveMX()
components = mUsername->componentsSeparatedByString(MCSTR("@"));
if (components->count() >= 2) {
+ performMethodAfterDelay((Object::Method) &AccountValidator::resolveMXTimeout, NULL, 30.0);
+
domain = (String *) components->lastObject();
mResolveMX = new MXRecordResolverOperation();
mResolveMX->setHostname(domain);
@@ -183,9 +196,21 @@ void AccountValidator::resolveMX()
}
}
+void AccountValidator::resolveMXTimeout(void * context)
+{
+ mResolveMX->cancel();
+ MC_SAFE_RELEASE(mResolveMX);
+ resolveMXDone();
+}
+
void AccountValidator::resolveMXDone()
{
- Array * mxRecords = mResolveMX->mxRecords();
+ cancelDelayedPerformMethod((Object::Method) &AccountValidator::resolveMXTimeout, NULL);
+
+ Array * mxRecords = NULL;
+ if (mResolveMX != NULL) {
+ mxRecords = mResolveMX->mxRecords();
+ }
mc_foreacharray(String, mxRecord, mxRecords) {
MailProvider * provider = MailProvidersManager::sharedManager()->providerForMX(mxRecord);
diff --git a/src/core/provider/MCAccountValidator.h b/src/core/provider/MCAccountValidator.h
index 7029870f..a1d6299f 100644
--- a/src/core/provider/MCAccountValidator.h
+++ b/src/core/provider/MCAccountValidator.h
@@ -119,6 +119,7 @@ namespace mailcore {
void setupServices();
void resolveMX();
void resolveMXDone();
+ void resolveMXTimeout(void * context);
void startCheckingHosts();
void checkNextHost();
void checkNextHostDone();