1
#pragma once
2

            
3
#include <functional>
4
#include <list>
5

            
6
#include "envoy/http/filter.h"
7
#include "envoy/server/admin.h"
8

            
9
#include "source/common/buffer/buffer_impl.h"
10
#include "source/common/common/logger.h"
11
#include "source/common/http/codes.h"
12
#include "source/common/http/header_map_impl.h"
13
#include "source/extensions/filters/http/common/pass_through_filter.h"
14

            
15
#include "absl/strings/string_view.h"
16

            
17
namespace Envoy {
18
namespace Server {
19

            
20
/**
21
 * A terminal HTTP filter that implements server admin functionality.
22
 */
23
class AdminFilter : public Http::PassThroughFilter,
24
                    public AdminStream,
25
                    Logger::Loggable<Logger::Id::admin> {
26
public:
27
  using AdminServerCallbackFunction = std::function<Http::Code(
28
      absl::string_view path_and_query, Http::ResponseHeaderMap& response_headers,
29
      Buffer::OwnedImpl& response, AdminFilter& filter)>;
30

            
31
  /**
32
   * Instantiates an AdminFilter.
33
   *
34
   * @param admin the admin context from which to create the filter. This is used
35
   *        to create a request object based on the path.
36
   */
37
  AdminFilter(const Admin& admin);
38

            
39
  // Http::StreamFilterBase
40
  // Handlers relying on the reference should use addOnDestroyCallback()
41
  // to add a callback that will notify them when the reference is no
42
  // longer valid.
43
  void onDestroy() override;
44

            
45
  // Http::StreamDecoderFilter
46
  Http::FilterHeadersStatus decodeHeaders(Http::RequestHeaderMap& headers,
47
                                          bool end_stream) override;
48
  Http::FilterDataStatus decodeData(Buffer::Instance& data, bool end_stream) override;
49
  Http::FilterTrailersStatus decodeTrailers(Http::RequestTrailerMap& trailers) override;
50

            
51
  // AdminStream
52
21
  void setEndStreamOnComplete(bool end_stream) override { end_stream_on_complete_ = end_stream; }
53
  void addOnDestroyCallback(std::function<void()> cb) override;
54
  Http::StreamDecoderFilterCallbacks& getDecoderFilterCallbacks() const override;
55
  const Buffer::Instance* getRequestBody() const override;
56
  const Http::RequestHeaderMap& getRequestHeaders() const override;
57
1
  Http::Http1StreamEncoderOptionsOptRef http1StreamEncoderOptions() override {
58
1
    return encoder_callbacks_->http1StreamEncoderOptions();
59
1
  }
60
  Http::Utility::QueryParamsMulti queryParams() const override;
61

            
62
private:
63
  /**
64
   * Called when an admin request has been completely received.
65
   */
66
  void onComplete();
67
  const Admin& admin_;
68
  Http::RequestHeaderMap* request_headers_{};
69
  std::list<std::function<void()>> on_destroy_callbacks_;
70
  bool end_stream_on_complete_ = true;
71
};
72

            
73
} // namespace Server
74
} // namespace Envoy