Index: net/reporting/reporting_header_parser.cc |
diff --git a/net/reporting/reporting_header_parser.cc b/net/reporting/reporting_header_parser.cc |
index 8dbcb8e20abf5f31cae43f12a2f71fbd4017c03c..8a0c7b2b9c11e4c273585d7475a603dfa13cc2cd 100644 |
--- a/net/reporting/reporting_header_parser.cc |
+++ b/net/reporting/reporting_header_parser.cc |
@@ -13,6 +13,7 @@ |
#include "base/values.h" |
#include "net/reporting/reporting_cache.h" |
#include "net/reporting/reporting_context.h" |
+#include "net/reporting/reporting_delegate.h" |
namespace net { |
@@ -24,38 +25,11 @@ const char kGroupKey[] = "group"; |
const char kGroupDefaultValue[] = "default"; |
const char kMaxAgeKey[] = "max-age"; |
-} // namespace |
- |
-// static |
-void ReportingHeaderParser::ParseHeader(ReportingContext* context, |
- const GURL& url, |
- const std::string& json_value) { |
- DCHECK(url.SchemeIsCryptographic()); |
- |
- std::unique_ptr<base::Value> value = |
- base::JSONReader::Read("[" + json_value + "]"); |
- if (!value) |
- return; |
- |
- const base::ListValue* list = nullptr; |
- bool is_list = value->GetAsList(&list); |
- DCHECK(is_list); |
- |
- ReportingCache* cache = context->cache(); |
- base::TimeTicks now = context->tick_clock()->NowTicks(); |
- for (size_t i = 0; i < list->GetSize(); i++) { |
- const base::Value* endpoint = nullptr; |
- bool got_endpoint = list->Get(i, &endpoint); |
- DCHECK(got_endpoint); |
- ProcessEndpoint(cache, now, url, *endpoint); |
- } |
-} |
- |
-// static |
-void ReportingHeaderParser::ProcessEndpoint(ReportingCache* cache, |
- base::TimeTicks now, |
- const GURL& url, |
- const base::Value& value) { |
+void ProcessEndpoint(ReportingDelegate* delegate, |
+ ReportingCache* cache, |
+ base::TimeTicks now, |
+ const GURL& url, |
+ const base::Value& value) { |
const base::DictionaryValue* dict = nullptr; |
if (!value.GetAsDictionary(&dict)) |
return; |
@@ -87,11 +61,44 @@ void ReportingHeaderParser::ProcessEndpoint(ReportingCache* cache, |
subdomains = ReportingClient::Subdomains::INCLUDE; |
} |
+ url::Origin origin(url); |
+ |
+ if (!delegate->CanSetClient(origin, endpoint_url)) |
+ return; |
+ |
if (ttl_sec > 0) { |
- cache->SetClient(url::Origin(url), endpoint_url, subdomains, group, |
+ cache->SetClient(origin, endpoint_url, subdomains, group, |
now + base::TimeDelta::FromSeconds(ttl_sec)); |
} else { |
- cache->RemoveClientForOriginAndEndpoint(url::Origin(url), endpoint_url); |
+ cache->RemoveClientForOriginAndEndpoint(origin, endpoint_url); |
+ } |
+} |
+ |
+} // namespace |
+ |
+// static |
+void ReportingHeaderParser::ParseHeader(ReportingContext* context, |
+ const GURL& url, |
+ const std::string& json_value) { |
+ DCHECK(url.SchemeIsCryptographic()); |
+ |
+ std::unique_ptr<base::Value> value = |
+ base::JSONReader::Read("[" + json_value + "]"); |
+ if (!value) |
+ return; |
+ |
+ const base::ListValue* list = nullptr; |
+ bool is_list = value->GetAsList(&list); |
+ DCHECK(is_list); |
+ |
+ ReportingDelegate* delegate = context->delegate(); |
+ ReportingCache* cache = context->cache(); |
+ base::TimeTicks now = context->tick_clock()->NowTicks(); |
+ for (size_t i = 0; i < list->GetSize(); i++) { |
+ const base::Value* endpoint = nullptr; |
+ bool got_endpoint = list->Get(i, &endpoint); |
+ DCHECK(got_endpoint); |
+ ProcessEndpoint(delegate, cache, now, url, *endpoint); |
} |
} |