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