// 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. #ifndef NET_SPDY_HPACK_ENTRY_H_ #define NET_SPDY_HPACK_ENTRY_H_ #include <cstddef> #include <set> #include <string> #include "base/basictypes.h" #include "base/macros.h" #include "base/strings/string_piece.h" #include "net/base/net_export.h" // All section references below are to // http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-07 namespace net { // A structure for an entry in the header table (3.1.2) and the // reference set (3.1.3). class NET_EXPORT_PRIVATE HpackEntry { public: // The constant amount added to name().size() and value().size() to // get the size of an HpackEntry as defined in 3.3.1. static const size_t kSizeOverhead; // Creates an entry. Preconditions: // - |is_static| captures whether this entry is a member of the static // or dynamic header table. // - |insertion_index| is this entry's index in the total set of entries ever // inserted into the header table (including static entries). // // The combination of |is_static| and |insertion_index| allows an // HpackEntryTable to determine the index of an HpackEntry in O(1) time. HpackEntry(base::StringPiece name, base::StringPiece value, bool is_static, size_t insertion_index); // Create a 'lookup' entry (only) suitable for querying a HpackEntrySet. The // instance InsertionIndex() always returns 0 and IsLookup() returns true. HpackEntry(base::StringPiece name, base::StringPiece value); // Creates an entry with empty name and value. Only defined so that // entries can be stored in STL containers. HpackEntry(); ~HpackEntry(); const std::string& name() const { return name_; } const std::string& value() const { return value_; } // Returns whether this entry is a member of the static (as opposed to // dynamic) table. bool IsStatic() const { return type_ == STATIC; } // Returns whether this entry is a lookup-only entry. bool IsLookup() const { return type_ == LOOKUP; } // Returns and sets the state of the entry, or zero if never set. // The semantics of |state| are specific to the encoder or decoder. uint8 state() const { return state_; } void set_state(uint8 state) { state_ = state; } // Used to compute the entry's index in the header table. size_t InsertionIndex() const { return insertion_index_; } // Returns the size of an entry as defined in 3.3.1. static size_t Size(base::StringPiece name, base::StringPiece value); size_t Size() const; std::string GetDebugString() const; private: enum EntryType { LOOKUP, DYNAMIC, STATIC, }; // TODO(jgraettinger): Reduce copies, possibly via SpdyPinnableBufferPiece. std::string name_; std::string value_; // The entry's index in the total set of entries ever inserted into the header // table. size_t insertion_index_; uint8 state_; EntryType type_; }; } // namespace net #endif // NET_SPDY_HPACK_ENTRY_H_