Index: net/http/http_response_headers.cc |
diff --git a/net/http/http_response_headers.cc b/net/http/http_response_headers.cc |
index 85df8d5e15f3c390a663dfad6eecb6857564ee59..744cf92c3912605ab72136d89e29667757dc177f 100644 |
--- a/net/http/http_response_headers.cc |
+++ b/net/http/http_response_headers.cc |
@@ -12,6 +12,7 @@ |
#include <algorithm> |
#include "base/logging.h" |
+#include "base/metrics/histogram.h" |
#include "base/pickle.h" |
#include "base/string_number_conversions.h" |
#include "base/string_util.h" |
@@ -85,6 +86,34 @@ bool ShouldUpdateHeader(const std::string::const_iterator& name_begin, |
return true; |
} |
+// Functions for histogram initialization. The code 0 is put in the |
+// response map to track response codes that are invalid. |
+// TODO(gavinp): Greatly prune the collected codes once we learn which |
+// ones are not sent in practice, to reduce upload size & memory use. |
+ |
+enum { |
+ HISTOGRAM_MIN_HTTP_RESPONSE_CODE = 100, |
+ HISTOGRAM_MAX_HTTP_RESPONSE_CODE = 599, |
+}; |
+ |
+std::vector<int> GetAllHttpResponseCodes() { |
+ std::vector<int> codes; |
+ codes.reserve( |
+ HISTOGRAM_MAX_HTTP_RESPONSE_CODE - HISTOGRAM_MIN_HTTP_RESPONSE_CODE + 2); |
+ codes.push_back(0); |
+ for (int i = HISTOGRAM_MIN_HTTP_RESPONSE_CODE; |
+ i <= HISTOGRAM_MAX_HTTP_RESPONSE_CODE; ++i) |
+ codes.push_back(i); |
+ return codes; |
+} |
+ |
+int MapHttpResponseCode(int code) { |
+ if (HISTOGRAM_MIN_HTTP_RESPONSE_CODE <= code && |
+ code <= HISTOGRAM_MAX_HTTP_RESPONSE_CODE) |
+ return code; |
+ return 0; |
+} |
+ |
} // namespace |
struct HttpResponseHeaders::ParsedHeader { |
@@ -103,6 +132,23 @@ struct HttpResponseHeaders::ParsedHeader { |
HttpResponseHeaders::HttpResponseHeaders(const std::string& raw_input) |
: response_code_(-1) { |
Parse(raw_input); |
+ |
+ // The most important thing to do with this histogram is find out |
+ // the existence of unusual HTTP response codes. As it happens |
+ // right now, there aren't double-constructions of response headers |
+ // using this constructor, so our counts should also be accurate, |
+ // without instantiating the histogram in two places. It is also |
+ // important that this histogram not collect data in the other |
+ // constructor, which rebuilds an histogram from a pickle, since |
+ // that would actually create a double call between the original |
+ // HttpResponseHeader that was serialized, and initialization of the |
+ // new object from that pickle. |
+ UMA_HISTOGRAM_CUSTOM_ENUMERATION("Net.HttpResponseCode", |
+ MapHttpResponseCode(response_code_), |
+ // Note the third argument is only |
+ // evaluated once, see macro |
+ // definition for details. |
+ GetAllHttpResponseCodes()); |
} |
HttpResponseHeaders::HttpResponseHeaders(const Pickle& pickle, void** iter) |