blob: 678735bc78c5bf1b323c02c5598974e7951a9481 [file] [log] [blame]
// Copyright 2022 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef QUICHE_BALSA_HEADER_PROPERTIES_H_
#define QUICHE_BALSA_HEADER_PROPERTIES_H_
#include <cstdint>
#include "absl/strings/string_view.h"
#include "quiche/common/platform/api/quiche_export.h"
namespace quiche::header_properties {
// Returns true if RFC 2616 Section 14 (or other relevant standards or
// practices) indicates that header can have multiple values. Note that nothing
// stops clients from sending multiple values of other headers, so this may not
// be perfectly reliable in practice.
QUICHE_EXPORT bool IsMultivaluedHeader(absl::string_view header);
// An array of characters that are invalid in HTTP header field names.
// These are control characters, including \t, \n, \r, as well as space and
// (),/;<=>?@[\]{} and \x7f (see
// https://www.rfc-editor.org/rfc/rfc9110.html#section-5.6.2, also
// https://tools.ietf.org/html/rfc7230#section-3.2.6).
inline constexpr char kInvalidHeaderKeyCharList[] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13,
0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
0x1E, 0x1F, ' ', '"', '(', ')', ',', '/', ';', '<',
'=', '>', '?', '@', '[', '\\', ']', '{', '}', 0x7F};
// This is a non-compliant variant of `kInvalidHeaderKeyCharList`
// that allows the character '"'.
inline constexpr char kInvalidHeaderKeyCharListAllowDoubleQuote[] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13,
0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
0x1E, 0x1F, ' ', '(', ')', ',', '/', ';', '<', '=',
'>', '?', '@', '[', '\\', ']', '{', '}', 0x7F};
// An array of characters that are invalid in HTTP header field values,
// according to RFC 7230 Section 3.2. Valid low characters not in this array
// are \t (0x09), \n (0x0A), and \r (0x0D).
// Note that HTTP header field names are even more restrictive.
inline constexpr char kInvalidHeaderCharList[] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0B,
0x0C, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x7F};
// The set of characters allowed in the Path and Query components of a URI, as
// described in RFC 3986 Sections 3.3 and 3.4. Also includes the following
// characters, which are not actually valid, but are seen in request paths on
// the internet and unlikely to cause problems: []{}|^ and backslash.
inline constexpr char kValidPathCharList[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%!$&'()*"
"+,;=:@/?[]{}|^\\";
// Returns true if the given `c` is invalid in a header field name. The first
// version is spec compliant, the second one incorrectly allows '"'.
QUICHE_EXPORT bool IsInvalidHeaderKeyChar(uint8_t c);
QUICHE_EXPORT bool IsInvalidHeaderKeyCharAllowDoubleQuote(uint8_t c);
// Returns true if the given `c` is invalid in a header field or the `value` has
// invalid characters.
QUICHE_EXPORT bool IsInvalidHeaderChar(uint8_t c);
QUICHE_EXPORT bool HasInvalidHeaderChars(absl::string_view value);
// Returns true if `value` contains a character not allowed in a path or query
// component of a URI.
QUICHE_EXPORT bool HasInvalidPathChar(absl::string_view value);
} // namespace quiche::header_properties
#endif // QUICHE_BALSA_HEADER_PROPERTIES_H_