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

Unified Diff: net/spdy/chromium/header_coalescer.cc

Issue 2847133003: Add NetLog event for invalid Http/2 response header (Closed)
Patch Set: Created 3 years, 8 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/spdy/chromium/header_coalescer.cc
diff --git a/net/spdy/chromium/header_coalescer.cc b/net/spdy/chromium/header_coalescer.cc
index f5693d68452d7e5271b927e7e63f3dcc09393c95..744ed9e5a9b681205178c8535031d8752859b395 100644
--- a/net/spdy/chromium/header_coalescer.cc
+++ b/net/spdy/chromium/header_coalescer.cc
@@ -6,31 +6,70 @@
#include <utility>
+#include "base/bind.h"
+#include "base/memory/ptr_util.h"
#include "base/strings/string_util.h"
+#include "base/values.h"
+#include "net/http/http_log_util.h"
#include "net/http/http_util.h"
#include "net/spdy/platform/api/spdy_estimate_memory_usage.h"
#include "net/spdy/platform/api/spdy_string.h"
namespace net {
+namespace {
+std::unique_ptr<base::Value> ElideNetLogHeaderCallback(
+ SpdyStringPiece header_name,
+ SpdyStringPiece header_value,
+ NetLogCaptureMode capture_mode) {
+ auto dict = base::MakeUnique<base::DictionaryValue>();
+ dict->SetString("header_name", header_name);
+ dict->SetString("header_value", ElideHeaderValueForNetLog(
+ capture_mode, header_name.as_string(),
+ header_value.as_string()));
+ return std::move(dict);
+}
+
+} // namespace
const size_t kMaxHeaderListSize = 256 * 1024;
+HeaderCoalescer::HeaderCoalescer(const NetLogWithSource& net_log)
+ : net_log_(net_log) {}
+
void HeaderCoalescer::OnHeader(SpdyStringPiece key, SpdyStringPiece value) {
+ if (!AddHeader(key, value)) {
+ error_seen_ = true;
+ if (net_log_.IsCapturing()) {
+ net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_RECV_INVALID_HEADER,
+ base::Bind(&ElideNetLogHeaderCallback, key, value));
+ }
+ }
+}
+
+SpdyHeaderBlock HeaderCoalescer::release_headers() {
+ DCHECK(headers_valid_);
+ headers_valid_ = false;
+ return std::move(headers_);
+}
+
+size_t HeaderCoalescer::EstimateMemoryUsage() const {
+ return SpdyEstimateMemoryUsage(headers_);
+}
+
+bool HeaderCoalescer::AddHeader(SpdyStringPiece key, SpdyStringPiece value) {
Bence 2017/04/28 18:08:35 Maybe define an enum: kOk, kEmptyName, kPseudoHead
xunjieli 2017/05/10 01:13:48 That's a bit more code that I am comfortable with
Bence 2017/05/10 12:43:29 Okay, I understand.
if (error_seen_) {
- return;
+ return false;
Bence 2017/04/28 18:08:35 This will cause every header to be logged after a
xunjieli 2017/05/10 01:13:48 I have moved this conditional out of this method.
}
if (key.empty()) {
DVLOG(1) << "Header name must not be empty.";
- error_seen_ = true;
- return;
+ return false;
}
SpdyStringPiece key_name = key;
if (key[0] == ':') {
if (regular_header_seen_) {
- error_seen_ = true;
- return;
+ return false;
Bence 2017/04/28 18:08:35 Is there a better mechanism to log that pseudo/reg
xunjieli 2017/05/10 01:13:47 I am not sure. We can also log every header value
Bence 2017/05/10 12:43:29 Sounds good.
}
key_name.remove_prefix(1);
} else if (!regular_header_seen_) {
@@ -38,23 +77,18 @@ void HeaderCoalescer::OnHeader(SpdyStringPiece key, SpdyStringPiece value) {
}
if (!HttpUtil::IsValidHeaderName(key_name)) {
- error_seen_ = true;
- return;
+ return false;
}
// 32 byte overhead according to RFC 7540 Section 6.5.2.
header_list_size_ += key.size() + value.size() + 32;
- if (header_list_size_ > kMaxHeaderListSize) {
- error_seen_ = true;
- return;
- }
+ if (header_list_size_ > kMaxHeaderListSize)
+ return false;
Bence 2017/04/28 18:08:35 Is there a better mechanism to log that pseudo/reg
// End of line delimiter is forbidden according to RFC 7230 Section 3.2.
// Line folding, RFC 7230 Section 3.2.4., is a special case of this.
- if (value.find("\r\n") != SpdyStringPiece::npos) {
- error_seen_ = true;
- return;
- }
+ if (value.find("\r\n") != SpdyStringPiece::npos)
+ return false;
Bence 2017/04/28 18:08:35 I'm not sure NetLog correctly displays string valu
xunjieli 2017/05/10 01:13:48 Acknowledged.
auto iter = headers_.find(key);
if (iter == headers_.end()) {
@@ -72,16 +106,8 @@ void HeaderCoalescer::OnHeader(SpdyStringPiece key, SpdyStringPiece value) {
value.AppendToString(&s);
headers_[key] = s;
}
+ return true;
}
-SpdyHeaderBlock HeaderCoalescer::release_headers() {
- DCHECK(headers_valid_);
- headers_valid_ = false;
- return std::move(headers_);
-}
-
-size_t HeaderCoalescer::EstimateMemoryUsage() const {
- return SpdyEstimateMemoryUsage(headers_);
-}
} // namespace net

Powered by Google App Engine
This is Rietveld 408576698