Coverage Report

Created: 2023-11-12 09:30

/proc/self/cwd/source/common/router/reset_header_parser.h
Line
Count
Source (jump to first uncovered line)
1
#pragma once
2
3
#include <chrono>
4
#include <memory>
5
#include <vector>
6
7
#include "envoy/common/time.h"
8
#include "envoy/config/route/v3/route_components.pb.h"
9
#include "envoy/http/header_map.h"
10
#include "envoy/router/router.h"
11
12
#include "source/common/protobuf/protobuf.h"
13
14
#include "absl/types/optional.h"
15
16
namespace Envoy {
17
namespace Router {
18
19
enum class ResetHeaderFormat { Seconds, UnixTimestamp };
20
21
/**
22
 * A ResetHeaderParser specifies a header name and a format to match against
23
 * response headers that are used to signal a rate limit interval reset, such
24
 * as Retry-After or X-RateLimit-Reset.
25
 */
26
class ResetHeaderParserImpl : public ResetHeaderParser {
27
public:
28
  /**
29
   * Build a vector of ResetHeaderParserSharedPtr given input config.
30
   */
31
  static std::vector<ResetHeaderParserSharedPtr> buildResetHeaderParserVector(
32
      const Protobuf::RepeatedPtrField<envoy::config::route::v3::RetryPolicy::ResetHeader>&
33
7.36k
          reset_headers) {
34
7.36k
    std::vector<ResetHeaderParserSharedPtr> ret;
35
25.1k
    for (const auto& reset_header : reset_headers) {
36
25.1k
      ret.emplace_back(std::make_shared<ResetHeaderParserImpl>(reset_header));
37
25.1k
    }
38
7.36k
    return ret;
39
7.36k
  }
40
41
  ResetHeaderParserImpl(const envoy::config::route::v3::RetryPolicy::ResetHeader& config);
42
43
0
  const Http::LowerCaseString& name() const { return name_; }
44
0
  ResetHeaderFormat format() const { return format_; }
45
46
  /**
47
   * Iterate over the headers, choose the first one that matches by name, and try to parse its
48
   * value.
49
   */
50
  absl::optional<std::chrono::milliseconds>
51
  parseInterval(TimeSource& time_source, const Http::HeaderMap& headers) const override;
52
53
private:
54
  const Http::LowerCaseString name_;
55
  ResetHeaderFormat format_;
56
};
57
58
} // namespace Router
59
} // namespace Envoy