// 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_API_H_
#define QUICHE_BALSA_HEADER_API_H_

#include <cstddef>
#include <functional>
#include <string>
#include <vector>

#include "absl/strings/string_view.h"
#include "quiche/common/platform/api/quiche_export.h"
#include "quiche/common/platform/api/quiche_lower_case_string.h"

namespace quiche {

// An API so we can reuse functions for BalsaHeaders and Envoy's HeaderMap.
// Contains only const member functions, so it can wrap const HeaderMaps;
// non-const functions are in HeaderApi.
//
// Depending on the implementation, the headers may act like HTTP/1 headers
// (BalsaHeaders) or HTTP/2 headers (HeaderMap). For HTTP-version-specific
// headers or pseudoheaders like "host" or ":authority", use this API's
// implementation-independent member functions, like Authority(). Looking those
// headers up by name is deprecated and may QUICHE_DCHECK-fail.
// For the differences between HTTP/1 and HTTP/2 headers, see RFC 7540:
// https://tools.ietf.org/html/rfc7540#section-8.1.2
//
// Operations on header keys are case-insensitive while operations on header
// values are case-sensitive.
//
// Some methods have overloads which accept Envoy-style LowerCaseStrings. Often
// these keys are accessible from Envoy::Http::Headers::get().SomeHeader,
// already lowercaseified. It's faster to avoid converting them to and from
// lowercase. Additionally, some implementations of ConstHeaderApi might take
// advantage of a constant-time lookup for inlined headers.
class QUICHE_EXPORT_PRIVATE ConstHeaderApi {
 public:
  virtual ~ConstHeaderApi() {}

  // Determine whether the headers are empty.
  virtual bool IsEmpty() const = 0;

  // Returns the header entry for the first instance with key |key|
  // If header isn't present, returns absl::string_view().
  virtual absl::string_view GetHeader(absl::string_view key) const = 0;

  virtual absl::string_view GetHeader(const QuicheLowerCaseString& key) const {
    // Default impl for BalsaHeaders, etc.
    return GetHeader(key.get());
  }

  // Collects all of the header entries with key |key| and returns them in |out|
  // Headers are returned in the order they are inserted.
  virtual void GetAllOfHeader(absl::string_view key,
                              std::vector<absl::string_view>* out) const = 0;
  virtual std::vector<absl::string_view> GetAllOfHeader(
      absl::string_view key) const {
    std::vector<absl::string_view> out;
    GetAllOfHeader(key, &out);
    return out;
  }
  virtual void GetAllOfHeader(const QuicheLowerCaseString& key,
                              std::vector<absl::string_view>* out) const {
    return GetAllOfHeader(key.get(), out);
  }

  // Determine if a given header is present.
  virtual bool HasHeader(absl::string_view key) const = 0;

  // Determines if a given header is present with non-empty value.
  virtual bool HasNonEmptyHeader(absl::string_view key) const = 0;

  // Goes through all headers with key |key| and checks to see if one of the
  // values is |value|.  Returns true if there are headers with the desired key
  // and value, false otherwise.
  virtual bool HeaderHasValue(absl::string_view key,
                              absl::string_view value) const = 0;

  // Same as above, but value is treated as case insensitive.
  virtual bool HeaderHasValueIgnoreCase(absl::string_view key,
                                        absl::string_view value) const = 0;

  // Joins all values for header entries with `key` into a comma-separated
  // string.  Headers are returned in the order they are inserted.
  virtual std::string GetAllOfHeaderAsString(absl::string_view key) const = 0;
  virtual std::string GetAllOfHeaderAsString(
      const QuicheLowerCaseString& key) const {
    return GetAllOfHeaderAsString(key.get());
  }

  // Returns true if we have at least one header with given prefix
  // [case insensitive]. Currently for test use only.
  virtual bool HasHeadersWithPrefix(absl::string_view key) const = 0;

