Index: chromecast/net/connectivity_checker_impl.cc |
diff --git a/chromecast/net/connectivity_checker_impl.cc b/chromecast/net/connectivity_checker_impl.cc |
index d10d06a13f40de64aba74f9586ab203f8b48febc..7d302b4629ceb36bde24a0691e26a0e4d6a4223a 100644 |
--- a/chromecast/net/connectivity_checker_impl.cc |
+++ b/chromecast/net/connectivity_checker_impl.cc |
@@ -28,6 +28,9 @@ const unsigned int kConnectivityPeriodSeconds = 1; |
// to offline. |
const unsigned int kNumErrorsToNotifyOffline = 3; |
+// Request timeout value in seconds. |
+const unsigned int kRequestTimeoutInSeconds = 3; |
+ |
// Default url for connectivity checking. |
const char kDefaultConnectivityCheckUrl[] = |
"https://clients3.google.com/generate_204"; |
@@ -106,6 +109,13 @@ void ConnectivityCheckerImpl::Check() { |
*connectivity_check_url_, net::MAXIMUM_PRIORITY, this); |
url_request_->set_method("HEAD"); |
url_request_->Start(); |
+ |
+ timeout_.Reset(base::Bind(&ConnectivityCheckerImpl::OnUrlRequestTimeout, |
+ this)); |
+ base::MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, |
+ timeout_.callback(), |
+ base::TimeDelta::FromSeconds(kRequestTimeoutInSeconds)); |
} |
void ConnectivityCheckerImpl::OnNetworkChanged( |
@@ -122,6 +132,7 @@ void ConnectivityCheckerImpl::OnNetworkChanged( |
} |
void ConnectivityCheckerImpl::OnResponseStarted(net::URLRequest* request) { |
+ timeout_.Cancel(); |
int http_response_code = |
(request->status().is_success() && |
request->response_info().headers.get() != NULL) |
@@ -141,11 +152,17 @@ void ConnectivityCheckerImpl::OnResponseStarted(net::URLRequest* request) { |
OnUrlRequestError(); |
} |
+void ConnectivityCheckerImpl::OnReadCompleted(net::URLRequest* request, |
+ int bytes_read) { |
+ NOTREACHED(); |
+} |
+ |
void ConnectivityCheckerImpl::OnSSLCertificateError( |
net::URLRequest* request, |
const net::SSLInfo& ssl_info, |
bool fatal) { |
LOG(ERROR) << "OnSSLCertificateError"; |
+ timeout_.Cancel(); |
OnUrlRequestError(); |
} |
@@ -162,16 +179,17 @@ void ConnectivityCheckerImpl::OnUrlRequestError() { |
base::TimeDelta::FromSeconds(kConnectivityPeriodSeconds)); |
} |
-void ConnectivityCheckerImpl::OnReadCompleted(net::URLRequest* request, |
- int bytes_read) { |
- NOTREACHED(); |
+void ConnectivityCheckerImpl::OnUrlRequestTimeout() { |
+ LOG(ERROR) << "time out"; |
+ OnUrlRequestError(); |
} |
void ConnectivityCheckerImpl::Cancel() { |
- if (url_request_.get()) { |
- VLOG(2) << "Cancel connectivity check in progress"; |
- url_request_.reset(NULL); // URLRequest::Cancel() is called in destructor. |
- } |
+ if (!url_request_.get()) |
+ return; |
+ VLOG(2) << "Cancel connectivity check in progress"; |
+ timeout_.Cancel(); |
+ url_request_.reset(NULL); // URLRequest::Cancel() is called in destructor. |
} |
} // namespace chromecast |