Coverage Report

Created: 2023-11-12 09:30

/proc/self/cwd/source/common/router/header_parser.h
Line
Count
Source
1
#pragma once
2
3
#include <string>
4
#include <vector>
5
6
#include "envoy/access_log/access_log.h"
7
#include "envoy/config/core/v3/base.pb.h"
8
#include "envoy/http/header_evaluator.h"
9
#include "envoy/http/header_map.h"
10
11
#include "source/common/http/header_map_impl.h"
12
#include "source/common/protobuf/protobuf.h"
13
14
namespace Envoy {
15
namespace Router {
16
17
class HeaderParser;
18
using HeaderParserPtr = std::unique_ptr<HeaderParser>;
19
20
using HeaderAppendAction = envoy::config::core::v3::HeaderValueOption::HeaderAppendAction;
21
using HeaderValueOption = envoy::config::core::v3::HeaderValueOption;
22
using HeaderValue = envoy::config::core::v3::HeaderValue;
23
24
struct HeadersToAddEntry {
25
  HeadersToAddEntry(const HeaderValue& header_value, HeaderAppendAction append_action);
26
  HeadersToAddEntry(const HeaderValueOption& header_value_option);
27
28
  std::string original_value_;
29
  bool add_if_empty_ = false;
30
31
  Formatter::FormatterPtr formatter_;
32
  HeaderAppendAction append_action_;
33
};
34
35
/**
36
 * HeaderParser manipulates Http::HeaderMap instances. Headers to be added are pre-parsed to select
37
 * between a constant value implementation and a dynamic value implementation based on
38
 * StreamInfo::StreamInfo fields.
39
 */
40
class HeaderParser : public Http::HeaderEvaluator {
41
public:
42
  /*
43
   * @param headers_to_add defines the headers to add during calls to evaluateHeaders
44
   * @return HeaderParserPtr a configured HeaderParserPtr
45
   */
46
  static HeaderParserPtr
47
  configure(const Protobuf::RepeatedPtrField<HeaderValueOption>& headers_to_add);
48
49
  /*
50
   * @param headers_to_add defines headers to add during calls to evaluateHeaders.
51
   * @param append_action defines action taken to append/overwrite the given value for an existing
52
   * header or to only add this header if it's absent.
53
   * @return HeaderParserPtr a configured HeaderParserPtr.
54
   */
55
  static HeaderParserPtr
56
  configure(const Protobuf::RepeatedPtrField<envoy::config::core::v3::HeaderValue>& headers_to_add,
57
            HeaderAppendAction append_action);
58
59
  /*
60
   * @param headers_to_add defines headers to add during calls to evaluateHeaders
61
   * @param headers_to_remove defines headers to remove during calls to evaluateHeaders
62
   * @return HeaderParserPtr a configured HeaderParserPtr
63
   */
64
  static HeaderParserPtr
65
  configure(const Protobuf::RepeatedPtrField<HeaderValueOption>& headers_to_add,
66
            const Protobuf::RepeatedPtrField<std::string>& headers_to_remove);
67
68
9.59k
  static const HeaderParser& defaultParser() {
69
9.59k
    static HeaderParser* instance = new HeaderParser();
70
9.59k
    return *instance;
71
9.59k
  }
72
73
  void evaluateHeaders(Http::HeaderMap& headers, const Formatter::HttpFormatterContext& context,
74
                       const StreamInfo::StreamInfo& stream_info) const override;
75
76
  void evaluateHeaders(Http::HeaderMap& headers, const Formatter::HttpFormatterContext& context,
77
                       const StreamInfo::StreamInfo* stream_info) const;
78
79
  /**
80
   * Helper methods to evaluate methods without explicitly passing request and response headers.
81
   * The method will try to fetch request headers from steam_info. Response headers will always be
82
   * empty.
83
   */
84
29.9k
  void evaluateHeaders(Http::HeaderMap& headers, const StreamInfo::StreamInfo& stream_info) const {
85
29.9k
    evaluateHeaders(headers, {stream_info.getRequestHeaders()}, &stream_info);
86
29.9k
  }
87
1.49k
  void evaluateHeaders(Http::HeaderMap& headers, const StreamInfo::StreamInfo* stream_info) const {
88
1.49k
    evaluateHeaders(headers,
89
1.49k
                    Formatter::HttpFormatterContext{
90
1.49k
                        stream_info == nullptr ? nullptr : stream_info->getRequestHeaders()},
91
1.49k
                    stream_info);
92
1.49k
  }
93
94
  /*
95
   * Same as evaluateHeaders, but returns the modifications that would have been made rather than
96
   * modifying an existing HeaderMap.
97
   * @param stream_info contains additional information about the request.
98
   * @param do_formatting whether or not to evaluate configured transformations; if false, returns
99
   * original values instead.
100
   */
101
  Http::HeaderTransforms getHeaderTransforms(const StreamInfo::StreamInfo& stream_info,
102
                                             bool do_formatting = true) const;
103
104
  static std::string translateMetadataFormat(const std::string& header_value);
105
  static std::string translatePerRequestState(const std::string& header_value);
106
107
protected:
108
94.0k
  HeaderParser() = default;
109
110
private:
111
  std::vector<std::pair<Http::LowerCaseString, HeadersToAddEntry>> headers_to_add_;
112
  std::vector<Http::LowerCaseString> headers_to_remove_;
113
};
114
115
} // namespace Router
116
} // namespace Envoy