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

Unified Diff: net/traffic_annotation/network_traffic_annotation.h

Issue 2421333002: Protobuf for Traffic Annotation and first use by a URLFetcher. (Closed)
Patch Set: All comments addressed. Created 3 years, 11 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: net/traffic_annotation/network_traffic_annotation.h
diff --git a/net/traffic_annotation/network_traffic_annotation.h b/net/traffic_annotation/network_traffic_annotation.h
new file mode 100644
index 0000000000000000000000000000000000000000..f4314f0ec3c2fb4a320ec29f19122de308067bef
--- /dev/null
+++ b/net/traffic_annotation/network_traffic_annotation.h
@@ -0,0 +1,75 @@
+// Copyright (c) 2016 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.
+
+#ifndef NET_TRAFFIC_ANNOTATION_NETWORK_TRAFFIC_ANNOTATION_H_
+#define NET_TRAFFIC_ANNOTATION_NETWORK_TRAFFIC_ANNOTATION_H_
+
+namespace {
+
+// Recuresively compute hash code of the given string as a constant expression.
+template <int N>
+static constexpr unsigned int recursive_hash(const char* str) {
+ return (unsigned int)(recursive_hash<N - 1>(str) * 31 + str[N]) % 138003713;
+}
+
+// Recursion stopper for the above function.
+template <>
+constexpr unsigned int recursive_hash<-1>(const char* str) {
+ return 7;
+}
+
+// Entry point to function that computes hash as constant expression.
+#define COMPUTE_STRING_HASH(S) recursive_hash<sizeof(S)>(S)
+
+} // namespace
+
+namespace net {
+
+// Defined type for network traffic annotation tags.
+typedef const unsigned int NetworkTrafficAnnotationTag;
asanka 2017/01/26 20:59:28 using NetworkTrafficAnnotationTag = ... Also, use
Ramin Halavati 2017/01/27 07:48:58 Done.
+
+// Function to convert a network traffic annotation's unique id and protobuf
+// text into a NetworkTrafficAnnotationTag.
+//
+// This function serves as a tag that can be discovered and extracted via
+// clang tools. This allows reviewing all network traffic that is generated
+// and annotated by Chrome.
+//
+// |unique_id| should be a string that uniquely identifies this annotation
+// across all of Chromium source code.
+// |proto| is a text-encoded NetworkTrafficAnnotation protobuf (see
+// tools/traffic_annotaiton/traffic_annotation.proto)
+//
+// This function should be called with inlined parameters like
+// NetworkTrafficAnnotationTag tag = DefineNetworkTrafficAnnotation(
+// "unique_tag_id",
+// R"(semantics: {...}
+// policy: {...}
+// )");
+// This allows the compiler to calculate and extract the hashed |unique_id|
+// at compile time without copying the entire protobuf into the text segment
+// of the binary or creating any runtime performance impact.
+//
+// Please do NOT use the following syntax:
+// const char* proto = R("...");
+// NetworkTrafficAnnotationTag tag = DefineNetworkTrafficAnnotation(
+// "unique_tag_id", proto);
+constexpr NetworkTrafficAnnotationTag DefineNetworkTrafficAnnotation(
+ const char* unique_id,
asanka 2017/01/26 20:59:28 Actually, if the intention is to introduce a param
Ramin Halavati 2017/01/27 07:48:58 |unique_id|s have two purposes here: 1- They stay
asanka 2017/01/27 16:58:00 Using typed ints (a.la enum NetworkTrafficAnnotati
Ramin Halavati 2017/01/30 08:43:25 I am not sure if I got your concern clearly. Now t
+ const char* proto) {
+ return (NetworkTrafficAnnotationTag)COMPUTE_STRING_HASH(unique_id);
asanka 2017/01/26 20:59:28 sizeof(unique_id) == sizeof(const char*) here.
Ramin Halavati 2017/01/27 07:48:58 Yes, but we want the |unique_id| to be kept in the
asanka 2017/01/27 16:58:00 Sure, but what I was pointing out was that you are
Ramin Halavati 2017/01/30 08:43:25 Acknowledged.
+}
+
+// Placeholder for unannotated usages.
+#define NO_TRAFFIC_ANNOTATION_YET \
+ net::DefineNetworkTrafficAnnotation("Undefined", "Nothing here yet.")
+
+// Macro for unit tests traffic annotations.
+#define TRAFFIC_ANNOTATION_FOR_TESTS \
+ net::DefineNetworkTrafficAnnotation( \
+ "UnitTest", "Traffic annotation for unit, browser and other tests")
+
+} // namespace net
+
+#endif // NET_TRAFFIC_ANNOTATION_NETWORK_TRAFFIC_ANNOTATION_H_

Powered by Google App Engine
This is Rietveld 408576698