| // 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 <list> |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "net/base/net_export.h" |
| #include "net/spdy/spdy_header_block.h" |
| #include "net/spdy/spdy_protocol.h" |
| #include "net/spdy/spdy_session_key.h" |
| |
| namespace net { |
| |
| class HpackEncoder; |
| class HttpRequestHeaders; |
| struct HttpRequestInfo; |
| class HttpResponseHeaders; |
| class ProxyServer; |
| |
| namespace test { |
| class HpackHuffmanAggregatorPeer; |
| } // namespace test |
| |
| class NET_EXPORT_PRIVATE HpackHuffmanAggregator { |
| public: |
| friend class test::HpackHuffmanAggregatorPeer; |
| |
| HpackHuffmanAggregator(); |
| ~HpackHuffmanAggregator(); |
| |
| // Encodes the request and response headers of the transaction with an |
| // HpackEncoder keyed on the transaction's SpdySessionKey. Literal headers |
| // emitted by that encoder are aggregated into internal character counts, |
| // which are periodically published to a UMA histogram. |
| void AggregateTransactionCharacterCounts( |
| const HttpRequestInfo& request, |
| const HttpRequestHeaders& request_headers, |
| const ProxyServer& proxy, |
| const HttpResponseHeaders& response_headers); |
| |
| // Returns whether the aggregator is enabled for the session by a field trial. |
| static bool UseAggregator(); |
| |
| private: |
| typedef std::pair<SpdySessionKey, HpackEncoder*> OriginEncoder; |
| typedef std::list<OriginEncoder> OriginEncoders; |
| |
| // Returns true if the request is considered cross-origin, |
| // and should not be aggregated. |
| static bool IsCrossOrigin(const HttpRequestInfo& request); |
| |
| // Converts |headers| into SPDY headers block |headers_out|. |
| static void CreateSpdyHeadersFromHttpResponse( |
| const HttpResponseHeaders& headers, |
| SpdyHeaderBlock* headers_out); |
| |
| // Creates or returns an encoder for the origin key. |
| HpackEncoder* ObtainEncoder(const SpdySessionKey& key); |
| |
| // Publishes aggregated counts to a UMA histogram. |
| void PublishCounts(); |
| |
| std::vector<size_t> counts_; |
| size_t total_counts_; |
| |
| OriginEncoders encoders_; |
| size_t max_encoders_; |
| |
| DISALLOW_COPY_AND_ASSIGN(HpackHuffmanAggregator); |
| }; |
| |
| } // namespace net |