1 // Copyright 2017 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/spdy/spdy_log_util.h"
6
7 #include <string_view>
8
9 #include "base/values.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 namespace net {
13
ElideGoAwayDebugDataForNetLogAsString(NetLogCaptureMode capture_mode,std::string_view debug_data)14 std::string ElideGoAwayDebugDataForNetLogAsString(
15 NetLogCaptureMode capture_mode,
16 std::string_view debug_data) {
17 auto value = ElideGoAwayDebugDataForNetLog(capture_mode, debug_data);
18 if (!value.is_string()) {
19 ADD_FAILURE() << "'value' should be string.";
20 return std::string();
21 }
22 return value.GetString();
23 }
24
TEST(SpdyLogUtilTest,ElideGoAwayDebugDataForNetLog)25 TEST(SpdyLogUtilTest, ElideGoAwayDebugDataForNetLog) {
26 // Only elide for appropriate log level.
27 EXPECT_EQ("[6 bytes were stripped]",
28 ElideGoAwayDebugDataForNetLogAsString(NetLogCaptureMode::kDefault,
29 "foobar"));
30 EXPECT_EQ("foobar", ElideGoAwayDebugDataForNetLogAsString(
31 NetLogCaptureMode::kIncludeSensitive, "foobar"));
32 EXPECT_EQ("%ESCAPED:\xE2\x80\x8B %FE%FF",
33 ElideGoAwayDebugDataForNetLogAsString(
34 NetLogCaptureMode::kIncludeSensitive, "\xfe\xff\x00"));
35 }
36
TEST(SpdyLogUtilTest,ElideHttp2HeaderBlockForNetLog)37 TEST(SpdyLogUtilTest, ElideHttp2HeaderBlockForNetLog) {
38 spdy::Http2HeaderBlock headers;
39 headers["foo"] = "bar";
40 headers["cookie"] = "name=value";
41
42 base::Value::List list =
43 ElideHttp2HeaderBlockForNetLog(headers, NetLogCaptureMode::kDefault);
44
45 ASSERT_EQ(2u, list.size());
46
47 ASSERT_TRUE(list[0].is_string());
48 EXPECT_EQ("foo: bar", list[0].GetString());
49
50 ASSERT_TRUE(list[1].is_string());
51 EXPECT_EQ("cookie: [10 bytes were stripped]", list[1].GetString());
52
53 list = ElideHttp2HeaderBlockForNetLog(headers,
54 NetLogCaptureMode::kIncludeSensitive);
55
56 ASSERT_EQ(2u, list.size());
57
58 ASSERT_TRUE(list[0].is_string());
59 EXPECT_EQ("foo: bar", list[0].GetString());
60
61 ASSERT_TRUE(list[1].is_string());
62 EXPECT_EQ("cookie: name=value", list[1].GetString());
63 }
64
TEST(SpdyLogUtilTest,Http2HeaderBlockNetLogParams)65 TEST(SpdyLogUtilTest, Http2HeaderBlockNetLogParams) {
66 spdy::Http2HeaderBlock headers;
67 headers["foo"] = "bar";
68 headers["cookie"] = "name=value";
69
70 base::Value::Dict dict =
71 Http2HeaderBlockNetLogParams(&headers, NetLogCaptureMode::kDefault);
72
73 ASSERT_EQ(1u, dict.size());
74
75 auto* header_list = dict.FindList("headers");
76 ASSERT_TRUE(header_list);
77 ASSERT_EQ(2u, header_list->size());
78
79 ASSERT_TRUE((*header_list)[0].is_string());
80 EXPECT_EQ("foo: bar", (*header_list)[0].GetString());
81
82 ASSERT_TRUE((*header_list)[1].is_string());
83 EXPECT_EQ("cookie: [10 bytes were stripped]", (*header_list)[1].GetString());
84
85 dict = Http2HeaderBlockNetLogParams(&headers,
86 NetLogCaptureMode::kIncludeSensitive);
87
88 ASSERT_EQ(1u, dict.size());
89
90 header_list = dict.FindList("headers");
91 ASSERT_TRUE(header_list);
92 ASSERT_EQ(2u, header_list->size());
93
94 ASSERT_TRUE((*header_list)[0].is_string());
95 EXPECT_EQ("foo: bar", (*header_list)[0].GetString());
96
97 ASSERT_TRUE((*header_list)[1].is_string());
98 EXPECT_EQ("cookie: name=value", (*header_list)[1].GetString());
99 }
100
101 // Regression test for https://crbug.com/800282.
TEST(SpdyLogUtilTest,ElideHttp2HeaderBlockForNetLogWithNonUTF8Characters)102 TEST(SpdyLogUtilTest, ElideHttp2HeaderBlockForNetLogWithNonUTF8Characters) {
103 spdy::Http2HeaderBlock headers;
104 headers["foo"] = "bar\x81";
105 headers["O\xe2"] = "bar";
106 headers["\xde\xad"] = "\xbe\xef";
107
108 base::Value::List list =
109 ElideHttp2HeaderBlockForNetLog(headers, NetLogCaptureMode::kDefault);
110
111 ASSERT_EQ(3u, list.size());
112 ASSERT_TRUE(list[0].is_string());
113 EXPECT_EQ("%ESCAPED:\xE2\x80\x8B foo: bar%81", list[0].GetString());
114 ASSERT_TRUE(list[1].is_string());
115 EXPECT_EQ("%ESCAPED:\xE2\x80\x8B O%E2: bar", list[1].GetString());
116 ASSERT_TRUE(list[2].is_string());
117 EXPECT_EQ("%ESCAPED:\xE2\x80\x8B %DE%AD: %BE%EF", list[2].GetString());
118 }
119
120 } // namespace net
121