1
#pragma once
2

            
3
#include "envoy/http/filter.h"
4

            
5
#include "source/common/router/rds_impl.h"
6
#include "source/common/router/scoped_rds.h"
7

            
8
namespace Envoy {
9
namespace Http {
10

            
11
class RdsRouteConfigUpdateRequester : public RouteConfigUpdateRequester {
12
public:
13
  RdsRouteConfigUpdateRequester(Router::RouteConfigProvider* route_config_provider)
14
93441
      : route_config_provider_(route_config_provider) {}
15

            
16
  RdsRouteConfigUpdateRequester(Config::ConfigProvider* scoped_route_config_provider,
17
                                OptRef<const Router::ScopeKeyBuilder> scope_key_builder)
18
      // Expect the dynamic cast to succeed because only ScopedRdsConfigProvider is fully
19
      // implemented. Inline provider will be cast to nullptr here but it is not full implemented
20
      // and can't not be used at this point. Should change this implementation if we have a
21
      // functional inline scope route provider in the future.
22
      : scoped_route_config_provider_(
23
183
            dynamic_cast<Router::ScopedRdsConfigProvider*>(scoped_route_config_provider)),
24
183
        scope_key_builder_(scope_key_builder) {}
25

            
26
  void requestRouteConfigUpdate(RouteCache& route_cache,
27
                                Http::RouteConfigUpdatedCallbackSharedPtr route_config_updated_cb,
28
                                absl::optional<Router::ConfigConstSharedPtr> route_config,
29
                                Event::Dispatcher& dispatcher,
30
                                RequestHeaderMap& request_headers) override;
31
  void
32
  requestVhdsUpdate(const std::string& host_header, Event::Dispatcher& thread_local_dispatcher,
33
                    Http::RouteConfigUpdatedCallbackSharedPtr route_config_updated_cb) override;
34
  void
35
  requestSrdsUpdate(RouteCache& route_cache, Router::ScopeKeyPtr scope_key,
36
                    Event::Dispatcher& thread_local_dispatcher,
37
                    Http::RouteConfigUpdatedCallbackSharedPtr route_config_updated_cb) override;
38

            
39
private:
40
  Router::RouteConfigProvider* route_config_provider_;
41
  Router::ScopedRdsConfigProvider* scoped_route_config_provider_;
42
  OptRef<const Router::ScopeKeyBuilder> scope_key_builder_;
43
};
44

            
45
class RdsRouteConfigUpdateRequesterFactory : public RouteConfigUpdateRequesterFactory {
46
public:
47
  // UntypedFactory
48
503
  virtual std::string name() const override {
49
503
    return "envoy.route_config_update_requester.default";
50
503
  }
51

            
52
  std::unique_ptr<RouteConfigUpdateRequester>
53
93441
  createRouteConfigUpdateRequester(Router::RouteConfigProvider* route_config_provider) override {
54
93441
    return std::make_unique<RdsRouteConfigUpdateRequester>(route_config_provider);
55
93441
  }
56
  std::unique_ptr<RouteConfigUpdateRequester> createRouteConfigUpdateRequester(
57
      Config::ConfigProvider* scoped_route_config_provider,
58
183
      OptRef<const Router::ScopeKeyBuilder> scope_key_builder) override {
59
183
    return std::make_unique<RdsRouteConfigUpdateRequester>(scoped_route_config_provider,
60
183
                                                           scope_key_builder);
61
183
  }
62
};
63

            
64
DECLARE_FACTORY(RdsRouteConfigUpdateRequesterFactory);
65

            
66
} // namespace Http
67
} // namespace Envoy