• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef QUICHE_HTTP2_ADAPTER_HEADER_VALIDATOR_BASE_H_
2 #define QUICHE_HTTP2_ADAPTER_HEADER_VALIDATOR_BASE_H_
3 
4 #include <cstdint>
5 #include <string>
6 
7 #include "absl/strings/string_view.h"
8 #include "absl/types/optional.h"
9 #include "quiche/common/platform/api/quiche_export.h"
10 
11 namespace http2 {
12 namespace adapter {
13 
14 enum class HeaderType : uint8_t {
15   REQUEST,
16   REQUEST_TRAILER,
17   RESPONSE_100,
18   RESPONSE,
19   RESPONSE_TRAILER,
20 };
21 
22 enum class ObsTextOption : uint8_t {
23   kAllow,
24   kDisallow,
25 };
26 
27 class QUICHE_EXPORT HeaderValidatorBase {
28  public:
29   HeaderValidatorBase() = default;
30   virtual ~HeaderValidatorBase() = default;
31 
StartHeaderBlock()32   virtual void StartHeaderBlock() {
33     status_.clear();
34     content_length_ = absl::nullopt;
35   }
36 
37   enum HeaderStatus {
38     HEADER_OK,
39     HEADER_SKIP,
40     HEADER_FIELD_INVALID,
41     HEADER_FIELD_TOO_LONG,
42   };
43   virtual HeaderStatus ValidateSingleHeader(absl::string_view key,
44                                             absl::string_view value) = 0;
45 
46   // Should return true if validation was successful.
47   virtual bool FinishHeaderBlock(HeaderType type) = 0;
48 
49   // For responses, returns the value of the ":status" header, if present.
status_header()50   absl::string_view status_header() const { return status_; }
51 
content_length()52   absl::optional<size_t> content_length() const { return content_length_; }
53 
SetMaxFieldSize(uint32_t field_size)54   void SetMaxFieldSize(uint32_t field_size) { max_field_size_ = field_size; }
SetObsTextOption(ObsTextOption option)55   void SetObsTextOption(ObsTextOption option) { obs_text_option_ = option; }
56   // Allows the "extended CONNECT" syntax described in RFC 8441.
SetAllowExtendedConnect()57   void SetAllowExtendedConnect() { allow_extended_connect_ = true; }
58 
59  protected:
60   std::string status_;
61   absl::optional<size_t> max_field_size_;
62   absl::optional<size_t> content_length_;
63   ObsTextOption obs_text_option_ = ObsTextOption::kDisallow;
64   bool allow_extended_connect_ = false;
65 };
66 
67 }  // namespace adapter
68 }  // namespace http2
69 
70 #endif  // QUICHE_HTTP2_ADAPTER_HEADER_VALIDATOR_BASE_H_
71