| // 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 QUICHE_SPDY_CORE_HPACK_HPACK_ENTRY_H_ |
| #define QUICHE_SPDY_CORE_HPACK_HPACK_ENTRY_H_ |
| |
| #include <cstddef> |
| #include <cstdint> |
| #include <string> |
| #include <utility> |
| |
| #include "absl/strings/string_view.h" |
| #include "common/platform/api/quiche_export.h" |
| |
| // All section references below are to |
| // http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-08 |
| |
| namespace spdy { |
| |
| // The constant amount added to name().size() and value().size() to |
| // get the size of an HpackEntry as defined in 5.1. |
| constexpr size_t kHpackEntrySizeOverhead = 32; |
| |
| // A structure for looking up entries in the static and dynamic tables. |
| struct QUICHE_EXPORT_PRIVATE HpackLookupEntry { |
| absl::string_view name; |
| absl::string_view value; |
| |
| bool operator==(const HpackLookupEntry& other) const { |
| return name == other.name && value == other.value; |
| } |
| |
| // Abseil hashing framework extension according to absl/hash/hash.h: |
| template <typename H> |
| friend H AbslHashValue(H h, const HpackLookupEntry& entry) { |
| return H::combine(std::move(h), entry.name, entry.value); |
| } |
| }; |
| |
| // A structure for an entry in the static table (3.3.1) |
| // and the header table (3.3.2). |
| class QUICHE_EXPORT_PRIVATE HpackEntry { |
| public: |
| HpackEntry(std::string name, std::string value); |
| |
| // Make HpackEntry non-copyable to make sure it is always moved. |
| HpackEntry(const HpackEntry&) = delete; |
| HpackEntry& operator=(const HpackEntry&) = delete; |
| |
| HpackEntry(HpackEntry&&) = default; |
| HpackEntry& operator=(HpackEntry&&) = default; |
| |
| // Getters for std::string members traditionally return const std::string&. |
| // However, HpackHeaderTable uses string_view as keys in the maps |
| // static_name_index_ and dynamic_name_index_. If HpackEntry::name() returned |
| // const std::string&, then |
| // dynamic_name_index_.insert(std::make_pair(entry.name(), index)); |
| // would silently create a dangling reference: make_pair infers type from the |
| // return type of entry.name() and silently creates a temporary string copy. |
| // Insert creates a string_view that points to this copy, which then |
| // immediately goes out of scope and gets destroyed. While this is quite easy |
| // to avoid, for example, by explicitly specifying type as a template |
| // parameter to make_pair, returning string_view here is less error-prone. |
| absl::string_view name() const { return name_; } |
| absl::string_view value() const { return value_; } |
| |
| // Returns the size of an entry as defined in 5.1. |
| static size_t Size(absl::string_view name, absl::string_view value); |
| size_t Size() const; |
| |
| std::string GetDebugString() const; |
| |
| // Returns the estimate of dynamically allocated memory in bytes. |
| size_t EstimateMemoryUsage() const; |
| |
| private: |
| std::string name_; |
| std::string value_; |
| }; |
| |
| } // namespace spdy |
| |
| #endif // QUICHE_SPDY_CORE_HPACK_HPACK_ENTRY_H_ |