Coverage Report

Created: 2023-11-12 09:30

/proc/self/cwd/source/server/admin/admin.h
Line
Count
Source (jump to first uncovered line)
1
#pragma once
2
3
#include <chrono>
4
#include <functional>
5
#include <list>
6
#include <string>
7
#include <utility>
8
#include <vector>
9
10
#include "envoy/http/filter.h"
11
#include "envoy/http/request_id_extension.h"
12
#include "envoy/network/filter.h"
13
#include "envoy/network/listen_socket.h"
14
#include "envoy/server/admin.h"
15
#include "envoy/server/instance.h"
16
#include "envoy/server/listener_manager.h"
17
#include "envoy/server/overload/overload_manager.h"
18
#include "envoy/upstream/outlier_detection.h"
19
#include "envoy/upstream/resource_manager.h"
20
21
#include "source/common/common/assert.h"
22
#include "source/common/common/basic_resource_impl.h"
23
#include "source/common/common/empty_string.h"
24
#include "source/common/common/logger.h"
25
#include "source/common/common/macros.h"
26
#include "source/common/http/conn_manager_config.h"
27
#include "source/common/http/conn_manager_impl.h"
28
#include "source/common/http/date_provider_impl.h"
29
#include "source/common/http/default_server_string.h"
30
#include "source/common/http/http1/codec_stats.h"
31
#include "source/common/http/http2/codec_stats.h"
32
#include "source/common/http/request_id_extension_impl.h"
33
#include "source/common/http/utility.h"
34
#include "source/common/network/connection_balancer_impl.h"
35
#include "source/common/network/raw_buffer_socket.h"
36
#include "source/common/router/scoped_config_impl.h"
37
#include "source/common/stats/isolated_store_impl.h"
38
#include "source/extensions/filters/http/common/pass_through_filter.h"
39
#include "source/server/admin/admin_filter.h"
40
#include "source/server/admin/clusters_handler.h"
41
#include "source/server/admin/config_dump_handler.h"
42
#include "source/server/admin/config_tracker_impl.h"
43
#include "source/server/admin/init_dump_handler.h"
44
#include "source/server/admin/listeners_handler.h"
45
#include "source/server/admin/logs_handler.h"
46
#include "source/server/admin/profiling_handler.h"
47
#include "source/server/admin/runtime_handler.h"
48
#include "source/server/admin/server_cmd_handler.h"
49
#include "source/server/admin/server_info_handler.h"
50
#include "source/server/admin/stats_handler.h"
51
52
#include "absl/strings/string_view.h"
53
54
namespace Envoy {
55
namespace Server {
56
57
class AdminInternalAddressConfig : public Http::InternalAddressConfig {
58
2.64k
  bool isInternalAddress(const Network::Address::Instance&) const override { return false; }
59
};
60
61
/**
62
 * Implementation of Server::Admin.
63
 */
64
class AdminImpl : public Admin,
65
                  public Network::FilterChainManager,
66
                  public Network::FilterChainFactory,
67
                  public Http::FilterChainFactory,
68
                  public Http::ConnectionManagerConfig,
69
                  Logger::Loggable<Logger::Id::admin> {
70
public:
71
  AdminImpl(const std::string& profile_path, Server::Instance& server,
72
            bool ignore_global_conn_limit);
73
74
  Http::Code runCallback(Http::ResponseHeaderMap& response_headers, Buffer::Instance& response,
75
                         AdminStream& admin_stream);
76
5.28k
  const Network::Socket& socket() override { return *socket_; }
77
0
  Network::Socket& mutableSocket() { return *socket_; }
78
79
  // Server::Admin
80
  // TODO(jsedgwick) These can be managed with a generic version of ConfigTracker.
81
  // Wins would be no manual removeHandler() and code reuse.
82
  //
83
  // The prefix must start with "/" and contain at least one additional character.
84
  bool addHandler(const std::string& prefix, const std::string& help_text, HandlerCb callback,
85
                  bool removable, bool mutates_server_state,
86
                  const ParamDescriptorVec& params = {}) override;
87
  bool addStreamingHandler(const std::string& prefix, const std::string& help_text,
88
                           GenRequestFn callback, bool removable, bool mutates_server_state,
89
                           const ParamDescriptorVec& params = {}) override;
90
  bool removeHandler(const std::string& prefix) override;
91
  ConfigTracker& getConfigTracker() override;
92
93
  void startHttpListener(const std::list<AccessLog::InstanceSharedPtr>& access_logs,
94
                         const std::string& address_out_path,
95
                         Network::Address::InstanceConstSharedPtr address,
96
                         const Network::Socket::OptionsSharedPtr& socket_options,
97
                         Stats::ScopeSharedPtr&& listener_scope) override;
98
0
  uint32_t concurrency() const override { return server_.options().concurrency(); }
99
100
  // Network::FilterChainManager
101
  const Network::FilterChain* findFilterChain(const Network::ConnectionSocket&,
102
2.64k
                                              const StreamInfo::StreamInfo&) const override {
103
2.64k
    return admin_filter_chain_.get();
104
2.64k
  }
105
106
  // Network::FilterChainFactory
107
  bool
108
  createNetworkFilterChain(Network::Connection& connection,
109
                           const Filter::NetworkFilterFactoriesList& filter_factories) override;
110
2.64k
  bool createListenerFilterChain(Network::ListenerFilterManager&) override { return true; }
111
  void createUdpListenerFilterChain(Network::UdpListenerFilterManager&,
112
0
                                    Network::UdpReadFilterCallbacks&) override {}
113
0
  bool createQuicListenerFilterChain(Network::QuicListenerFilterManager&) override { return true; }
114
115
  // Http::FilterChainFactory
116
  bool createFilterChain(Http::FilterChainManager& manager, bool,
117
                         const Http::FilterChainOptions&) const override;
118
  bool createUpgradeFilterChain(absl::string_view, const Http::FilterChainFactory::UpgradeMap*,
119
0
                                Http::FilterChainManager&) const override {
120
0
    return false;
121
0
  }
122
123
  // Http::ConnectionManagerConfig
124
0
  const Http::RequestIDExtensionSharedPtr& requestIDExtension() override {
125
0
    return request_id_extension_;
126
0
  }
127
2.64k
  const std::list<AccessLog::InstanceSharedPtr>& accessLogs() override { return access_logs_; }
128
2.64k
  bool flushAccessLogOnNewRequest() override { return flush_access_log_on_new_request_; }
129
0
  bool flushAccessLogOnTunnelSuccessfullyEstablished() const override { return false; }
130
2.64k
  const absl::optional<std::chrono::milliseconds>& accessLogFlushInterval() override {
131
2.64k
    return null_access_log_flush_interval_;
132
2.64k
  }
133
  Http::ServerConnectionPtr createCodec(Network::Connection& connection,
134
                                        const Buffer::Instance& data,
135
                                        Http::ServerConnectionCallbacks& callbacks,
136
                                        Server::OverloadManager& overload_manager) override;
137
2.64k
  Http::DateProvider& dateProvider() override { return date_provider_; }
138
0
  std::chrono::milliseconds drainTimeout() const override { return std::chrono::milliseconds(100); }
139
2.64k
  Http::FilterChainFactory& filterFactory() override { return *this; }
140
2.64k
  bool generateRequestId() const override { return false; }
141
0
  bool preserveExternalRequestId() const override { return false; }
142
2.64k
  bool alwaysSetRequestIdInResponse() const override { return false; }
143
2.64k
  absl::optional<std::chrono::milliseconds> idleTimeout() const override { return idle_timeout_; }
144
13.2k
  bool isRoutable() const override { return false; }
145
2.64k
  absl::optional<std::chrono::milliseconds> maxConnectionDuration() const override {
146
2.64k
    return max_connection_duration_;
147
2.64k
  }
148
2.64k
  uint32_t maxRequestHeadersKb() const override { return max_request_headers_kb_; }
149
2.64k
  uint32_t maxRequestHeadersCount() const override { return max_request_headers_count_; }
150
2.64k
  std::chrono::milliseconds streamIdleTimeout() const override { return {}; }
151
2.64k
  std::chrono::milliseconds requestTimeout() const override { return {}; }
152
2.64k
  std::chrono::milliseconds requestHeadersTimeout() const override { return {}; }
153
2.64k
  std::chrono::milliseconds delayedCloseTimeout() const override { return {}; }
154
2.64k
  absl::optional<std::chrono::milliseconds> maxStreamDuration() const override {
155
2.64k
    return max_stream_duration_;
156
2.64k
  }
157
2.64k
  Router::RouteConfigProvider* routeConfigProvider() override { return &route_config_provider_; }
158
0
  Config::ConfigProvider* scopedRouteConfigProvider() override {
159
0
    return &scoped_route_config_provider_;
160
0
  }
161
0
  OptRef<const Router::ScopeKeyBuilder> scopeKeyBuilder() override { return scope_key_builder_; }
162
5.29k
  const std::string& serverName() const override { return Http::DefaultServerString::get(); }
163
2.64k
  const absl::optional<std::string>& schemeToSet() const override { return scheme_; }
164
  HttpConnectionManagerProto::ServerHeaderTransformation
165
2.64k
  serverHeaderTransformation() const override {
166
2.64k
    return HttpConnectionManagerProto::OVERWRITE;
167
2.64k
  }
168
2.64k
  Http::ConnectionManagerStats& stats() override { return stats_; }
169
0
  Http::ConnectionManagerTracingStats& tracingStats() override { return tracing_stats_; }
170
5.29k
  bool useRemoteAddress() const override { return true; }
171
2.64k
  const Http::InternalAddressConfig& internalAddressConfig() const override {
172
2.64k
    return internal_address_config_;
173
2.64k
  }
174
2.64k
  uint32_t xffNumTrustedHops() const override { return 0; }
175
2.64k
  bool skipXffAppend() const override { return false; }
176
5.29k
  const std::string& via() const override { return EMPTY_STRING; }
177
5.29k
  Http::ForwardClientCertType forwardClientCert() const override {
178
5.29k
    return Http::ForwardClientCertType::Sanitize;
179
5.29k
  }
180
0
  const std::vector<Http::ClientCertDetailsType>& setCurrentClientCertDetails() const override {
181
0
    return set_current_client_cert_details_;
182
0
  }
183
  const Network::Address::Instance& localAddress() override;
184
2.64k
  const absl::optional<std::string>& userAgent() override { return user_agent_; }
185
0
  Tracing::TracerSharedPtr tracer() override { return nullptr; }
186
5.29k
  const Http::TracingConnectionManagerConfig* tracingConfig() override { return nullptr; }
187
2.64k
  Http::ConnectionManagerListenerStats& listenerStats() override { return listener_->stats_; }
188
5.29k
  bool proxy100Continue() const override { return false; }
189
0
  bool streamErrorOnInvalidHttpMessaging() const override { return false; }
190
0
  const Http::Http1Settings& http1Settings() const override { return http1_settings_; }
191
2.64k
  bool shouldNormalizePath() const override { return true; }
192
2.64k
  bool shouldMergeSlashes() const override { return true; }
193
2.64k
  bool shouldStripTrailingHostDot() const override { return false; }
194
5.29k
  Http::StripPortType stripPortType() const override { return Http::StripPortType::None; }
195
  envoy::config::core::v3::HttpProtocolOptions::HeadersWithUnderscoresAction
196
2.64k
  headersWithUnderscoresAction() const override {
197
2.64k
    return envoy::config::core::v3::HttpProtocolOptions::ALLOW;
198
2.64k
  }
199
2.64k
  const LocalReply::LocalReply& localReply() const override { return *local_reply_; }
200
  envoy::extensions::filters::network::http_connection_manager::v3::HttpConnectionManager::
201
      PathWithEscapedSlashesAction
202
2.64k
      pathWithEscapedSlashesAction() const override {
203
2.64k
    return envoy::extensions::filters::network::http_connection_manager::v3::HttpConnectionManager::
204
2.64k
        KEEP_UNCHANGED;
205
2.64k
  }
206
  const std::vector<Http::OriginalIPDetectionSharedPtr>&
207
0
  originalIpDetectionExtensions() const override {
208
0
    return detection_extensions_;
209
0
  }
210
2.64k
  const std::vector<Http::EarlyHeaderMutationPtr>& earlyHeaderMutationExtensions() const override {
211
2.64k
    return early_header_mutations_;
212
2.64k
  }
213
  Http::Code request(absl::string_view path_and_query, absl::string_view method,
214
                     Http::ResponseHeaderMap& response_headers, std::string& body) override;
215
  void closeSocket() override;
216
  void addListenerToHandler(Network::ConnectionHandler* handler) override;
217
218
2.64k
  GenRequestFn createRequestFunction() const {
219
2.64k
    return [this](AdminStream& admin_stream) -> RequestPtr { return makeRequest(admin_stream); };
220
2.64k
  }
221
2.64k
  uint64_t maxRequestsPerConnection() const override { return 0; }
222
5.29k
  const HttpConnectionManagerProto::ProxyStatusConfig* proxyStatusConfig() const override {
223
5.29k
    return proxy_status_config_.get();
224
5.29k
  }
225
  Http::ServerHeaderValidatorPtr
226
2.64k
  makeHeaderValidator([[maybe_unused]] Http::Protocol protocol) override {
227
#ifdef ENVOY_ENABLE_UHV
228
    ENVOY_BUG(header_validator_factory_ != nullptr,
229
              "Admin HCM config can not have null UHV factory.");
230
    return header_validator_factory_ ? header_validator_factory_->createServerHeaderValidator(
231
                                           protocol, getHeaderValidatorStats(protocol))
232
                                     : nullptr;
233
#else
234
2.64k
    return nullptr;
235
2.64k
#endif
236
2.64k
  }
237
5.29k
  bool appendXForwardedPort() const override { return false; }
238
2.64k
  bool addProxyProtocolConnectionState() const override { return true; }
239
240
private:
241
  friend class AdminTestingPeer;
242
243
#ifdef ENVOY_ENABLE_UHV
244
  ::Envoy::Http::HeaderValidatorStats& getHeaderValidatorStats(Http::Protocol protocol);
245
#endif
246
247
  /**
248
   * Creates a Request from the request in the admin stream.
249
   */
250
  RequestPtr makeRequest(AdminStream& admin_stream) const;
251
252
  /**
253
   * Creates a UrlHandler structure from a non-chunked callback.
254
   */
255
  UrlHandler makeHandler(const std::string& prefix, const std::string& help_text,
256
                         HandlerCb callback, bool removable, bool mutates_state,
257
                         const ParamDescriptorVec& params = {});
258
259
  /**
260
   * Creates a URL prefix bound to chunked handler. Handler is expected to
261
   * supply a method makeRequest(AdminStream&).
262
   *
263
   * @param prefix the prefix to register
264
   * @param help_text a help text ot display in a table in the admin home page
265
   * @param handler the Handler object for the admin subsystem, supplying makeContext().
266
   * @param removeable indicates whether the handler can be removed after being added
267
   * @param mutates_state indicates whether the handler will mutate state and therefore
268
   *                      must be accessed via HTTP POST rather than GET.
269
   * @return the UrlHandler.
270
   */
271
  template <class Handler>
272
  UrlHandler makeStreamingHandler(const std::string& prefix, const std::string& help_text,
273
                                  Handler& handler, bool removable, bool mutates_state) {
274
    return {prefix, help_text,
275
            [&handler](AdminStream& admin_stream) -> Admin::RequestPtr {
276
              return handler.makeRequest(admin_stream);
277
            },
278
            removable, mutates_state};
279
  }
280
281
  /**
282
   * Implementation of RouteConfigProvider that returns a static null route config.
283
   */
284
  struct NullRouteConfigProvider : public Router::RouteConfigProvider {
285
    NullRouteConfigProvider(TimeSource& time_source);
286
287
    // Router::RouteConfigProvider
288
0
    Rds::ConfigConstSharedPtr config() const override { return config_; }
289
0
    const absl::optional<ConfigInfo>& configInfo() const override { return config_info_; }
290
0
    SystemTime lastUpdated() const override { return time_source_.systemTime(); }
291
0
    absl::Status onConfigUpdate() override { return absl::OkStatus(); }
292
2.64k
    Router::ConfigConstSharedPtr configCast() const override { return config_; }
293
    void requestVirtualHostsUpdate(const std::string&, Event::Dispatcher&,
294
0
                                   std::weak_ptr<Http::RouteConfigUpdatedCallback>) override {}
295
296
    Router::ConfigConstSharedPtr config_;
297
    absl::optional<ConfigInfo> config_info_;
298
    TimeSource& time_source_;
299
  };
300
301
  /**
302
   * Implementation of ScopedRouteConfigProvider that returns a null scoped route config.
303
   */
304
  struct NullScopedRouteConfigProvider : public Config::ConfigProvider {
305
    NullScopedRouteConfigProvider(TimeSource& time_source)
306
        : config_(std::make_shared<const Router::NullScopedConfigImpl>()),
307
5.34k
          time_source_(time_source) {}
308
309
5.34k
    ~NullScopedRouteConfigProvider() override = default;
310
311
    // Config::ConfigProvider
312
0
    SystemTime lastUpdated() const override { return time_source_.systemTime(); }
313
0
    const Protobuf::Message* getConfigProto() const override { return nullptr; }
314
0
    std::string getConfigVersion() const override { return ""; }
315
0
    ConfigConstSharedPtr getConfig() const override { return config_; }
316
0
    ApiType apiType() const override { return ApiType::Full; }
317
0
    ConfigProtoVector getConfigProtos() const override { return {}; }
318
319
    Router::ScopedConfigConstSharedPtr config_;
320
    TimeSource& time_source_;
321
  };
322
323
  /**
324
   * Implementation of ScopeKeyBuilder that returns a null scope key.
325
   */
326
  struct NullScopeKeyBuilder : public Router::ScopeKeyBuilder {
327
5.34k
    NullScopeKeyBuilder() = default;
328
    ~NullScopeKeyBuilder() override = default;
329
330
0
    Router::ScopeKeyPtr computeScopeKey(const Http::HeaderMap&) const override { return nullptr; };
331
  };
332
333
  /**
334
   * Implementation of OverloadManager that is never overloaded. Using this instead of the real
335
   * OverloadManager keeps the admin interface accessible even when the proxy is overloaded.
336
   */
337
  struct NullOverloadManager : public OverloadManager {
338
    struct OverloadState : public ThreadLocalOverloadState {
339
5.29k
      OverloadState(Event::Dispatcher& dispatcher) : dispatcher_(dispatcher) {}
340
5.29k
      const OverloadActionState& getState(const std::string&) override { return inactive_; }
341
0
      bool tryAllocateResource(OverloadProactiveResourceName, int64_t) override { return false; }
342
0
      bool tryDeallocateResource(OverloadProactiveResourceName, int64_t) override { return false; }
343
0
      bool isResourceMonitorEnabled(OverloadProactiveResourceName) override { return false; }
344
      ProactiveResourceMonitorOptRef
345
0
      getProactiveResourceMonitorForTest(OverloadProactiveResourceName) override {
346
0
        return makeOptRefFromPtr<ProactiveResourceMonitor>(nullptr);
347
0
      }
348
      Event::Dispatcher& dispatcher_;
349
      const OverloadActionState inactive_ = OverloadActionState::inactive();
350
    };
351
352
    NullOverloadManager(ThreadLocal::SlotAllocator& slot_allocator)
353
5.34k
        : tls_(slot_allocator.allocateSlot()) {}
354
355
2.64k
    void start() override {
356
5.29k
      tls_->set([](Event::Dispatcher& dispatcher) -> ThreadLocal::ThreadLocalObjectSharedPtr {
357
5.29k
        return std::make_shared<OverloadState>(dispatcher);
358
5.29k
      });
359
2.64k
    }
360
361
2.64k
    ThreadLocalOverloadState& getThreadLocalOverloadState() override {
362
2.64k
      return tls_->getTyped<OverloadState>();
363
2.64k
    }
364
5.29k
    LoadShedPoint* getLoadShedPoint(absl::string_view) override { return nullptr; }
365
366
0
    Event::ScaledRangeTimerManagerFactory scaledTimerFactory() override { return nullptr; }
367
368
0
    bool registerForAction(const std::string&, Event::Dispatcher&, OverloadActionCb) override {
369
      // This method shouldn't be called by the admin listener
370
0
      IS_ENVOY_BUG("Unexpected function call");
371
0
      return false;
372
0
    }
373
374
    ThreadLocal::SlotPtr tls_;
375
  };
376
377
  std::vector<const UrlHandler*> sortedHandlers() const;
378
  envoy::admin::v3::ServerInfo::State serverState();
379
380
  /**
381
   * URL handlers.
382
   */
383
  Http::Code handlerAdminHome(Http::ResponseHeaderMap& response_headers, Buffer::Instance& response,
384
                              AdminStream&);
385
386
  Http::Code handlerHelp(Http::ResponseHeaderMap& response_headers, Buffer::Instance& response,
387
                         AdminStream&);
388
  void getHelp(Buffer::Instance& response) const;
389
390
  class AdminListenSocketFactory : public Network::ListenSocketFactory {
391
  public:
392
2.64k
    AdminListenSocketFactory(Network::SocketSharedPtr socket) : socket_(socket) {}
393
394
    // Network::ListenSocketFactory
395
2.64k
    Network::Socket::Type socketType() const override { return socket_->socketType(); }
396
2.64k
    const Network::Address::InstanceConstSharedPtr& localAddress() const override {
397
2.64k
      return socket_->connectionInfoProvider().localAddress();
398
2.64k
    }
399
2.64k
    Network::SocketSharedPtr getListenSocket(uint32_t) override {
400
      // This is only supposed to be called once.
401
2.64k
      RELEASE_ASSERT(!socket_create_, "AdminListener's socket shouldn't be shared.");
402
2.64k
      socket_create_ = true;
403
2.64k
      return socket_;
404
2.64k
    }
405
0
    Network::ListenSocketFactoryPtr clone() const override { return nullptr; }
406
0
    void closeAllSockets() override {}
407
0
    void doFinalPreWorkerInit() override {}
408
409
  private:
410
    Network::SocketSharedPtr socket_;
411
    bool socket_create_{false};
412
  };
413
414
  class AdminListener : public Network::ListenerConfig {
415
  public:
416
    AdminListener(AdminImpl& parent, Stats::ScopeSharedPtr&& listener_scope)
417
        : parent_(parent), name_("admin"), scope_(std::move(listener_scope)),
418
          stats_(Http::ConnectionManagerImpl::generateListenerStats("http.admin.", *scope_)),
419
2.64k
          init_manager_(nullptr), ignore_global_conn_limit_(parent.ignore_global_conn_limit_) {}
420
421
    // Network::ListenerConfig
422
2.64k
    Network::FilterChainManager& filterChainManager() override { return parent_; }
423
5.29k
    Network::FilterChainFactory& filterChainFactory() override { return parent_; }
424
5.29k
    std::vector<Network::ListenSocketFactoryPtr>& listenSocketFactories() override {
425
5.29k
      return parent_.socket_factories_;
426
5.29k
    }
427
2.64k
    bool bindToPort() const override { return true; }
428
2.64k
    bool handOffRestoredDestinationConnections() const override { return false; }
429
2.64k
    uint32_t perConnectionBufferLimitBytes() const override { return 0; }
430
2.64k
    std::chrono::milliseconds listenerFiltersTimeout() const override { return {}; }
431
2.64k
    bool continueOnListenerFiltersTimeout() const override { return false; }
432
42.3k
    Stats::Scope& listenerScope() override { return *scope_; }
433
7.94k
    uint64_t listenerTag() const override { return 0; }
434
0
    const std::string& name() const override { return name_; }
435
0
    Network::UdpListenerConfigOptRef udpListenerConfig() override { return {}; }
436
2.64k
    Network::InternalListenerConfigOptRef internalListenerConfig() override { return {}; }
437
0
    envoy::config::core::v3::TrafficDirection direction() const override {
438
0
      return envoy::config::core::v3::UNSPECIFIED;
439
0
    }
440
2.64k
    Network::ConnectionBalancer& connectionBalancer(const Network::Address::Instance&) override {
441
2.64k
      return connection_balancer_;
442
2.64k
    }
443
7.94k
    ResourceLimit& openConnections() override { return open_connections_; }
444
2.64k
    const std::vector<AccessLog::InstanceSharedPtr>& accessLogs() const override {
445
2.64k
      return empty_access_logs_;
446
2.64k
    }
447
0
    uint32_t tcpBacklogSize() const override { return ENVOY_TCP_BACKLOG_SIZE; }
448
2.64k
    uint32_t maxConnectionsToAcceptPerSocketEvent() const override {
449
2.64k
      return Network::DefaultMaxConnectionsToAcceptPerSocketEvent;
450
2.64k
    }
451
0
    Init::Manager& initManager() override { return *init_manager_; }
452
2.64k
    bool ignoreGlobalConnLimit() const override { return ignore_global_conn_limit_; }
453
454
    AdminImpl& parent_;
455
    const std::string name_;
456
    Stats::ScopeSharedPtr scope_;
457
    Http::ConnectionManagerListenerStats stats_;
458
    Network::NopConnectionBalancerImpl connection_balancer_;
459
    BasicResourceLimitImpl open_connections_;
460
461
  private:
462
    const std::vector<AccessLog::InstanceSharedPtr> empty_access_logs_;
463
    std::unique_ptr<Init::Manager> init_manager_;
464
    const bool ignore_global_conn_limit_;
465
  };
466
  using AdminListenerPtr = std::unique_ptr<AdminListener>;
467
468
  class AdminFilterChain : public Network::FilterChain {
469
  public:
470
    // We can't use the default constructor because transport_socket_factory_ doesn't have a
471
    // default constructor.
472
5.34k
    AdminFilterChain() {} // NOLINT(modernize-use-equals-default)
473
474
    // Network::FilterChain
475
2.64k
    const Network::DownstreamTransportSocketFactory& transportSocketFactory() const override {
476
2.64k
      return transport_socket_factory_;
477
2.64k
    }
478
479
2.64k
    std::chrono::milliseconds transportSocketConnectTimeout() const override {
480
2.64k
      return std::chrono::milliseconds::zero();
481
2.64k
    }
482
483
2.64k
    const Filter::NetworkFilterFactoriesList& networkFilterFactories() const override {
484
2.64k
      return empty_network_filter_factory_;
485
2.64k
    }
486
487
2.64k
    absl::string_view name() const override { return "admin"; }
488
489
  private:
490
    const Network::RawBufferSocketFactory transport_socket_factory_;
491
    const Filter::NetworkFilterFactoriesList empty_network_filter_factory_;
492
  };
493
494
  Server::Instance& server_;
495
  Http::RequestIDExtensionSharedPtr request_id_extension_;
496
  std::list<AccessLog::InstanceSharedPtr> access_logs_;
497
  const bool flush_access_log_on_new_request_ = false;
498
  const absl::optional<std::chrono::milliseconds> null_access_log_flush_interval_;
499
  const std::string profile_path_;
500
  Http::ConnectionManagerStats stats_;
501
  NullOverloadManager null_overload_manager_;
502
  // Note: this is here to essentially blackhole the tracing stats since they aren't used in the
503
  // Admin case.
504
  Stats::IsolatedStoreImpl no_op_store_;
505
  Http::ConnectionManagerTracingStats tracing_stats_;
506
  NullRouteConfigProvider route_config_provider_;
507
  NullScopedRouteConfigProvider scoped_route_config_provider_;
508
  NullScopeKeyBuilder scope_key_builder_;
509
  Server::ClustersHandler clusters_handler_;
510
  Server::ConfigDumpHandler config_dump_handler_;
511
  Server::InitDumpHandler init_dump_handler_;
512
  Server::StatsHandler stats_handler_;
513
  Server::LogsHandler logs_handler_;
514
  Server::ProfilingHandler profiling_handler_;
515
  Server::TcmallocProfilingHandler tcmalloc_profiling_handler_;
516
  Server::RuntimeHandler runtime_handler_;
517
  Server::ListenersHandler listeners_handler_;
518
  Server::ServerCmdHandler server_cmd_handler_;
519
  Server::ServerInfoHandler server_info_handler_;
520
  std::list<UrlHandler> handlers_;
521
  const uint32_t max_request_headers_kb_{Http::DEFAULT_MAX_REQUEST_HEADERS_KB};
522
  const uint32_t max_request_headers_count_{Http::DEFAULT_MAX_HEADERS_COUNT};
523
  absl::optional<std::chrono::milliseconds> idle_timeout_;
524
  absl::optional<std::chrono::milliseconds> max_connection_duration_;
525
  absl::optional<std::chrono::milliseconds> max_stream_duration_;
526
  absl::optional<std::string> user_agent_;
527
  Http::SlowDateProviderImpl date_provider_;
528
  std::vector<Http::ClientCertDetailsType> set_current_client_cert_details_;
529
  Http::Http1Settings http1_settings_;
530
  Http::Http1::CodecStats::AtomicPtr http1_codec_stats_;
531
  Http::Http2::CodecStats::AtomicPtr http2_codec_stats_;
532
  ConfigTrackerImpl config_tracker_;
533
  const Network::FilterChainSharedPtr admin_filter_chain_;
534
  Network::SocketSharedPtr socket_;
535
  std::vector<Network::ListenSocketFactoryPtr> socket_factories_;
536
  AdminListenerPtr listener_;
537
  const AdminInternalAddressConfig internal_address_config_;
538
  const LocalReply::LocalReplyPtr local_reply_;
539
  const std::vector<Http::OriginalIPDetectionSharedPtr> detection_extensions_{};
540
  const std::vector<Http::EarlyHeaderMutationPtr> early_header_mutations_{};
541
  const absl::optional<std::string> scheme_{};
542
  const bool ignore_global_conn_limit_;
543
  std::unique_ptr<HttpConnectionManagerProto::ProxyStatusConfig> proxy_status_config_;
544
  const Http::HeaderValidatorFactoryPtr header_validator_factory_;
545
};
546
547
} // namespace Server
548
} // namespace Envoy