| #ifndef QUICHE_HTTP2_ADAPTER_HEADER_VALIDATOR_H_ |
| #define QUICHE_HTTP2_ADAPTER_HEADER_VALIDATOR_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include "absl/strings/string_view.h" |
| #include "absl/types/optional.h" |
| #include "common/platform/api/quiche_export.h" |
| |
| namespace http2 { |
| namespace adapter { |
| |
| enum class HeaderType : uint8_t { |
| REQUEST, |
| REQUEST_TRAILER, |
| RESPONSE_100, |
| RESPONSE, |
| RESPONSE_TRAILER, |
| }; |
| |
| class QUICHE_EXPORT_PRIVATE HeaderValidator { |
| public: |
| HeaderValidator() {} |
| |
| void SetMaxFieldSize(uint32_t field_size) { max_field_size_ = field_size; } |
| |
| // If called, this validator will allow the `:protocol` pseudo-header, as |
| // described in RFC 8441. |
| void AllowConnect() { allow_connect_ = true; } |
| |
| void StartHeaderBlock(); |
| |
| enum HeaderStatus { |
| HEADER_OK, |
| HEADER_FIELD_INVALID, |
| HEADER_FIELD_TOO_LONG, |
| }; |
| HeaderStatus ValidateSingleHeader(absl::string_view key, |
| absl::string_view value); |
| |
| // Returns true if all required pseudoheaders and no extra pseudoheaders are |
| // present for the given header type. |
| bool FinishHeaderBlock(HeaderType type); |
| |
| // For responses, returns the value of the ":status" header, if present. |
| absl::string_view status_header() const { return status_; } |
| |
| absl::optional<size_t> content_length() const { return content_length_; } |
| |
| private: |
| bool HandleContentLength(absl::string_view value); |
| |
| std::vector<std::string> pseudo_headers_; |
| std::string status_; |
| std::string method_; |
| std::string path_; |
| absl::optional<size_t> max_field_size_; |
| absl::optional<size_t> content_length_; |
| bool allow_connect_ = false; |
| }; |
| |
| } // namespace adapter |
| } // namespace http2 |
| |
| #endif // QUICHE_HTTP2_ADAPTER_HEADER_VALIDATOR_H_ |