blob: f8fb87b9ec94ab6b75cef4619511611386d8da8f [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
#include "base/memory/ptr_util.h"
#include "net/url_request/url_request.h"
namespace data_reduction_proxy {
const void* const kDataReductionProxyUserDataKey =
&kDataReductionProxyUserDataKey;
DataReductionProxyData::RequestInfo::RequestInfo(Protocol protocol,
bool proxy_bypass,
base::TimeDelta dns_time,
base::TimeDelta connect_time,
base::TimeDelta http_time)
: protocol(protocol),
proxy_bypass(proxy_bypass),
dns_time(dns_time),
connect_time(connect_time),
http_time(http_time) {}
DataReductionProxyData::RequestInfo::RequestInfo(const RequestInfo& other)
: protocol(other.protocol),
proxy_bypass(other.proxy_bypass),
dns_time(other.dns_time),
connect_time(other.connect_time),
http_time(other.http_time) {}
DataReductionProxyData::DataReductionProxyData()
: used_data_reduction_proxy_(false),
lofi_requested_(false),
client_lofi_requested_(false),
lite_page_received_(false),
lofi_policy_received_(false),
lofi_received_(false),
black_listed_(false),
effective_connection_type_(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN),
connection_type_(net::NetworkChangeNotifier::CONNECTION_UNKNOWN),
request_info_(std::vector<DataReductionProxyData::RequestInfo>()) {}
DataReductionProxyData::~DataReductionProxyData() {}
std::unique_ptr<DataReductionProxyData> DataReductionProxyData::DeepCopy()
const {
return std::make_unique<DataReductionProxyData>(*this);
}
DataReductionProxyData::DataReductionProxyData(
const DataReductionProxyData& other) = default;
DataReductionProxyData* DataReductionProxyData::GetData(
const net::URLRequest& request) {
DataReductionProxyData* data = static_cast<DataReductionProxyData*>(
request.GetUserData(kDataReductionProxyUserDataKey));
return data;
}
DataReductionProxyData* DataReductionProxyData::GetDataAndCreateIfNecessary(
net::URLRequest* request) {
if (!request)
return nullptr;
DataReductionProxyData* data = GetData(*request);
if (data)
return data;
data = new DataReductionProxyData();
request->SetUserData(kDataReductionProxyUserDataKey, base::WrapUnique(data));
return data;
}
void DataReductionProxyData::ClearData(net::URLRequest* request) {
request->RemoveUserData(kDataReductionProxyUserDataKey);
}
std::vector<DataReductionProxyData::RequestInfo>
DataReductionProxyData::TakeRequestInfo() {
return std::move(request_info_);
}
std::unique_ptr<DataReductionProxyData::RequestInfo>
DataReductionProxyData::CreateRequestInfoFromRequest(net::URLRequest* request,
bool did_bypass_proxy) {
DCHECK(request);
auto timing_info = std::make_unique<net::LoadTimingInfo>();
request->GetLoadTimingInfo(timing_info.get());
if (timing_info) {
base::TimeDelta dns_time = timing_info->connect_timing.dns_end -
timing_info->connect_timing.dns_start;
base::TimeDelta connect_time = timing_info->connect_timing.connect_end -
timing_info->connect_timing.connect_start;
base::TimeDelta http_time =
timing_info->receive_headers_end - timing_info->send_start;
DataReductionProxyData::RequestInfo::Protocol protocol;
switch (request->proxy_server().scheme()) {
case net::ProxyServer::SCHEME_HTTP:
protocol = DataReductionProxyData::RequestInfo::Protocol::HTTP;
break;
case net::ProxyServer::SCHEME_HTTPS:
protocol = DataReductionProxyData::RequestInfo::Protocol::HTTPS;
break;
case net::ProxyServer::SCHEME_QUIC:
protocol = DataReductionProxyData::RequestInfo::Protocol::QUIC;
break;
default:
protocol = DataReductionProxyData::RequestInfo::Protocol::UNKNOWN;
break;
}
return std::make_unique<DataReductionProxyData::RequestInfo>(
protocol, did_bypass_proxy, dns_time, connect_time, http_time);
}
return nullptr;
}
} // namespace data_reduction_proxy