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