// Copyright (c) 2018 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_QUIC_CORE_QPACK_QPACK_INSTRUCTIONS_H_ #define QUICHE_QUIC_CORE_QPACK_QPACK_INSTRUCTIONS_H_ #include <cstdint> #include <string> #include <tuple> #include <vector> #include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_export.h" namespace quic { namespace test { class QpackInstructionWithValuesPeer; } // namespace test // Each instruction is identified with an opcode in the first byte. // |mask| determines which bits are part of the opcode. // |value| is the value of these bits. (Other bits in value must be zero.) struct QUICHE_EXPORT QpackInstructionOpcode { … }; bool operator==(const QpackInstructionOpcode& a, const QpackInstructionOpcode& b); // Possible types of an instruction field. Decoding a static bit does not // consume the current byte. Decoding an integer or a length-prefixed string // literal consumes all bytes containing the field value. enum class QpackInstructionFieldType { … }; // Each instruction field has a type and a parameter. // The meaning of the parameter depends on the field type. struct QUICHE_EXPORT QpackInstructionField { … }; QpackInstructionFields; // A QPACK instruction consists of an opcode identifying the instruction, // followed by a non-empty list of fields. The last field must be integer or // string literal type to guarantee that all bytes of the instruction are // consumed. struct QUICHE_EXPORT QpackInstruction { … }; // A language is a collection of instructions. The order does not matter. // Every possible input must match exactly one instruction. QpackLanguage; // Wire format defined in // https://rfc-editor.org/rfc/rfc9204.html#section-4 // 5.2 Encoder stream instructions // 5.2.1 Insert With Name Reference const QpackInstruction* InsertWithNameReferenceInstruction(); // 5.2.2 Insert Without Name Reference const QpackInstruction* InsertWithoutNameReferenceInstruction(); // 5.2.3 Duplicate const QpackInstruction* DuplicateInstruction(); // 5.2.4 Dynamic Table Size Update const QpackInstruction* SetDynamicTableCapacityInstruction(); // Encoder stream language. const QpackLanguage* QpackEncoderStreamLanguage(); // 5.3 Decoder stream instructions // 5.3.1 Insert Count Increment const QpackInstruction* InsertCountIncrementInstruction(); // 5.3.2 Header Acknowledgement const QpackInstruction* HeaderAcknowledgementInstruction(); // 5.3.3 Stream Cancellation const QpackInstruction* StreamCancellationInstruction(); // Decoder stream language. const QpackLanguage* QpackDecoderStreamLanguage(); // 5.4.1. Header data prefix instructions const QpackInstruction* QpackPrefixInstruction(); const QpackLanguage* QpackPrefixLanguage(); // 5.4.2. Request and push stream instructions // 5.4.2.1. Indexed Header Field const QpackInstruction* QpackIndexedHeaderFieldInstruction(); // 5.4.2.2. Indexed Header Field With Post-Base Index const QpackInstruction* QpackIndexedHeaderFieldPostBaseInstruction(); // 5.4.2.3. Literal Header Field With Name Reference const QpackInstruction* QpackLiteralHeaderFieldNameReferenceInstruction(); // 5.4.2.4. Literal Header Field With Post-Base Name Reference const QpackInstruction* QpackLiteralHeaderFieldPostBaseInstruction(); // 5.4.2.5. Literal Header Field Without Name Reference const QpackInstruction* QpackLiteralHeaderFieldInstruction(); // Request and push stream language. const QpackLanguage* QpackRequestStreamLanguage(); // Storage for instruction and field values to be encoded. // This class can only be instantiated using factory methods that take exactly // the arguments that the corresponding instruction needs. class QUICHE_EXPORT QpackInstructionWithValues { … }; } // namespace quic #endif // QUICHE_QUIC_CORE_QPACK_QPACK_INSTRUCTIONS_H_