| Index: components/copresence/rpc/rpc_handler.cc
|
| diff --git a/components/copresence/rpc/rpc_handler.cc b/components/copresence/rpc/rpc_handler.cc
|
| index 78bd95835f1989bb4b3c09dba344cbd407cbdb18..7c751ab11814233f680b7fe7f14c41a574b72917 100644
|
| --- a/components/copresence/rpc/rpc_handler.cc
|
| +++ b/components/copresence/rpc/rpc_handler.cc
|
| @@ -21,7 +21,6 @@
|
|
|
| #include "components/copresence/copresence_switches.h"
|
| #include "components/copresence/handlers/directive_handler.h"
|
| -#include "components/copresence/handlers/gcm_handler.h"
|
| #include "components/copresence/proto/codes.pb.h"
|
| #include "components/copresence/proto/data.pb.h"
|
| #include "components/copresence/proto/rpcs.pb.h"
|
| @@ -39,14 +38,10 @@ using google::protobuf::RepeatedPtrField;
|
|
|
| const char RpcHandler::kReportRequestRpcName[] = "report";
|
|
|
| -namespace {
|
| +// Number of characters of suffix to log for auth tokens
|
| +const int kTokenSuffix = 5;
|
|
|
| -const int kTokenLoggingSuffix = 5;
|
| -const int kInvalidTokenExpiryTimeMs = 10 * 60 * 1000; // 10 minutes.
|
| -const int kMaxInvalidTokens = 10000;
|
| -const char kRegisterDeviceRpcName[] = "registerdevice";
|
| -const char kDefaultCopresenceServer[] =
|
| - "https://www.googleapis.com/copresence/v2/copresence";
|
| +namespace {
|
|
|
| // UrlSafe is defined as:
|
| // '/' represented by a '_' and '+' represented by a '-'
|
| @@ -57,6 +52,11 @@ std::string ToUrlSafe(std::string token) {
|
| return token;
|
| }
|
|
|
| +const int kInvalidTokenExpiryTimeMs = 10 * 60 * 1000; // 10 minutes.
|
| +const int kMaxInvalidTokens = 10000;
|
| +const char kRegisterDeviceRpcName[] = "registerdevice";
|
| +const char kDefaultCopresenceServer[] =
|
| + "https://www.googleapis.com/copresence/v2/copresence";
|
|
|
| // Logging
|
|
|
| @@ -94,16 +94,6 @@ bool ReportErrorLogged(const ReportResponse& response) {
|
| return result;
|
| }
|
|
|
| -const std::string LoggingStrForToken(const std::string& auth_token) {
|
| - if (auth_token.empty())
|
| - return "anonymous";
|
| -
|
| - std::string token_suffix = auth_token.substr(
|
| - auth_token.length() - kTokenLoggingSuffix, kTokenLoggingSuffix);
|
| - return base::StringPrintf("token ...%s", token_suffix.c_str());
|
| -}
|
| -
|
| -
|
| // Request construction
|
| // TODO(ckehoe): Move these into a separate file?
|
|
|
| @@ -159,6 +149,14 @@ void AddTokenToRequest(const AudioToken& token, ReportRequest* request) {
|
| signals->set_observed_time_millis(base::Time::Now().ToJsTime());
|
| }
|
|
|
| +const std::string LoggingStrForToken(const std::string& auth_token) {
|
| + std::string token_str = auth_token.empty() ? "anonymous" :
|
| + base::StringPrintf("token ...%s",
|
| + auth_token.substr(auth_token.length() - kTokenSuffix,
|
| + kTokenSuffix).c_str());
|
| + return token_str;
|
| +}
|
| +
|
| } // namespace
|
|
|
|
|
| @@ -166,33 +164,25 @@ void AddTokenToRequest(const AudioToken& token, ReportRequest* request) {
|
|
|
| RpcHandler::RpcHandler(CopresenceDelegate* delegate,
|
| DirectiveHandler* directive_handler,
|
| - GCMHandler* gcm_handler,
|
| const PostCallback& server_post_callback)
|
| : delegate_(delegate),
|
| directive_handler_(directive_handler),
|
| - gcm_handler_(gcm_handler),
|
| server_post_callback_(server_post_callback),
|
| invalid_audio_token_cache_(
|
| base::TimeDelta::FromMilliseconds(kInvalidTokenExpiryTimeMs),
|
| kMaxInvalidTokens) {
|
| DCHECK(delegate_);
|
| DCHECK(directive_handler_);
|
| - // |gcm_handler_| is optional.
|
|
|
| if (server_post_callback_.is_null()) {
|
| server_post_callback_ =
|
| base::Bind(&RpcHandler::SendHttpPost, base::Unretained(this));
|
| }
|
| -
|
| - if (gcm_handler_) {
|
| - gcm_handler_->GetGcmId(
|
| - base::Bind(&RpcHandler::RegisterGcmId, base::Unretained(this)));
|
| - }
|
| }
|
|
|
| RpcHandler::~RpcHandler() {
|
| - // Do not use |directive_handler_| or |gcm_handler_| here.
|
| - // They will already have been destructed.
|
| + // Do not use |directive_handler_| here.
|
| + // It will already have been destructed.
|
| for (HttpPost* post : pending_posts_)
|
| delete post;
|
| }
|
| @@ -268,8 +258,7 @@ void RpcHandler::ReportTokens(const std::vector<AudioToken>& tokens) {
|
| }
|
| }
|
|
|
| -
|
| -// Private functions.
|
| +// Private methods
|
|
|
| RpcHandler::PendingRequest::PendingRequest(scoped_ptr<ReportRequest> report,
|
| const std::string& app_id,
|
| @@ -286,17 +275,11 @@ void RpcHandler::RegisterForToken(const std::string& auth_token) {
|
| DVLOG(2) << "Sending " << LoggingStrForToken(auth_token)
|
| << " registration to server.";
|
|
|
| - scoped_ptr<RegisterDeviceRequest> request(new RegisterDeviceRequest);
|
| + // Mark registration as in progress.
|
| + device_id_by_auth_token_[auth_token] = "";
|
|
|
| - // Add a GCM ID for authenticated registration, if we have one.
|
| - if (auth_token.empty() || gcm_id_.empty()) {
|
| - request->mutable_push_service()->set_service(PUSH_SERVICE_NONE);
|
| - } else {
|
| - DVLOG(2) << "Registering GCM ID with " << LoggingStrForToken(auth_token);
|
| - request->mutable_push_service()->set_service(GCM);
|
| - request->mutable_push_service()->mutable_gcm_registration()
|
| - ->set_device_token(gcm_id_);
|
| - }
|
| + scoped_ptr<RegisterDeviceRequest> request(new RegisterDeviceRequest);
|
| + request->mutable_push_service()->set_service(PUSH_SERVICE_NONE);
|
|
|
| // Only identify as a Chrome device if we're in anonymous mode.
|
| // Authenticated calls come from a "GAIA device".
|
| @@ -305,28 +288,18 @@ void RpcHandler::RegisterForToken(const std::string& auth_token) {
|
| request->mutable_device_identifiers()->mutable_registrant();
|
| identity->set_type(CHROME);
|
| identity->set_chrome_id(base::GenerateGUID());
|
| -
|
| - // Since we're generating a new "Chrome ID" here,
|
| - // we need to make sure this isn't a duplicate registration.
|
| - DCHECK_EQ(0u, device_id_by_auth_token_.count(std::string()))
|
| - << "Attempted anonymous re-registration";
|
| }
|
|
|
| - bool gcm_pending = !auth_token.empty() && gcm_handler_ && gcm_id_.empty();
|
| SendServerRequest(
|
| kRegisterDeviceRpcName,
|
| - // This will have the side effect of populating an empty device ID
|
| - // for this auth token in the map. This is what we want,
|
| - // to mark registration as being in progress.
|
| - device_id_by_auth_token_[auth_token],
|
| + std::string(), // device ID
|
| std::string(), // app ID
|
| auth_token,
|
| request.Pass(),
|
| base::Bind(&RpcHandler::RegisterResponseHandler,
|
| // On destruction, this request will be cancelled.
|
| base::Unretained(this),
|
| - auth_token,
|
| - gcm_pending));
|
| + auth_token));
|
| }
|
|
|
| void RpcHandler::ProcessQueuedRequests(const std::string& auth_token) {
|
| @@ -370,41 +343,8 @@ void RpcHandler::SendReportRequest(scoped_ptr<ReportRequest> request,
|
| StatusCallback());
|
| }
|
|
|
| -// Store a GCM ID and send it to the server if needed. The constructor passes
|
| -// this callback to the GCMHandler to receive the ID whenever it's ready.
|
| -// It may be returned immediately, if the ID is cached, or require a server
|
| -// round-trip. This ID must then be passed along to the copresence server.
|
| -// There are a few ways this can happen for each auth token:
|
| -//
|
| -// 1. The GCM ID is available when we first register, and is passed along
|
| -// with the RegisterDeviceRequest.
|
| -//
|
| -// 2. The GCM ID becomes available after the RegisterDeviceRequest has
|
| -// completed. Then the loop in this function will invoke RegisterForToken()
|
| -// again to pass on the ID.
|
| -//
|
| -// 3. The GCM ID becomes available after the RegisterDeviceRequest is sent,
|
| -// but before it completes. In this case, the gcm_pending flag is passed
|
| -// through to the RegisterResponseHandler, which invokes RegisterForToken()
|
| -// again to pass on the ID. The loop here must skip pending registrations,
|
| -// as the device ID will be empty.
|
| -//
|
| -// TODO(ckehoe): Add tests for these scenarios.
|
| -void RpcHandler::RegisterGcmId(const std::string& gcm_id) {
|
| - gcm_id_ = gcm_id;
|
| - if (!gcm_id.empty()) {
|
| - for (const auto& registration : device_id_by_auth_token_) {
|
| - const std::string& auth_token = registration.first;
|
| - const std::string& device_id = registration.second;
|
| - if (!auth_token.empty() && !device_id.empty())
|
| - RegisterForToken(auth_token);
|
| - }
|
| - }
|
| -}
|
| -
|
| void RpcHandler::RegisterResponseHandler(
|
| const std::string& auth_token,
|
| - bool gcm_pending,
|
| HttpPost* completed_post,
|
| int http_status_code,
|
| const std::string& response_data) {
|
| @@ -431,10 +371,6 @@ void RpcHandler::RegisterResponseHandler(
|
| device_id_by_auth_token_[auth_token] = device_id;
|
| DVLOG(2) << LoggingStrForToken(auth_token)
|
| << " device registration successful. Id: " << device_id;
|
| -
|
| - // If we have a GCM ID now, and didn't before, pass it on to the server.
|
| - if (gcm_pending && !gcm_id_.empty())
|
| - RegisterForToken(auth_token);
|
| }
|
|
|
| // Send or fail requests on this auth token.
|
| @@ -583,8 +519,7 @@ RequestHeader* RpcHandler::CreateRequestHeader(
|
| CreateVersion(client_name, std::string()));
|
| }
|
| header->set_current_time_millis(base::Time::Now().ToJsTime());
|
| - if (!device_id.empty())
|
| - header->set_registered_device_id(device_id);
|
| + header->set_registered_device_id(device_id);
|
|
|
| DeviceFingerprint* fingerprint = new DeviceFingerprint;
|
| fingerprint->set_platform_version(delegate_->GetPlatformVersionString());
|
|
|