1 // Copyright 2024 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef QUICHE_QUIC_CORE_HTTP_METADATA_DECODER_H_ 6 #define QUICHE_QUIC_CORE_HTTP_METADATA_DECODER_H_ 7 8 #include <sys/types.h> 9 10 #include <cstddef> 11 #include <string> 12 13 #include "absl/strings/string_view.h" 14 #include "quiche/quic/core/http/quic_header_list.h" 15 #include "quiche/quic/core/qpack/qpack_decoded_headers_accumulator.h" 16 #include "quiche/quic/core/qpack/qpack_decoder.h" 17 #include "quiche/quic/core/quic_error_codes.h" 18 #include "quiche/quic/core/quic_types.h" 19 #include "quiche/common/platform/api/quiche_export.h" 20 21 namespace quic { 22 23 // Class for decoding the payload of HTTP/3 METADATA frames. 24 class QUICHE_EXPORT MetadataDecoder { 25 public: 26 MetadataDecoder(QuicStreamId id, size_t max_header_list_size, 27 size_t frame_header_len, size_t payload_length); 28 29 // Incrementally decodes the next bytes of METADATA frame payload 30 // and returns true if there were no errors. 31 bool Decode(absl::string_view payload); 32 33 // Finishes the decoding. Must be called after the full frame payload 34 // has been decoded. Returns true if there were no errors. 35 bool EndHeaderBlock(); 36 error_message()37 const std::string& error_message() { return decoder_.error_message(); } frame_len()38 size_t frame_len() { return frame_len_; } headers()39 const QuicHeaderList& headers() { return decoder_.headers(); } 40 41 private: 42 class MetadataHeadersDecoder 43 : public QpackDecodedHeadersAccumulator::Visitor { 44 public: 45 // QpackDecodedHeadersAccumulator::Visitor 46 void OnHeadersDecoded(QuicHeaderList headers, 47 bool header_list_size_limit_exceeded) override; 48 void OnHeaderDecodingError(QuicErrorCode error_code, 49 absl::string_view error_message) override; 50 error_code()51 QuicErrorCode error_code() { return error_code_; } error_message()52 const std::string& error_message() { return error_message_; } headers()53 QuicHeaderList& headers() { return headers_; } header_list_size_limit_exceeded()54 bool header_list_size_limit_exceeded() { 55 return header_list_size_limit_exceeded_; 56 } 57 58 private: 59 QuicErrorCode error_code_ = QUIC_NO_ERROR; 60 QuicHeaderList headers_; 61 std::string error_message_; 62 bool header_list_size_limit_exceeded_ = false; 63 }; 64 65 NoopEncoderStreamErrorDelegate delegate_; 66 QpackDecoder qpack_decoder_; 67 MetadataHeadersDecoder decoder_; 68 QpackDecodedHeadersAccumulator accumulator_; 69 const size_t frame_len_; 70 size_t bytes_remaining_ = 0; // Debug only. 71 }; 72 73 } // namespace quic 74 75 #endif // QUICHE_QUIC_CORE_HTTP_METADATA_DECODER_H_ 76