• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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