Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2844)

Unified Diff: chrome/browser/component_updater/component_updater_ping_manager.cc

Issue 18516010: Implemented completion pings for component updates. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/component_updater/component_updater_ping_manager.cc
diff --git a/chrome/browser/component_updater/component_updater_ping_manager.cc b/chrome/browser/component_updater/component_updater_ping_manager.cc
new file mode 100644
index 0000000000000000000000000000000000000000..2a50b5418c480d348970482956bc40e8b83793cc
--- /dev/null
+++ b/chrome/browser/component_updater/component_updater_ping_manager.cc
@@ -0,0 +1,170 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/component_updater/component_updater_ping_manager.h"
+#include "base/guid.h"
+#include "base/logging.h"
+#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
+#include "base/sys_info.h"
+#include "base/win/windows_version.h"
+#include "chrome/browser/component_updater/crx_update_item.h"
+#include "chrome/common/chrome_version_info.h"
+#include "chrome/common/omaha_query_params/omaha_query_params.h"
+#include "net/base/load_flags.h"
+#include "net/base/net_errors.h"
+#include "net/url_request/url_fetcher.h"
+#include "net/url_request/url_fetcher_delegate.h"
+#include "net/url_request/url_request_status.h"
+
+namespace {
+
+// Returns true if the |update_item| contains a valid differential update url.
+bool HasDiffUpdate(const CrxUpdateItem* update_item) {
+ return update_item->diff_crx_url.is_valid();
+}
+
+} // namespace
+
+namespace component_updater {
+
+// Sends a fire and forget ping. The instances of this class have no
+// ownership and they self-delete upon completion.
+class PingSender : public net::URLFetcherDelegate {
+ public:
+ PingSender();
+
+ void SendPing(const GURL& ping_url,
+ net::URLRequestContextGetter* url_request_context_getter,
+ const CrxUpdateItem* item);
+ private:
+ virtual ~PingSender();
+
+ // Overrides for URLFetcherDelegate.
+ virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
+
+ static std::string BuildPing(const CrxUpdateItem* item);
+ static std::string BuildPingEventElement(const CrxUpdateItem* item);
+
+ scoped_ptr<net::URLFetcher> url_fetcher_;
+
+ DISALLOW_COPY_AND_ASSIGN(PingSender);
+};
+
+PingSender::PingSender() {}
+
+PingSender::~PingSender() {}
+
+void PingSender::OnURLFetchComplete(const net::URLFetcher* source) {
+ delete this;
+}
+
+void PingSender::SendPing(
+ const GURL& ping_url,
+ net::URLRequestContextGetter* url_request_context_getter,
+ const CrxUpdateItem* item) {
+ DCHECK(item);
+
+ if (!ping_url.is_valid())
+ return;
+
+ url_fetcher_.reset(net::URLFetcher::Create(0,
+ ping_url,
+ net::URLFetcher::POST,
+ this));
+
+ url_fetcher_->SetUploadData("application/xml", BuildPing(item));
+ url_fetcher_->SetRequestContext(url_request_context_getter);
+ url_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
+ net::LOAD_DO_NOT_SAVE_COOKIES |
+ net::LOAD_DISABLE_CACHE);
+ url_fetcher_->SetAutomaticallyRetryOn5xx(false);
+ url_fetcher_->Start();
+}
+
+// Builds a ping message for the specified update item.
+std::string PingSender::BuildPing(const CrxUpdateItem* item) {
+ const std::string prod_id(chrome::OmahaQueryParams::GetProdIdString(
+ chrome::OmahaQueryParams::CHROME));
+
+ const char response_format[] =
+ "<o:gupdate xmlns:o=\"http://www.google.com/update2/request\" "
+ "protocol=\"2.0\" version=\"%s-%s\" requestid=\"{%s}\"> "
+ "<o:os platform=\"%s\" version=\"%s\"/> "
+ "<o:app appid=\"%s\" version=\"%s\">"
+ "%s"
+ "</o:app></o:gupdate>";
+ const std::string response(
+ base::StringPrintf(response_format,
+ prod_id.c_str(),
+ chrome::VersionInfo().Version().c_str(),
+ base::GenerateGUID().c_str(),
+ chrome::VersionInfo().OSType().c_str(),
+ base::SysInfo().OperatingSystemVersion().c_str(),
+ item->id.c_str(),
+ item->component.version.GetString().c_str(),
+ BuildPingEventElement(item).c_str()));
+ return response;
+}
+
+// Returns a string representing one ping event xml element for an update item.
+std::string PingSender::BuildPingEventElement(const CrxUpdateItem* item) {
+ DCHECK(item->status == CrxUpdateItem::kNoUpdate ||
+ item->status == CrxUpdateItem::kUpdated);
+
+ using base::StringAppendF;
+
+ std::string ping_event("<o:event eventtype=\"3\"");
+ const int event_result = item->status == CrxUpdateItem::kUpdated;
+ StringAppendF(&ping_event, " eventresult=\"%d\"", event_result);
+ StringAppendF(&ping_event, " previousversion=\"%s\"",
+ item->previous_version.GetString().c_str());
+ StringAppendF(&ping_event, " nextversion=\"%s\"",
+ item->next_version.GetString().c_str());
+ if (item->error_category)
+ StringAppendF(&ping_event, " errorcat=\"%d\"", item->error_category);
+ if (item->error_code)
+ StringAppendF(&ping_event, " errorcode=\"%d\"", item->error_code);
+ if (item->extra_code1)
+ StringAppendF(&ping_event, " extracode1=\"%d\"", item->extra_code1);
+ if (HasDiffUpdate(item))
+ StringAppendF(&ping_event, " diffresult=\"%d\"", !item->diff_update_failed);
+ if (item->diff_error_category)
+ StringAppendF(&ping_event,
+ " differrorcat=\"%d\"",
+ item->diff_error_category);
+ if (item->diff_error_code)
+ StringAppendF(&ping_event, " differrorcode=\"%d\"", item->diff_error_code);
+ if (item->diff_extra_code1) {
+ StringAppendF(&ping_event,
+ " diffextracode1=\"%d\"",
+ item->diff_extra_code1);
+ }
+ if (!item->previous_fp.empty())
+ StringAppendF(&ping_event, " previousfp=\"%s\"", item->previous_fp.c_str());
+ if (!item->next_fp.empty())
+ StringAppendF(&ping_event, " nextfp=\"%s\"", item->next_fp.c_str());
+ StringAppendF(&ping_event, "/>");
+ return ping_event;
+}
+
+PingManager::PingManager(
+ const GURL& ping_url,
+ net::URLRequestContextGetter* url_request_context_getter)
+ : ping_url_(ping_url),
+ url_request_context_getter_(url_request_context_getter) {
+}
+
+PingManager::~PingManager() {
+}
+
+// Sends a fire and forget ping when the updates are complete. The ping
+// sender object self-deletes after sending the ping.
+void PingManager::OnUpdateComplete(const CrxUpdateItem* item) {
+ component_updater::PingSender* ping_sender(new PingSender);
+ ping_sender->SendPing(ping_url_, url_request_context_getter_, item);
+}
+
+} // namespace component_updater
+

Powered by Google App Engine
This is Rietveld 408576698