Index: net/spdy/hpack_huffman_aggregator.cc |
diff --git a/net/spdy/hpack_huffman_aggregator.cc b/net/spdy/hpack_huffman_aggregator.cc |
deleted file mode 100644 |
index 8080a9b3f393425d926f9b73ab3638d6dc6ad1a9..0000000000000000000000000000000000000000 |
--- a/net/spdy/hpack_huffman_aggregator.cc |
+++ /dev/null |
@@ -1,178 +0,0 @@ |
-// Copyright 2014 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 "net/spdy/hpack_huffman_aggregator.h" |
- |
-#include "base/metrics/bucket_ranges.h" |
-#include "base/metrics/field_trial.h" |
-#include "base/metrics/histogram.h" |
-#include "base/metrics/sample_vector.h" |
-#include "base/stl_util.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/string_util.h" |
-#include "net/base/load_flags.h" |
-#include "net/http/http_request_headers.h" |
-#include "net/http/http_request_info.h" |
-#include "net/http/http_response_headers.h" |
-#include "net/spdy/hpack_encoder.h" |
-#include "net/spdy/spdy_http_utils.h" |
- |
-namespace net { |
- |
-namespace { |
- |
-const char kHistogramName[] = "Net.SpdyHpackEncodedCharacterFrequency"; |
- |
-const size_t kTotalCountsPublishThreshold = 50000; |
- |
-// Each encoder uses the default dynamic table size of 4096 total bytes. |
-const size_t kMaxEncoders = 20; |
- |
-} // namespace |
- |
-HpackHuffmanAggregator::HpackHuffmanAggregator() |
- : counts_(256, 0), |
- total_counts_(0), |
- max_encoders_(kMaxEncoders) { |
-} |
- |
-HpackHuffmanAggregator::~HpackHuffmanAggregator() { |
- STLDeleteContainerPairSecondPointers(encoders_.begin(), encoders_.end()); |
- encoders_.clear(); |
-} |
- |
-void HpackHuffmanAggregator::AggregateTransactionCharacterCounts( |
- const HttpRequestInfo& request, |
- const HttpRequestHeaders& request_headers, |
- const ProxyServer& proxy, |
- const HttpResponseHeaders& response_headers) { |
- if (IsCrossOrigin(request)) { |
- return; |
- } |
- HpackEncoder* encoder = ObtainEncoder(SpdySessionKey( |
- HostPortPair::FromURL(request.url), proxy, request.privacy_mode)); |
- |
- // Convert and encode the request and response header sets. |
- { |
- SpdyHeaderBlock headers; |
- CreateSpdyHeadersFromHttpRequest( |
- request, request_headers, SPDY4, false, &headers); |
- |
- std::string tmp_out; |
- encoder->EncodeHeaderSet(headers, &tmp_out); |
- } |
- { |
- SpdyHeaderBlock headers; |
- CreateSpdyHeadersFromHttpResponse(response_headers, &headers); |
- |
- std::string tmp_out; |
- encoder->EncodeHeaderSet(headers, &tmp_out); |
- } |
- if (total_counts_ >= kTotalCountsPublishThreshold) { |
- PublishCounts(); |
- } |
-} |
- |
-// static |
-bool HpackHuffmanAggregator::UseAggregator() { |
- const std::string group_name = |
- base::FieldTrialList::FindFullName("HpackHuffmanAggregator"); |
- if (group_name == "Enabled") { |
- return true; |
- } |
- return false; |
-} |
- |
-// static |
-void HpackHuffmanAggregator::CreateSpdyHeadersFromHttpResponse( |
- const HttpResponseHeaders& headers, |
- SpdyHeaderBlock* headers_out) { |
- // Lower-case header names, and coalesce multiple values delimited by \0. |
- // Also add the fixed status header. |
- std::string name, value; |
- void* it = NULL; |
- while (headers.EnumerateHeaderLines(&it, &name, &value)) { |
- base::StringToLowerASCII(&name); |
- if (headers_out->find(name) == headers_out->end()) { |
- (*headers_out)[name] = value; |
- } else { |
- (*headers_out)[name] += std::string(1, '\0') + value; |
- } |
- } |
- (*headers_out)[":status"] = base::IntToString(headers.response_code()); |
-} |
- |
-// static |
-bool HpackHuffmanAggregator::IsCrossOrigin(const HttpRequestInfo& request) { |
- // Require that the request is top-level, or that it shares |
- // an origin with its referer. |
- if ((request.load_flags & LOAD_MAIN_FRAME) == 0) { |
- std::string referer_str; |
- if (!request.extra_headers.GetHeader(HttpRequestHeaders::kReferer, |
- &referer_str)) { |
- // Require a referer. |
- return true; |
- } |
- GURL referer(referer_str); |
- if (!HostPortPair::FromURL(request.url).Equals( |
- HostPortPair::FromURL(referer))) { |
- // Cross-origin request. |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-HpackEncoder* HpackHuffmanAggregator::ObtainEncoder(const SpdySessionKey& key) { |
- for (OriginEncoders::iterator it = encoders_.begin(); |
- it != encoders_.end(); ++it) { |
- if (key.Equals(it->first)) { |
- // Move to head of list and return. |
- OriginEncoder origin_encoder = *it; |
- encoders_.erase(it); |
- encoders_.push_front(origin_encoder); |
- return origin_encoder.second; |
- } |
- } |
- // Not found. Create a new encoder, evicting one if needed. |
- encoders_.push_front(std::make_pair( |
- key, new HpackEncoder(ObtainHpackHuffmanTable()))); |
- if (encoders_.size() > max_encoders_) { |
- delete encoders_.back().second; |
- encoders_.pop_back(); |
- } |
- encoders_.front().second->SetCharCountsStorage(&counts_, &total_counts_); |
- return encoders_.front().second; |
-} |
- |
-void HpackHuffmanAggregator::PublishCounts() { |
- // base::Histogram requires that values be 1-indexed. |
- const size_t kRangeMin = 1; |
- const size_t kRangeMax = counts_.size() + 1; |
- const size_t kBucketCount = kRangeMax + 1; |
- |
- base::BucketRanges ranges(kBucketCount + 1); |
- for (size_t i = 0; i != ranges.size(); ++i) { |
- ranges.set_range(i, i); |
- } |
- ranges.ResetChecksum(); |
- |
- // Copy |counts_| into a SampleVector. |
- base::SampleVector samples(&ranges); |
- for (size_t i = 0; i != counts_.size(); ++i) { |
- samples.Accumulate(i + 1, counts_[i]); |
- } |
- |
- STATIC_HISTOGRAM_POINTER_BLOCK( |
- kHistogramName, |
- AddSamples(samples), |
- base::LinearHistogram::FactoryGet( |
- kHistogramName, kRangeMin, kRangeMax, kBucketCount, |
- base::HistogramBase::kUmaTargetedHistogramFlag)); |
- |
- // Clear counts. |
- counts_.assign(counts_.size(), 0); |
- total_counts_ = 0; |
-} |
- |
-} // namespace net |