  // Returns the key value pairs for all headers where the header key begins
  // with the specified prefix.
  // Headers are returned in the order they are inserted.
  virtual void GetAllOfHeaderWithPrefix(
      absl::string_view prefix,
      std::vector<std::pair<absl::string_view, absl::string_view>>* out)
      const = 0;

  // Returns the key value pairs for all headers in this object. If 'limit' is
  // >= 0, return at most 'limit' headers.
  virtual void GetAllHeadersWithLimit(
      std::vector<std::pair<absl::string_view, absl::string_view>>* out,
      int limit) const = 0;

  // Returns a textual representation of the header object. The format of the
  // string may depend on the underlying implementation.
  virtual std::string DebugString() const = 0;

  // Applies the argument function to each header line.  If the argument
  // function returns false, iteration stops and ForEachHeader returns false;
  // otherwise, ForEachHeader returns true.
  virtual bool ForEachHeader(std::function<bool(const absl::string_view key,
                                                const absl::string_view value)>
                                 fn) const = 0;

  // Returns the upper bound byte size of the headers. This can be used to size
  // a Buffer when serializing headers.
  virtual size_t GetSizeForWriteBuffer() const = 0;

  // Returns the response code for response headers. If no status code exists,
  // the return value is implementation-specific.
  virtual absl::string_view response_code() const = 0;

  // Returns the response code for response headers or 0 if no status code
  // exists.
  virtual size_t parsed_response_code() const = 0;

  // Returns the response reason phrase; the stored one for HTTP/1 headers, or a
  // phrase determined from the response code for HTTP/2 headers..
  virtual absl::string_view response_reason_phrase() const = 0;

  // Return the HTTP first line of this request, generally of the format:
  // GET /path/ HTTP/1.1
  // TODO(b/110421449): deprecate this method.
  virtual std::string first_line_of_request() const = 0;

  // Return the method for this request, such as GET or POST.
  virtual absl::string_view request_method() const = 0;

  // Return the request URI from the first line of this request, such as
  // "/path/".
  virtual absl::string_view request_uri() const = 0;

  // Return the version portion of the first line of this request, such as
  // "HTTP/1.1".
  // TODO(b/110421449): deprecate this method.
  virtual absl::string_view request_version() const = 0;

  virtual absl::string_view response_version() const = 0;

  // Returns the authority portion of a request, or an empty string if missing.
  // This is the value of the host header for HTTP/1 headers and the value of
  // the :authority pseudo-header for HTTP/2 headers.
  virtual absl::string_view Authority() const = 0;

  // Call the provided function on the cookie, avoiding
  // copies if possible. The cookie is the value of the Cookie header; for
  // HTTP/2 headers, if there are multiple Cookie headers, they will be joined
  // by "; ", per go/rfc/7540#section-8.1.2.5. If there is no Cookie header,
  // cookie.data() will be nullptr. The lifetime of the cookie isn't guaranteed
  // to extend beyond this call.
  virtual void ApplyToCookie(
      std::function<void(absl::string_view cookie)> f) const = 0;

  virtual size_t content_length() const = 0;
  virtual bool content_length_valid() const = 0;

  // TODO(b/118501626): Add functions for working with other headers and
  // pseudo-headers whose presence or value depends on HTTP version, including:
  // :method, :scheme, :path, connection, and cookie.
};

// An API so we can reuse functions for BalsaHeaders and Envoy's HeaderMap.
// Inherits const functions from ConstHeaderApi and adds non-const functions,
// for use with non-const HeaderMaps.
//
// For HTTP-version-specific headers and pseudo-headers, the same caveats apply
// as with ConstHeaderApi.
//
// Operations on header keys are case-insensitive while operations on header
// values are case-sensitive.
class QUICHE_EXPORT_PRIVATE HeaderApi : public virtual ConstHeaderApi {
 public:
  // Replaces header entries with key |key| if they exist, or appends
  // a new header if none exist.
  virtual void ReplaceOrAppendHeader(absl::string_view key,
                                     absl::string_view value) = 0;

