Commit e0d3747d authored by Bence Béky's avatar Bence Béky Committed by Commit Bot

Improve QuicHttpStreamTest.ElideHeadersInNetLog.

Follow-up to https://crrev.com/c/2380573.

Change-Id: I9dfff2099fd47601998ff775d019e79d7710c2af
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2382198Reviewed-by: default avatarMatt Menke <mmenke@chromium.org>
Commit-Queue: Bence Béky <bnc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#802844}
parent cd1b2e79
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/run_loop.h" #include "base/run_loop.h"
#include "base/stl_util.h" #include "base/stl_util.h"
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "base/time/default_tick_clock.h" #include "base/time/default_tick_clock.h"
...@@ -115,6 +116,46 @@ std::vector<TestParams> GetTestParams() { ...@@ -115,6 +116,46 @@ std::vector<TestParams> GetTestParams() {
return params; return params;
} }
// Returns true if |params| is a dict, has an entry with key "headers", that
// entry is a list of strings, which when interpreted as colon-separated
// key-value pairs has exactly one entry with |key| and that entry has value
// |expected_value|.
bool CheckHeader(const base::Value& params,
base::StringPiece key,
base::StringPiece expected_value) {
if (!params.is_dict()) {
return false;
}
const base::Value* headers = params.FindListKey("headers");
if (!headers) {
return false;
}
std::string header_prefix = base::StrCat({key, ": "});
std::string expected_header = base::StrCat({header_prefix, expected_value});
auto header_list = headers->GetList();
auto header_it = header_list.begin();
bool header_found = false;
while (header_it != header_list.end()) {
if (!header_it->is_string()) {
return false;
}
const std::string& header = header_it->GetString();
if (base::StartsWith(header, header_prefix)) {
if (header_found) {
return false;
}
if (header != expected_header) {
return false;
}
header_found = true;
}
++header_it;
}
return header_found;
}
class TestQuicConnection : public quic::QuicConnection { class TestQuicConnection : public quic::QuicConnection {
public: public:
TestQuicConnection(const quic::ParsedQuicVersionVector& versions, TestQuicConnection(const quic::ParsedQuicVersionVector& versions,
...@@ -950,102 +991,91 @@ TEST_P(QuicHttpStreamTest, ElideHeadersInNetLog) { ...@@ -950,102 +991,91 @@ TEST_P(QuicHttpStreamTest, ElideHeadersInNetLog) {
net_log_.SetObserverCaptureMode(NetLogCaptureMode::kDefault); net_log_.SetObserverCaptureMode(NetLogCaptureMode::kDefault);
// Send request. // Send first request.
SetRequest("GET", "/", DEFAULT_PRIORITY); SetRequest("GET", "/", DEFAULT_PRIORITY);
request_.method = "GET"; request_.method = "GET";
request_.url = GURL("https://www.example.org/"); request_.url = GURL("https://www.example.org/");
headers_.SetHeader(HttpRequestHeaders::kCookie, "secret"); headers_.SetHeader(HttpRequestHeaders::kCookie, "secret");
size_t spdy_request_header_frame_length; size_t spdy_request_header_frame_length;
int packet_number = 1; int outgoing_packet_number = 1;
AddWrite(ConstructInitialSettingsPacket(packet_number++)); AddWrite(ConstructInitialSettingsPacket(outgoing_packet_number++));
AddWrite(InnerConstructRequestHeadersPacket( AddWrite(InnerConstructRequestHeadersPacket(
packet_number++, GetNthClientInitiatedBidirectionalStreamId(0), outgoing_packet_number++, stream_id_, kIncludeVersion, kFin,
kIncludeVersion, kFin, DEFAULT_PRIORITY, DEFAULT_PRIORITY, &spdy_request_header_frame_length));
&spdy_request_header_frame_length));
EXPECT_THAT(stream_->InitializeStream(&request_, true, DEFAULT_PRIORITY, EXPECT_THAT(stream_->InitializeStream(&request_, true, DEFAULT_PRIORITY,
net_log_.bound(), callback_.callback()), net_log_.bound(), callback_.callback()),
IsOk()); IsOk());
EXPECT_THAT(stream_->SendRequest(headers_, &response_, callback_.callback()), EXPECT_THAT(stream_->SendRequest(headers_, &response_, callback_.callback()),
IsOk()); IsOk());
ProcessPacket(ConstructServerAckPacket(1, 1, 1, 1)); // Ack the request. int incoming_packet_number = 1;
ProcessPacket(ConstructServerAckPacket(incoming_packet_number++, 1, 1,
1)); // Ack the request.
// Process response. // Process first response.
SetResponse("200 OK", string()); SetResponse("200 OK", string());
response_headers_["set-cookie"] = "secret"; response_headers_["set-cookie"] = "secret";
size_t spdy_response_header_frame_length; size_t spdy_response_header_frame_length;
ProcessPacket(ConstructResponseHeadersPacket( ProcessPacket(ConstructResponseHeadersPacket(
2, kFin, &spdy_response_header_frame_length)); incoming_packet_number++, kFin, &spdy_response_header_frame_length));
EXPECT_THAT(stream_->ReadResponseHeaders(callback_.callback()), IsOk()); EXPECT_THAT(stream_->ReadResponseHeaders(callback_.callback()), IsOk());
EXPECT_TRUE(AtEof());
ASSERT_TRUE(response_.headers.get()); ASSERT_TRUE(response_.headers.get());
EXPECT_EQ(200, response_.headers->response_code()); EXPECT_EQ(200, response_.headers->response_code());
EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain")); EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain"));
EXPECT_TRUE(response_.headers->HasHeaderValue("set-cookie", "secret")); EXPECT_TRUE(response_.headers->HasHeaderValue("set-cookie", "secret"));
// Find HTTP3_HEADERS_SENT NetLog event. net_log_.SetObserverCaptureMode(NetLogCaptureMode::kIncludeSensitive);
auto events = net_log_.GetEntries();
auto event_it = events.begin(); // Send second request.
while (event_it != events.end()) { quic::QuicStreamId stream_id = GetNthClientInitiatedBidirectionalStreamId(1);
if (event_it->type == NetLogEventType::HTTP3_HEADERS_SENT) { request_.url = GURL("https://www.example.org/foo");
break;
} AddWrite(InnerConstructRequestHeadersPacket(
++event_it; outgoing_packet_number++, stream_id, kIncludeVersion, kFin,
} DEFAULT_PRIORITY, &spdy_request_header_frame_length));
ASSERT_NE(events.end(), event_it) << "No HTTP3_HEADERS_SENT event found.";
auto stream = std::make_unique<QuicHttpStream>(
// Extract request headers. session_->CreateHandle(HostPortPair("www.example.org/foo", 443)));
const base::Value& request_params = event_it->params; EXPECT_THAT(stream->InitializeStream(&request_, true, DEFAULT_PRIORITY,
ASSERT_TRUE(request_params.is_dict()); net_log_.bound(), callback_.callback()),
const base::Value* headers = request_params.FindKey("headers"); IsOk());
ASSERT_TRUE(headers) << "No headers entry found."; EXPECT_THAT(stream->SendRequest(headers_, &response_, callback_.callback()),
ASSERT_TRUE(headers->is_list()); IsOk());
auto headerlist = headers->GetList(); ProcessPacket(ConstructServerAckPacket(incoming_packet_number++, 1, 1,
1)); // Ack the request.
// Check that cookie value has been stripped.
auto header_it = headerlist.begin(); // Process second response.
while (header_it != headerlist.end()) { SetResponse("200 OK", string());
ASSERT_TRUE(header_it->is_string()); response_headers_["set-cookie"] = "secret";
if (base::StartsWith(header_it->GetString(), "cookie: ")) { ProcessPacket(InnerConstructResponseHeadersPacket(
break; incoming_packet_number++, stream_id, kFin,
} &spdy_response_header_frame_length));
++header_it; EXPECT_THAT(stream->ReadResponseHeaders(callback_.callback()), IsOk());
}
ASSERT_NE(headerlist.end(), header_it) << "No cookie header found."; ASSERT_TRUE(response_.headers.get());
EXPECT_EQ("cookie: [6 bytes were stripped]", header_it->GetString()); EXPECT_EQ(200, response_.headers->response_code());
EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain"));
// Find HTTP3_HEADERS_DECODED NetLog event. EXPECT_TRUE(response_.headers->HasHeaderValue("set-cookie", "secret"));
event_it = events.begin();
while (event_it != events.end()) { EXPECT_TRUE(AtEof());
if (event_it->type == NetLogEventType::HTTP3_HEADERS_DECODED) {
break; // Check that sensitive header value were stripped
} // for the first transaction (logged with NetLogCaptureMode::kDefault)
++event_it; // but not for the second (logged with NetLogCaptureMode::kIncludeSensitive).
} auto entries =
ASSERT_NE(events.end(), event_it) << "No HTTP3_HEADERS_DECODED event found."; net_log_.GetEntriesWithType(NetLogEventType::HTTP3_HEADERS_SENT);
ASSERT_EQ(2u, entries.size());
// Extract response headers. EXPECT_TRUE(
const base::Value& response_params = event_it->params; CheckHeader(entries[0].params, "cookie", "[6 bytes were stripped]"));
ASSERT_TRUE(response_params.is_dict()); EXPECT_TRUE(CheckHeader(entries[1].params, "cookie", "secret"));
headers = response_params.FindKey("headers");
ASSERT_TRUE(headers) << "No headers entry found."; entries = net_log_.GetEntriesWithType(NetLogEventType::HTTP3_HEADERS_DECODED);
ASSERT_TRUE(headers->is_list()); ASSERT_EQ(2u, entries.size());
headerlist = headers->GetList(); EXPECT_TRUE(
CheckHeader(entries[0].params, "set-cookie", "[6 bytes were stripped]"));
// Check that set-cookie value has been stripped. EXPECT_TRUE(CheckHeader(entries[1].params, "set-cookie", "secret"));
header_it = headerlist.begin();
while (header_it != headerlist.end()) {
ASSERT_TRUE(header_it->is_string());
if (base::StartsWith(header_it->GetString(), "set-cookie: ")) {
break;
}
++header_it;
}
ASSERT_NE(headerlist.end(), header_it) << "No set-cookie header found.";
EXPECT_EQ("set-cookie: [6 bytes were stripped]", header_it->GetString());
} }
// Regression test for http://crbug.com/288128 // Regression test for http://crbug.com/288128
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment