xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/core/http/metadata_decoder.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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