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

Unified Diff: components/data_reduction_proxy/core/common/data_reduction_proxy_client_config_parser.cc

Issue 1017853003: Add ClientConfig proto, and JSON generation/parsing. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Tweak test values Created 5 years, 9 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: components/data_reduction_proxy/core/common/data_reduction_proxy_client_config_parser.cc
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_client_config_parser.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_client_config_parser.cc
new file mode 100644
index 0000000000000000000000000000000000000000..586ad6851441669428874ec4e6b6925e33a392b9
--- /dev/null
+++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_client_config_parser.cc
@@ -0,0 +1,166 @@
+// Copyright 2015 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 "components/data_reduction_proxy/core/common/data_reduction_proxy_client_config_parser.h"
+
+#include <string>
+
+#include "base/json/json_reader.h"
+#include "base/strings/stringprintf.h"
+#include "base/time/time.h"
+#include "base/values.h"
+
+namespace {
+
+// String representations of ProxyServer schemes.
+const char kSchemeHTTP[] = "HTTP";
+const char kSchemeHTTPS[] = "HTTPS";
+const char kSchemeQUIC[] = "QUIC";
+const char kSchemeUnspecified[] = "UNSPECIFIED";
+
+} // namespace
+
+namespace data_reduction_proxy {
+
+namespace config_parser {
+
+std::string GetSchemeString(net::ProxyServer::Scheme scheme) {
+ switch (scheme) {
+ case net::ProxyServer::SCHEME_HTTP:
+ return kSchemeHTTP;
+ case net::ProxyServer::SCHEME_HTTPS:
+ return kSchemeHTTPS;
+ case net::ProxyServer::SCHEME_QUIC:
+ return kSchemeQUIC;
+ default:
+ return kSchemeUnspecified;
+ }
+}
+
+net::ProxyServer::Scheme SchemeFromProxyScheme(
+ ProxyServer_ProxyScheme proxy_scheme) {
+ switch (proxy_scheme) {
+ case ProxyServer_ProxyScheme_HTTP:
+ return net::ProxyServer::SCHEME_HTTP;
+ case ProxyServer_ProxyScheme_HTTPS:
+ return net::ProxyServer::SCHEME_HTTPS;
+ case ProxyServer_ProxyScheme_QUIC:
+ return net::ProxyServer::SCHEME_QUIC;
+ default:
+ return net::ProxyServer::SCHEME_INVALID;
+ }
+}
+
+ProxyServer_ProxyScheme GetProxyScheme(const std::string& scheme) {
+ if (scheme == kSchemeHTTP)
+ return ProxyServer_ProxyScheme_HTTP;
+
+ if (scheme == kSchemeHTTPS)
+ return ProxyServer_ProxyScheme_HTTPS;
+
+ if (scheme == kSchemeQUIC)
+ return ProxyServer_ProxyScheme_QUIC;
+
+ return ProxyServer_ProxyScheme_UNSPECIFIED;
+}
+
+std::string TimeToISO8601(const base::Time& time) {
+ base::Time::Exploded exploded;
+ time.UTCExplode(&exploded);
+ return base::StringPrintf(
+ "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", exploded.year, exploded.month,
+ exploded.day_of_month, exploded.hour, exploded.minute, exploded.second,
+ exploded.millisecond);
+}
+
+bool ISO8601ToTimestamp(const std::string& time, Timestamp* timestamp) {
+ base::Time t;
+ if (!base::Time::FromUTCString(time.c_str(), &t))
+ return false;
+
+ timestamp->set_seconds((t - base::Time::UnixEpoch()).InSeconds());
+ // Discard fractional seconds; it isn't worth the code effort to
+ // calculate it.
+ timestamp->set_nanos(0);
+ return true;
+}
+
+base::Time TimestampToTime(const Timestamp& timestamp) {
+ base::Time t = base::Time::UnixEpoch();
+ t += base::TimeDelta::FromSeconds(timestamp.seconds());
+ t += base::TimeDelta::FromMicroseconds(
+ timestamp.nanos() / base::Time::kNanosecondsPerMicrosecond);
+ return t;
+}
+
+bool ParseClientConfig(const std::string& config_data, ClientConfig* config) {
+ scoped_ptr<base::Value> parsed_data(base::JSONReader::Read(config_data));
+ if (!parsed_data)
+ return false;
+
+ const base::DictionaryValue* parsed_dict;
+ if (!parsed_data->GetAsDictionary(&parsed_dict))
+ return false;
+
+ std::string session_key;
+ if (!parsed_dict->GetString("sessionKey", &session_key))
+ return false;
+
+ config->set_session_key(session_key);
+
+ std::string expire_time;
+ if (!parsed_dict->GetString("expireTime", &expire_time))
+ return false;
+
+ if (!ISO8601ToTimestamp(expire_time, config->mutable_expire_time()))
+ return false;
+
+ const base::DictionaryValue* proxy_config_dict;
+ if (!parsed_dict->GetDictionary("proxyConfig", &proxy_config_dict))
+ return false;
+
+ ProxyConfig* proxy_config = config->mutable_proxy_config();
+
+ const base::ListValue* http_proxy_servers;
+ if (!proxy_config_dict->GetList("httpProxyServers", &http_proxy_servers))
+ return false;
+
+ base::ListValue::const_iterator it = http_proxy_servers->begin();
+ for (; it != http_proxy_servers->end(); ++it) {
+ const base::DictionaryValue* server_value;
+ if (!(*it)->GetAsDictionary(&server_value)) {
+ continue;
+ }
+
+ std::string scheme;
+ std::string host;
+ int port;
+ if (!server_value->GetString("scheme", &scheme)) {
+ continue;
+ }
+
+ if (!server_value->GetString("host", &host)) {
+ continue;
+ }
+
+ if (!server_value->GetInteger("port", &port)) {
+ continue;
+ }
+
+ ProxyServer_ProxyScheme proxy_scheme = GetProxyScheme(scheme);
+ if (proxy_scheme == ProxyServer_ProxyScheme_UNSPECIFIED)
+ continue;
+
+ ProxyServer* proxy_server = proxy_config->add_http_proxy_servers();
+ proxy_server->set_scheme(GetProxyScheme(scheme));
+ proxy_server->set_host(host);
+ proxy_server->set_port(port);
+ }
+
+ return true;
+}
+
+} // namespace config_parser
+
+} // namespace data_reduction_proxy

Powered by Google App Engine
This is Rietveld 408576698