1
#pragma once
2

            
3
#include "envoy/http/filter.h"
4
#include "envoy/http/header_map.h"
5
#include "envoy/stats/scope.h"
6
#include "envoy/stats/stats_macros.h"
7
#include "envoy/stream_info/stream_info.h"
8
#include "envoy/upstream/cluster_manager.h"
9
#include "envoy/upstream/host_description.h"
10

            
11
namespace Envoy {
12
namespace Router {
13

            
14
class UpstreamRequest;
15

            
16
// This groups various per-stream timeouts conveniently together.
17
struct TimeoutData {
18
  std::chrono::milliseconds global_timeout_{0};
19
  std::chrono::milliseconds per_try_timeout_{0};
20
  std::chrono::milliseconds per_try_idle_timeout_{0};
21
};
22

            
23
// The interface the UpstreamRequest has to interact with the router filter.
24
class RouterFilterInterface {
25
public:
26
95821
  virtual ~RouterFilterInterface() = default;
27

            
28
  /**
29
   * This will be called when upstream 1xx headers are ready to be processed by downstream code.
30
   * @param headers contains the 1xx headers
31
   * @param upstream_request inicates which UpstreamRequest the 1xx headers are from.
32
   *
33
   */
34
  virtual void onUpstream1xxHeaders(Http::ResponseHeaderMapPtr&& headers,
35
                                    UpstreamRequest& upstream_request) PURE;
36
  /**
37
   * This will be called when upstream non-1xx headers are ready to be processed by downstream code.
38
   * @param headers contains the headers
39
   * @param upstream_request inicates which UpstreamRequest the headers are from.
40
   * @param end_stream indicates if the response is complete.
41
   *
42
   */
43
  virtual void onUpstreamHeaders(uint64_t response_code, Http::ResponseHeaderMapPtr&& headers,
44
                                 UpstreamRequest& upstream_request, bool end_stream) PURE;
45
  /**
46
   * This will be called when upstream data is ready to be processed by downstream code.
47
   * @param data contains the data to process
48
   * @param upstream_request inicates which UpstreamRequest the data is from.
49
   * @param end_stream indicates if the response is complete.
50
   *
51
   */
52
  virtual void onUpstreamData(Buffer::Instance& data, UpstreamRequest& upstream_request,
53
                              bool end_stream) PURE;
54
  /**
55
   * This will be called when upstream trailers are ready to be processed by downstream code.
56
   * @param trailers contains the trailers to process
57
   * @param upstream_request inicates which UpstreamRequest the trailers are from.
58
   *
59
   */
60
  virtual void onUpstreamTrailers(Http::ResponseTrailerMapPtr&& trailers,
61
                                  UpstreamRequest& upstream_request) PURE;
62
  /**
63
   * This will be called when upstream metadata is ready to be processed by downstream code.
64
   * @param metadata contains the metadata to process
65
   * @param upstream_request inicates which UpstreamRequest the metadata is from.
66
   *
67
   */
68
  virtual void onUpstreamMetadata(Http::MetadataMapPtr&& metadata_map) PURE;
69

            
70
  /**
71
   * This will be called when an upstream reset is ready to be processed by downstream code.
72
   * @param reset_reason indicates the reason for the reset.
73
   * @param transport_failure optionally indicates any transport failure.
74
   * @param upstream_request inicates which UpstreamRequest the reset is from.
75
   *
76
   */
77
  virtual void onUpstreamReset(Http::StreamResetReason reset_reason,
78
                               absl::string_view transport_failure,
79
                               UpstreamRequest& upstream_request) PURE;
80

            
81
  /**
82
   * This will be called when an upstream host is selected. This is called both
83
   * if the host can accomodate the stream and if the host is selected but unusable.
84
   * @param host the host selected for the request
85
   * @param pool_success indicates if the host can be used for the request.
86
   */
87
  virtual void onUpstreamHostSelected(Upstream::HostDescriptionConstSharedPtr host,
88
                                      bool pool_success) PURE;
89
  /*
90
   * This will be called if a per-try timeout fails.
91
   * @param upstream_request inicates which UpstreamRequest which timed out
92
   */
93
  virtual void onPerTryTimeout(UpstreamRequest& upstream_request) PURE;
94

            
95
  /*
96
   * This will be called if a per-try idle timeout fails.
97
   * @param upstream_request inicates which UpstreamRequest which timed out
98
   */
99
  virtual void onPerTryIdleTimeout(UpstreamRequest& upstream_request) PURE;
100

            
101
  /*
102
   * This will be called if the max stream duration was reached.
103
   * @param upstream_request inicates which UpstreamRequest which timed out
104
   */
105
  virtual void onStreamMaxDurationReached(UpstreamRequest& upstream_request) PURE;
106

            
107
  /*
108
   * This will be called to set up the route timeout early for websocket upgrades.
109
   * This ensures the timeout is active during the upgrade negotiation phase.
110
   */
111
  virtual void setupRouteTimeoutForWebsocketUpgrade() PURE;
112

            
113
  /*
114
   * This will be called to disable the route timeout after websocket upgrade completes.
115
   * This prevents the timeout from firing after successful upgrade.
116
   */
117
  virtual void disableRouteTimeoutForWebsocketUpgrade() PURE;
118

            
119
  /*
120
   * @returns the Router filter's StreamDecoderFilterCallbacks.
121
   */
122
  virtual Http::StreamDecoderFilterCallbacks* callbacks() PURE;
123
  /*
124
   * @returns the cluster for this stream.
125
   */
126
  virtual Upstream::ClusterInfoConstSharedPtr cluster() PURE;
127

            
128
  /*
129
   * @returns the FilterConfig for this stream
130
   */
131
  virtual FilterConfig& config() PURE;
132

            
133
  /*
134
   * @returns the various timeouts for this stream.
135
   */
136
  virtual TimeoutData timeout() PURE;
137

            
138
  /*
139
   * @returns the dynamic max stream duraration for this stream, if set.
140
   */
141
  virtual absl::optional<std::chrono::milliseconds> dynamicMaxStreamDuration() const PURE;
142

            
143
  /*
144
   * @returns the request headers for the stream.
145
   */
146
  virtual Http::RequestHeaderMap* downstreamHeaders() PURE;
147

            
148
  /*
149
   * @returns the request trailers for the stream.
150
   */
151
  virtual Http::RequestTrailerMap* downstreamTrailers() PURE;
152

            
153
  /*
154
   * @returns true if the downstream response has started.
155
   */
156
  virtual bool downstreamResponseStarted() const PURE;
157

            
158
  /*
159
   * @returns true if end_stream has been sent from the upstream side to the downstream side.
160
   */
161
  virtual bool downstreamEndStream() const PURE;
162

            
163
  /*
164
   * @returns the number of attempts (e.g. retries) performed for this stream.
165
   */
166
  virtual uint32_t attemptCount() const PURE;
167
};
168

            
169
} // namespace Router
170
} // namespace Envoy