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
6
          reset_headers) {
34
6
    std::vector<ResetHeaderParserSharedPtr> ret;
35
8
    for (const auto& reset_header : reset_headers) {
36
8
      ret.emplace_back(std::make_shared<ResetHeaderParserImpl>(reset_header));
37
8
    }
38
6
    return ret;
39
6
  }
40

            
41
  ResetHeaderParserImpl(const envoy::config::route::v3::RetryPolicy::ResetHeader& config);
42

            
43
3
  const Http::LowerCaseString& name() const { return name_; }
44
3
  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