1
#pragma once
2

            
3
#include <chrono>
4
#include <cstdint>
5
#include <memory>
6
#include <vector>
7

            
8
#include "envoy/config/route/v3/route_components.pb.h"
9
#include "envoy/config/route/v3/route_components.pb.validate.h"
10
#include "envoy/router/router.h"
11
#include "envoy/server/factory_context.h"
12

            
13
#include "absl/types/optional.h"
14

            
15
namespace Envoy {
16
namespace Router {
17

            
18
/**
19
 * Implementation of RetryPolicy that reads from the proto route or virtual host config.
20
 */
21
class RetryPolicyImpl : public RetryPolicy {
22

            
23
public:
24
  static RetryPolicyConstSharedPtr DefaultRetryPolicy;
25

            
26
  static absl::StatusOr<std::shared_ptr<RetryPolicyImpl>>
27
  create(const envoy::config::route::v3::RetryPolicy& retry_policy,
28
         ProtobufMessage::ValidationVisitor& validation_visitor,
29
         Server::Configuration::CommonFactoryContext& common_context);
30
1314
  RetryPolicyImpl() = default;
31

            
32
  // Router::RetryPolicy
33
47126
  std::chrono::milliseconds perTryTimeout() const override { return per_try_timeout_; }
34
47112
  std::chrono::milliseconds perTryIdleTimeout() const override { return per_try_idle_timeout_; }
35
3196
  uint32_t numRetries() const override { return num_retries_; }
36
49559
  uint32_t retryOn() const override { return retry_on_; }
37
  std::vector<Upstream::RetryHostPredicateSharedPtr> retryHostPredicates() const override;
38
  Upstream::RetryPrioritySharedPtr retryPriority() const override;
39
  absl::Span<const Upstream::RetryOptionsPredicateConstSharedPtr>
40
231
  retryOptionsPredicates() const override {
41
231
    return retry_options_predicates_;
42
231
  }
43
3169
  uint32_t hostSelectionMaxAttempts() const override { return host_selection_attempts_; }
44
3170
  const std::vector<uint32_t>& retriableStatusCodes() const override {
45
3170
    return retriable_status_codes_;
46
3170
  }
47
3174
  const std::vector<Http::HeaderMatcherSharedPtr>& retriableHeaders() const override {
48
3174
    return retriable_headers_;
49
3174
  }
50
3169
  const std::vector<Http::HeaderMatcherSharedPtr>& retriableRequestHeaders() const override {
51
3169
    return retriable_request_headers_;
52
3169
  }
53
3233
  absl::optional<std::chrono::milliseconds> baseInterval() const override { return base_interval_; }
54
3218
  absl::optional<std::chrono::milliseconds> maxInterval() const override { return max_interval_; }
55
3174
  const std::vector<ResetHeaderParserSharedPtr>& resetHeaders() const override {
56
3174
    return reset_headers_;
57
3174
  }
58
3172
  std::chrono::milliseconds resetMaxInterval() const override { return reset_max_interval_; }
59

            
60
private:
61
  RetryPolicyImpl(const envoy::config::route::v3::RetryPolicy& retry_policy,
62
                  ProtobufMessage::ValidationVisitor& validation_visitor,
63
                  Server::Configuration::CommonFactoryContext& common_context,
64
                  absl::Status& creation_status);
65
  std::chrono::milliseconds per_try_timeout_{0};
66
  std::chrono::milliseconds per_try_idle_timeout_{0};
67
  // We set the number of retries to 1 by default (i.e. when no route or vhost level retry policy is
68
  // set) so that when retries get enabled through the x-envoy-retry-on header we default to 1
69
  // retry.
70
  uint32_t num_retries_{1};
71
  uint32_t retry_on_{};
72
  // Each pair contains the name and config proto to be used to create the RetryHostPredicates
73
  // that should be used when with this policy.
74
  std::vector<std::pair<Upstream::RetryHostPredicateFactory&, ProtobufTypes::MessagePtr>>
75
      retry_host_predicate_configs_;
76
  // Name and config proto to use to create the RetryPriority to use with this policy. Default
77
  // initialized when no RetryPriority should be used.
78
  std::pair<Upstream::RetryPriorityFactory*, ProtobufTypes::MessagePtr> retry_priority_config_;
79
  uint32_t host_selection_attempts_{1};
80
  std::vector<uint32_t> retriable_status_codes_;
81
  std::vector<Http::HeaderMatcherSharedPtr> retriable_headers_;
82
  std::vector<Http::HeaderMatcherSharedPtr> retriable_request_headers_;
83
  absl::optional<std::chrono::milliseconds> base_interval_;
84
  absl::optional<std::chrono::milliseconds> max_interval_;
85
  std::vector<ResetHeaderParserSharedPtr> reset_headers_;
86
  std::chrono::milliseconds reset_max_interval_{300000};
87
  ProtobufMessage::ValidationVisitor* validation_visitor_{};
88
  std::vector<Upstream::RetryOptionsPredicateConstSharedPtr> retry_options_predicates_;
89
};
90

            
91
} // namespace Router
92
} // namespace Envoy