  // Removes all headers in given set of |keys| at once
  virtual void RemoveAllOfHeaderInList(
      const std::vector<absl::string_view>& keys) = 0;

  // Removes all headers with key |key|.
  virtual void RemoveAllOfHeader(absl::string_view key) = 0;

  // Append a new header entry to the header object with key |key| and value
  // |value|.
  virtual void AppendHeader(absl::string_view key, absl::string_view value) = 0;

  // Removes all headers starting with 'key' [case insensitive]
  virtual void RemoveAllHeadersWithPrefix(absl::string_view key) = 0;

  // Appends ',value' to an existing header named 'key'.  If no header with the
  // correct key exists, it will call AppendHeader(key, value).  Calling this
  // function on a key which exists several times in the headers will produce
  // unpredictable results.
  virtual void AppendToHeader(absl::string_view key,
                              absl::string_view value) = 0;

  // Appends ', value' to an existing header named 'key'.  If no header with the
  // correct key exists, it will call AppendHeader(key, value).  Calling this
  // function on a key which exists several times in the headers will produce
  // unpredictable results.
  virtual void AppendToHeaderWithCommaAndSpace(absl::string_view key,
                                               absl::string_view value) = 0;

  // Set the header or pseudo-header corresponding to the authority portion of a
  // request: host for HTTP/1 headers, or :authority for HTTP/2 headers.
  virtual void ReplaceOrAppendAuthority(absl::string_view value) = 0;
  virtual void RemoveAuthority() = 0;

  // These set portions of the first line for HTTP/1 headers, or the
  // corresponding pseudo-headers for HTTP/2 headers.
  virtual void SetRequestMethod(absl::string_view method) = 0;
  virtual void SetResponseCode(absl::string_view code) = 0;
  // As SetResponseCode, but slightly faster for BalsaHeaders if the caller
  // represents the response code as an integer and not a string.
  virtual void SetParsedResponseCodeAndUpdateFirstline(
      size_t parsed_response_code) = 0;

  // Sets the request URI.
  //
  // For HTTP/1 headers, sets the request URI portion of the first line (the
  // second token). Doesn't parse the URI; leaves the Host header unchanged.
  //
  // For HTTP/2 headers, sets the :path pseudo-header, and also :scheme and
  // :authority if they're present in the URI; otherwise, leaves :scheme and
  // :authority unchanged.
  //
  // The caller is responsible for verifying that the URI is in a valid format.
  virtual void SetRequestUri(absl::string_view uri) = 0;

  // These are only meaningful for HTTP/1 headers; for HTTP/2 headers, they do
  // nothing.
  virtual void SetRequestVersion(absl::string_view version) = 0;
  virtual void SetResponseVersion(absl::string_view version) = 0;
  virtual void SetResponseReasonPhrase(absl::string_view reason_phrase) = 0;

  // SetContentLength, SetTransferEncodingToChunkedAndClearContentLength, and
  // SetNoTransferEncoding modifies the header object to use
  // content-length and transfer-encoding headers in a consistent
  // manner. They set all internal flags and status, if applicable, so client
  // can get a consistent view from various accessors.
  virtual void SetContentLength(size_t length) = 0;
  // Sets transfer-encoding to chunked and updates internal state.
  virtual void SetTransferEncodingToChunkedAndClearContentLength() = 0;
  // Removes transfer-encoding headers and updates internal state.
  virtual void SetNoTransferEncoding() = 0;

  // If true, QUICHE_BUG if a header that starts with an invalid prefix is
  // explicitly set. Not implemented for Envoy headers; can only be set false.
  virtual void set_enforce_header_policy(bool enforce) = 0;
};

}  // namespace quiche

#endif  // QUICHE_BALSA_HEADER_API_H_
