1
#pragma once
2

            
3
#include <chrono>
4
#include <cstdint>
5

            
6
#include "envoy/common/time.h"
7
#include "envoy/config/core/v3/base.pb.h"
8
#include "envoy/http/header_map.h"
9
#include "envoy/http/request_id_extension.h"
10
#include "envoy/network/socket.h"
11
#include "envoy/router/router.h"
12
#include "envoy/stream_info/stream_info.h"
13
#include "envoy/tracing/trace_reason.h"
14

            
15
#include "source/common/common/assert.h"
16
#include "source/common/common/dump_state_utils.h"
17
#include "source/common/common/empty_string.h"
18
#include "source/common/common/macros.h"
19
#include "source/common/common/utility.h"
20
#include "source/common/network/socket_impl.h"
21
#include "source/common/runtime/runtime_features.h"
22
#include "source/common/stream_info/filter_state_impl.h"
23
#include "source/common/stream_info/stream_id_provider_impl.h"
24
#include "source/common/stream_info/utility.h"
25

            
26
#include "absl/strings/str_replace.h"
27

            
28
namespace Envoy {
29
namespace StreamInfo {
30

            
31
struct UpstreamInfoImpl : public UpstreamInfo {
32
48451
  void setUpstreamConnectionId(uint64_t id) override {
33
48451
    upstream_connection_id_ = id;
34
48451
    upstream_connection_ids_attempted_.push_back(id);
35
48451
  }
36

            
37
39
  absl::optional<uint64_t> upstreamConnectionId() const override { return upstream_connection_id_; }
38

            
39
10
  void setUpstreamInterfaceName(absl::string_view interface_name) override {
40
10
    upstream_connection_interface_name_ = std::string(interface_name);
41
10
  }
42

            
43
283
  absl::optional<absl::string_view> upstreamInterfaceName() const override {
44
283
    return upstream_connection_interface_name_;
45
283
  }
46

            
47
  void
48
48889
  setUpstreamSslConnection(const Ssl::ConnectionInfoConstSharedPtr& ssl_connection_info) override {
49
48889
    upstream_ssl_info_ = ssl_connection_info;
50
48889
  }
51

            
52
545
  Ssl::ConnectionInfoConstSharedPtr upstreamSslConnection() const override {
53
545
    return upstream_ssl_info_;
54
545
  }
55
542743
  UpstreamTiming& upstreamTiming() override { return upstream_timing_; }
56
178
  const UpstreamTiming& upstreamTiming() const override { return upstream_timing_; }
57
2276
  const Network::Address::InstanceConstSharedPtr& upstreamLocalAddress() const override {
58
2276
    return upstream_local_address_;
59
2276
  }
60
3074
  const Network::Address::InstanceConstSharedPtr& upstreamRemoteAddress() const override {
61
3074
    return upstream_remote_address_;
62
3074
  }
63
  void setUpstreamLocalAddress(
64
48579
      const Network::Address::InstanceConstSharedPtr& upstream_local_address) override {
65
48579
    upstream_local_address_ = upstream_local_address;
66
48579
  }
67
  void setUpstreamRemoteAddress(
68
48579
      const Network::Address::InstanceConstSharedPtr& upstream_remote_address) override {
69
48579
    upstream_remote_address_ = upstream_remote_address;
70
48579
  }
71
517
  void setUpstreamTransportFailureReason(absl::string_view failure_reason) override {
72
517
    upstream_transport_failure_reason_ = std::string(failure_reason);
73
517
  }
74
33
  const std::string& upstreamTransportFailureReason() const override {
75
33
    return upstream_transport_failure_reason_;
76
33
  }
77
2169
  void setUpstreamDetectedCloseType(DetectedCloseType close_type) override {
78
2169
    upstream_detected_close_type_ = close_type;
79
2169
  }
80
331
  DetectedCloseType upstreamDetectedCloseType() const override {
81
331
    return upstream_detected_close_type_;
82
331
  }
83
3773
  void setUpstreamLocalCloseReason(absl::string_view reason) override {
84
3773
    upstream_local_close_reason_ = std::string(reason);
85
3773
  }
86
6
  absl::string_view upstreamLocalCloseReason() const override {
87
6
    return upstream_local_close_reason_;
88
6
  }
89
128606
  void setUpstreamHost(Upstream::HostDescriptionConstSharedPtr host) override {
90
128606
    upstream_host_ = host;
91
128606
  }
92
11
  const FilterStateSharedPtr& upstreamFilterState() const override {
93
11
    return upstream_filter_state_;
94
11
  }
95
48301
  void setUpstreamFilterState(const FilterStateSharedPtr& filter_state) override {
96
48301
    upstream_filter_state_ = filter_state;
97
48301
  }
98

            
99
26820
  Upstream::HostDescriptionConstSharedPtr upstreamHost() const override { return upstream_host_; }
100

            
101
4
  void dumpState(std::ostream& os, int indent_level = 0) const override {
102
4
    const char* spaces = spacesForLevel(indent_level);
103
4
    os << spaces << "UpstreamInfoImpl " << this << DUMP_OPTIONAL_MEMBER(upstream_connection_id_)
104
4
       << "\n";
105
4
  }
106
143643
  void setUpstreamNumStreams(uint64_t num_streams) override { num_streams_ = num_streams; }
107
143648
  uint64_t upstreamNumStreams() const override { return num_streams_; }
108

            
109
46362
  void setUpstreamProtocol(Http::Protocol protocol) override { upstream_protocol_ = protocol; }
110
8
  absl::optional<Http::Protocol> upstreamProtocol() const override { return upstream_protocol_; }
111

            
112
48941
  void addUpstreamHostAttempted(Upstream::HostDescriptionConstSharedPtr host) override {
113
48941
    upstream_hosts_attempted_.push_back(host);
114
48941
  }
115

            
116
  const std::vector<Upstream::HostDescriptionConstSharedPtr>&
117
38
  upstreamHostsAttempted() const override {
118
38
    return upstream_hosts_attempted_;
119
38
  }
120

            
121
4
  const std::vector<uint64_t>& upstreamConnectionIdsAttempted() const override {
122
4
    return upstream_connection_ids_attempted_;
123
4
  }
124

            
125
  Upstream::HostDescriptionConstSharedPtr upstream_host_;
126
  Network::Address::InstanceConstSharedPtr upstream_local_address_;
127
  Network::Address::InstanceConstSharedPtr upstream_remote_address_;
128
  UpstreamTiming upstream_timing_;
129
  Ssl::ConnectionInfoConstSharedPtr upstream_ssl_info_;
130
  absl::optional<uint64_t> upstream_connection_id_;
131
  absl::optional<std::string> upstream_connection_interface_name_;
132
  std::string upstream_transport_failure_reason_;
133
  DetectedCloseType upstream_detected_close_type_{DetectedCloseType::Normal};
134
  std::string upstream_local_close_reason_;
135
  FilterStateSharedPtr upstream_filter_state_;
136
  size_t num_streams_{};
137
  absl::optional<Http::Protocol> upstream_protocol_;
138
  std::vector<Upstream::HostDescriptionConstSharedPtr> upstream_hosts_attempted_;
139
  std::vector<uint64_t> upstream_connection_ids_attempted_;
140
};
141

            
142
struct StreamInfoImpl : public StreamInfo {
143
  StreamInfoImpl(
144
      TimeSource& time_source,
145
      const Network::ConnectionInfoProviderSharedPtr& downstream_connection_info_provider,
146
      FilterState::LifeSpan life_span, FilterStateSharedPtr ancestor_filter_state = nullptr)
147
169442
      : StreamInfoImpl(
148
169442
            absl::nullopt, time_source, downstream_connection_info_provider,
149
169442
            std::make_shared<FilterStateImpl>(std::move(ancestor_filter_state), life_span)) {}
150

            
151
  StreamInfoImpl(
152
      Http::Protocol protocol, TimeSource& time_source,
153
      const Network::ConnectionInfoProviderSharedPtr& downstream_connection_info_provider,
154
      FilterState::LifeSpan life_span, FilterStateSharedPtr ancestor_filter_state = nullptr)
155
96508
      : StreamInfoImpl(
156
96508
            protocol, time_source, downstream_connection_info_provider,
157
96508
            std::make_shared<FilterStateImpl>(std::move(ancestor_filter_state), life_span)) {}
158

            
159
  StreamInfoImpl(
160
      absl::optional<Http::Protocol> protocol, TimeSource& time_source,
161
      const Network::ConnectionInfoProviderSharedPtr& downstream_connection_info_provider,
162
      FilterStateSharedPtr filter_state)
163
269046
      : time_source_(time_source), start_time_(time_source.systemTime()),
164
269046
        start_time_monotonic_(time_source.monotonicTime()), protocol_(protocol),
165
269046
        filter_state_(std::move(filter_state)),
166
269046
        downstream_connection_info_provider_(downstream_connection_info_provider != nullptr
167
269046
                                                 ? downstream_connection_info_provider
168
269046
                                                 : emptyDownstreamAddressProvider()),
169
269046
        trace_reason_(Tracing::Reason::NotTraceable) {}
170

            
171
74405
  SystemTime startTime() const override { return start_time_; }
172

            
173
3575
  MonotonicTime startTimeMonotonic() const override { return start_time_monotonic_; }
174

            
175
56
  TimeSource& timeSource() const override { return time_source_; }
176

            
177
172245
  absl::optional<std::chrono::nanoseconds> duration(absl::optional<MonotonicTime> time) const {
178
172245
    if (!time) {
179
23
      return {};
180
23
    }
181

            
182
172222
    return std::chrono::duration_cast<std::chrono::nanoseconds>(time.value() -
183
172222
                                                                start_time_monotonic_);
184
172245
  }
185

            
186
194724
  void setUpstreamInfo(std::shared_ptr<UpstreamInfo> info) override { upstream_info_ = info; }
187

            
188
1100829
  std::shared_ptr<UpstreamInfo> upstreamInfo() override { return upstream_info_; }
189

            
190
82572
  OptRef<const UpstreamInfo> upstreamInfo() const override {
191
82572
    if (!upstream_info_) {
192
49969
      return {};
193
49969
    }
194
32603
    return *upstream_info_;
195
82572
  }
196

            
197
168923
  absl::optional<std::chrono::nanoseconds> currentDuration() const override {
198
168923
    if (!final_time_) {
199
96774
      return duration(time_source_.monotonicTime());
200
96774
    }
201

            
202
72149
    return requestComplete();
203
168923
  }
204

            
205
75321
  absl::optional<std::chrono::nanoseconds> requestComplete() const override {
206
75321
    return duration(final_time_);
207
75321
  }
208

            
209
196311
  void onRequestComplete() override {
210
196311
    ASSERT(!final_time_);
211
196311
    final_time_ = time_source_.monotonicTime();
212
196311
  }
213

            
214
372415
  DownstreamTiming& downstreamTiming() override {
215
372415
    if (!downstream_timing_.has_value()) {
216
99509
      downstream_timing_ = DownstreamTiming();
217
99509
    }
218
372415
    return downstream_timing_.value();
219
372415
  }
220
550316
  OptRef<const DownstreamTiming> downstreamTiming() const override {
221
550316
    if (!downstream_timing_.has_value()) {
222
92962
      return {};
223
92962
    }
224
457354
    return {*downstream_timing_};
225
550316
  }
226

            
227
2
  void addCustomFlag(absl::string_view flag) override {
228
2
    ASSERT(!ResponseFlagUtils::responseFlagsMap().contains(flag));
229
2
    ASSERT(!StringUtil::hasEmptySpace(flag));
230
2
    if (custom_flags_.empty()) {
231
1
      custom_flags_.append(flag.data(), flag.size());
232
1
    } else {
233
1
      custom_flags_.push_back(',');
234
1
      custom_flags_.append(flag.data(), flag.size());
235
1
    }
236
2
  }
237
3019
  absl::string_view customFlags() const override { return custom_flags_; }
238

            
239
1152171
  void addBytesReceived(uint64_t bytes_received) override { bytes_received_ += bytes_received; }
240

            
241
74943
  uint64_t bytesReceived() const override { return bytes_received_; }
242

            
243
1509
  void addBytesRetransmitted(uint64_t bytes_retransmitted) override {
244
1509
    bytes_retransmitted_ += bytes_retransmitted;
245
1509
  }
246

            
247
1810
  uint64_t bytesRetransmitted() const override { return bytes_retransmitted_; }
248

            
249
1509
  void addPacketsRetransmitted(uint64_t packets_retransmitted) override {
250
1509
    packets_retransmitted_ += packets_retransmitted;
251
1509
  }
252

            
253
1810
  uint64_t packetsRetransmitted() const override { return packets_retransmitted_; }
254

            
255
212075
  absl::optional<Http::Protocol> protocol() const override { return protocol_; }
256

            
257
162431
  void protocol(Http::Protocol protocol) override { protocol_ = protocol; }
258

            
259
139262
  absl::optional<uint32_t> responseCode() const override { return response_code_; }
260

            
261
63054
  const absl::optional<std::string>& responseCodeDetails() const override {
262
63054
    return response_code_details_;
263
63054
  }
264

            
265
137863
  void setResponseCode(uint32_t code) override { response_code_ = code; }
266

            
267
177736
  void setResponseCodeDetails(absl::string_view rc_details) override {
268
    // Callers should make sure that the rc_details does not contain a new line character.
269
    // Whitespaces are allowed and are replaced by '_' or left intact depending the on the
270
    // formatter processing this value.
271
177736
    ASSERT(!StringUtil::hasNewLine(rc_details));
272

            
273
177736
    response_code_details_.emplace(rc_details);
274
177736
  }
275

            
276
3699
  const absl::optional<std::string>& connectionTerminationDetails() const override {
277
3699
    return connection_termination_details_;
278
3699
  }
279

            
280
18
  void setConnectionTerminationDetails(absl::string_view connection_termination_details) override {
281
18
    connection_termination_details_.emplace(connection_termination_details);
282
18
  }
283

            
284
1780829
  void addBytesSent(uint64_t bytes_sent) override { bytes_sent_ += bytes_sent; }
285

            
286
74355
  uint64_t bytesSent() const override { return bytes_sent_; }
287

            
288
55800
  void setResponseFlag(ResponseFlag flag) override {
289
55800
    ASSERT(flag.value() < ResponseFlagUtils::responseFlagsVec().size());
290
55800
    if (!hasResponseFlag(flag)) {
291
55752
      response_flags_.push_back(flag);
292
55752
    }
293
55800
  }
294

            
295
99235
  bool hasResponseFlag(ResponseFlag flag) const override {
296
99235
    return std::find(response_flags_.begin(), response_flags_.end(), flag) != response_flags_.end();
297
99235
  }
298

            
299
2141
  bool hasAnyResponseFlag() const override { return !response_flags_.empty(); }
300

            
301
77031
  absl::Span<const ResponseFlag> responseFlags() const override { return response_flags_; }
302

            
303
35
  uint64_t legacyResponseFlags() const override {
304
35
    uint64_t legacy_flags = 0;
305
66
    for (ResponseFlag flag : response_flags_) {
306
62
      if (flag.value() <= static_cast<uint16_t>(CoreResponseFlag::LastFlag)) {
307
60
        ASSERT(flag.value() < 64, "Legacy response flag out of range");
308
60
        legacy_flags |= (1UL << flag.value());
309
60
      }
310
62
    }
311
35
    return legacy_flags;
312
35
  }
313

            
314
69
  const std::string& getRouteName() const override {
315
69
    return route_ != nullptr ? route_->routeName() : EMPTY_STRING;
316
69
  }
317

            
318
30
  void setVirtualClusterName(const absl::optional<std::string>& virtual_cluster_name) override {
319
30
    virtual_cluster_name_ = virtual_cluster_name;
320
30
  }
321

            
322
1517
  const absl::optional<std::string>& virtualClusterName() const override {
323
1517
    return virtual_cluster_name_;
324
1517
  }
325

            
326
344576
  bool healthCheck() const override { return health_check_request_; }
327

            
328
47799
  void healthCheck(bool is_health_check) override { health_check_request_ = is_health_check; }
329

            
330
285338
  const Network::ConnectionInfoProvider& downstreamAddressProvider() const override {
331
285338
    return *downstream_connection_info_provider_;
332
285338
  }
333

            
334
1579
  const Router::VirtualHostConstSharedPtr& virtualHost() const override { return vhost_; }
335

            
336
245199
  Router::RouteConstSharedPtr route() const override { return route_; }
337

            
338
264117
  envoy::config::core::v3::Metadata& dynamicMetadata() override { return metadata_; };
339
5594
  const envoy::config::core::v3::Metadata& dynamicMetadata() const override { return metadata_; };
340

            
341
2226
  void setDynamicMetadata(const std::string& name, const Protobuf::Struct& value) override {
342
2226
    (*metadata_.mutable_filter_metadata())[name].MergeFrom(value);
343
2226
  };
344

            
345
18
  void setDynamicTypedMetadata(const std::string& name, const Protobuf::Any& value) override {
346
18
    (*metadata_.mutable_typed_filter_metadata())[name].MergeFrom(value);
347
18
  }
348

            
349
314032
  const FilterStateSharedPtr& filterState() override { return filter_state_; }
350
88859
  const FilterState& filterState() const override { return *filter_state_; }
351

            
352
184209
  void setRequestHeaders(const Http::RequestHeaderMap& headers) override {
353
184209
    request_headers_ = &headers;
354
184209
  }
355

            
356
3530
  const Http::RequestHeaderMap* getRequestHeaders() const override { return request_headers_; }
357

            
358
96528
  void setStreamIdProvider(StreamIdProviderSharedPtr provider) override {
359
96528
    stream_id_provider_ = std::move(provider);
360
96528
  }
361
1996
  OptRef<const StreamIdProvider> getStreamIdProvider() const override {
362
1996
    if (stream_id_provider_ == nullptr) {
363
20
      return {};
364
20
    }
365
1976
    return makeOptRef<const StreamIdProvider>(*stream_id_provider_);
366
1996
  }
367

            
368
90033
  void setTraceReason(Tracing::Reason reason) override { trace_reason_ = reason; }
369
2079
  Tracing::Reason traceReason() const override { return trace_reason_; }
370

            
371
10
  void dumpState(std::ostream& os, int indent_level = 0) const override {
372
10
    const char* spaces = spacesForLevel(indent_level);
373
10
    os << spaces << "StreamInfoImpl " << this << DUMP_OPTIONAL_MEMBER(protocol_)
374
10
       << DUMP_OPTIONAL_MEMBER(response_code_) << DUMP_OPTIONAL_MEMBER(response_code_details_)
375
10
       << DUMP_OPTIONAL_MEMBER(attempt_count_) << DUMP_MEMBER(health_check_request_)
376
10
       << DUMP_MEMBER(getRouteName());
377
10
    DUMP_DETAILS(upstream_info_);
378
10
  }
379

            
380
  void setUpstreamClusterInfo(
381
146168
      const Upstream::ClusterInfoConstSharedPtr& upstream_cluster_info) override {
382
146168
    upstream_cluster_info_ = upstream_cluster_info;
383
146168
  }
384

            
385
176983
  absl::optional<Upstream::ClusterInfoConstSharedPtr> upstreamClusterInfo() const override {
386
176983
    return upstream_cluster_info_;
387
176983
  }
388

            
389
49721
  void setAttemptCount(uint32_t attempt_count) override { attempt_count_ = attempt_count; }
390

            
391
1659
  absl::optional<uint32_t> attemptCount() const override { return attempt_count_; }
392

            
393
482536
  const BytesMeterSharedPtr& getUpstreamBytesMeter() const override {
394
482536
    return upstream_bytes_meter_;
395
482536
  }
396

            
397
477548
  const BytesMeterSharedPtr& getDownstreamBytesMeter() const override {
398
477548
    return downstream_bytes_meter_;
399
477548
  }
400

            
401
93595
  void setUpstreamBytesMeter(const BytesMeterSharedPtr& upstream_bytes_meter) override {
402
93595
    upstream_bytes_meter->captureExistingBytesMeter(*upstream_bytes_meter_);
403
93595
    upstream_bytes_meter_ = upstream_bytes_meter;
404
93595
  }
405

            
406
143038
  void setDownstreamBytesMeter(const BytesMeterSharedPtr& downstream_bytes_meter) override {
407
    // Downstream bytes counter don't reset during a retry.
408
143038
    if (downstream_bytes_meter_ == nullptr) {
409
143038
      downstream_bytes_meter_ = downstream_bytes_meter;
410
143038
    }
411
143038
    ASSERT(downstream_bytes_meter_.get() == downstream_bytes_meter.get());
412
143038
  }
413

            
414
  // This function is used to persist relevant information from the original
415
  // stream into to the new one, when recreating the stream. Generally this
416
  // includes information about the downstream stream, but not the upstream
417
  // stream.
418
1805
  void setFromForRecreateStream(StreamInfo& info) {
419
1805
    downstream_timing_ = info.downstreamTiming();
420
1805
    protocol_ = info.protocol();
421
1805
    bytes_received_ = info.bytesReceived();
422
1805
    downstream_bytes_meter_ = info.getDownstreamBytesMeter();
423
    // These two are set in the constructor, but to T(recreate), and should be T(create)
424
1805
    start_time_ = info.startTime();
425
1805
    start_time_monotonic_ = info.startTimeMonotonic();
426
1805
    downstream_transport_failure_reason_ = std::string(info.downstreamTransportFailureReason());
427
1805
    downstream_local_close_reason_ = std::string(info.downstreamLocalCloseReason());
428
1805
    bytes_retransmitted_ = info.bytesRetransmitted();
429
1805
    packets_retransmitted_ = info.packetsRetransmitted();
430
1805
    should_drain_connection_ = info.shouldDrainConnectionUponCompletion();
431
1805
    codec_stream_id_ = info.codecStreamId();
432
1805
  }
433

            
434
  // This function is used to copy over every field exposed in the StreamInfo interface, with a
435
  // couple of exceptions noted below. Note that setFromForRecreateStream is reused here.
436
  // * request_headers_ is a raw pointer; to avoid pointer lifetime issues, a request header pointer
437
  // is required to be passed in here.
438
  // * downstream_connection_info_provider_ is always set in the ctor.
439
1508
  void setFrom(StreamInfo& info, const Http::RequestHeaderMap* request_headers) {
440
1508
    setFromForRecreateStream(info);
441
1508
    virtual_cluster_name_ = info.virtualClusterName();
442
1508
    response_code_ = info.responseCode();
443
1508
    custom_flags_.assign(info.customFlags().data(), info.customFlags().size());
444
1508
    response_code_details_ = info.responseCodeDetails();
445
1508
    connection_termination_details_ = info.connectionTerminationDetails();
446
1508
    upstream_info_ = info.upstreamInfo();
447
1508
    if (info.requestComplete().has_value()) {
448
      // derive final time from other info's complete duration and start time.
449
1507
      final_time_ = info.startTimeMonotonic() + info.requestComplete().value();
450
1507
    }
451
1508
    response_flags_.clear();
452
1508
    auto other_response_flags = info.responseFlags();
453
1508
    response_flags_.insert(response_flags_.end(), other_response_flags.begin(),
454
1508
                           other_response_flags.end());
455
1508
    health_check_request_ = info.healthCheck();
456
1508
    route_ = info.route();
457
1508
    vhost_ = info.virtualHost();
458
1508
    metadata_ = info.dynamicMetadata();
459
1508
    filter_state_ = info.filterState();
460
1508
    request_headers_ = request_headers;
461
1508
    upstream_cluster_info_ = info.upstreamClusterInfo();
462
1508
    auto stream_id_provider = info.getStreamIdProvider();
463
1508
    if (stream_id_provider.has_value() && stream_id_provider->toStringView().has_value()) {
464
1497
      std::string id{stream_id_provider->toStringView().value()};
465
1497
      stream_id_provider_ = std::make_shared<StreamIdProviderImpl>(std::move(id));
466
1497
    }
467
1508
    trace_reason_ = info.traceReason();
468
1508
    attempt_count_ = info.attemptCount();
469
1508
    upstream_bytes_meter_ = info.getUpstreamBytesMeter();
470
1508
    bytes_sent_ = info.bytesSent();
471
1508
    is_shadow_ = info.isShadow();
472
1508
    codec_stream_id_ = info.codecStreamId();
473
1508
    parent_stream_info_ = info.parentStreamInfo();
474
1508
  }
475

            
476
50593
  void setIsShadow(bool is_shadow) { is_shadow_ = is_shadow; }
477
48719
  bool isShadow() const override { return is_shadow_; }
478

            
479
454
  void setDownstreamTransportFailureReason(absl::string_view failure_reason) override {
480
454
    downstream_transport_failure_reason_ = std::string(failure_reason);
481
454
  }
482

            
483
1867
  absl::string_view downstreamTransportFailureReason() const override {
484
1867
    return downstream_transport_failure_reason_;
485
1867
  }
486

            
487
8617
  void setDownstreamLocalCloseReason(absl::string_view failure_reason) override {
488
8617
    downstream_local_close_reason_ = std::string(failure_reason);
489
8617
  }
490

            
491
1807
  absl::string_view downstreamLocalCloseReason() const override {
492
1807
    return downstream_local_close_reason_;
493
1807
  }
494

            
495
91
  void setDownstreamDetectedCloseType(DetectedCloseType close_type) override {
496
91
    downstream_detected_close_type_ = close_type;
497
91
  }
498

            
499
9
  DetectedCloseType downstreamDetectedCloseType() const override {
500
9
    return downstream_detected_close_type_;
501
9
  }
502

            
503
46582
  bool shouldSchemeMatchUpstream() const override { return should_scheme_match_upstream_; }
504

            
505
94065
  void setShouldSchemeMatchUpstream(bool should_match_upstream) override {
506
94065
    should_scheme_match_upstream_ = should_match_upstream;
507
94065
  }
508

            
509
98878
  bool shouldDrainConnectionUponCompletion() const override { return should_drain_connection_; }
510

            
511
1456
  void setShouldDrainConnectionUponCompletion(bool should_drain) override {
512
1456
    should_drain_connection_ = should_drain;
513
1456
  }
514

            
515
900
  void setParentStreamInfo(const StreamInfo& parent_stream_info) override {
516
900
    parent_stream_info_ = parent_stream_info;
517
900
  }
518

            
519
1518
  OptRef<const StreamInfo> parentStreamInfo() const override { return parent_stream_info_; }
520

            
521
17
  void clearParentStreamInfo() override { parent_stream_info_.reset(); }
522

            
523
3316
  absl::optional<uint32_t> codecStreamId() const override { return codec_stream_id_; }
524

            
525
94066
  void setCodecStreamId(absl::optional<uint32_t> id) override { codec_stream_id_ = id; }
526

            
527
  TimeSource& time_source_;
528
  SystemTime start_time_;
529
  MonotonicTime start_time_monotonic_;
530
  absl::optional<MonotonicTime> final_time_;
531
  absl::optional<Http::Protocol> protocol_;
532

            
533
private:
534
  absl::optional<uint32_t> response_code_;
535
  absl::optional<std::string> response_code_details_;
536
  absl::optional<std::string> connection_termination_details_;
537

            
538
public:
539
  absl::InlinedVector<ResponseFlag, 4> response_flags_;
540
  std::string custom_flags_;
541
  Router::RouteConstSharedPtr route_;
542
  Router::VirtualHostConstSharedPtr vhost_;
543
  envoy::config::core::v3::Metadata metadata_;
544
  FilterStateSharedPtr filter_state_;
545

            
546
private:
547
  absl::optional<uint32_t> attempt_count_;
548
  // TODO(agrawroh): Check if the owner of this storage outlives the StreamInfo. We should only copy
549
  // the string if it could outlive the StreamInfo.
550
  absl::optional<std::string> virtual_cluster_name_;
551

            
552
8562
  static Network::ConnectionInfoProviderSharedPtr emptyDownstreamAddressProvider() {
553
8562
    MUTABLE_CONSTRUCT_ON_FIRST_USE(
554
8562
        Network::ConnectionInfoProviderSharedPtr,
555
8562
        std::make_shared<Network::ConnectionInfoSetterImpl>(nullptr, nullptr));
556
8562
  }
557

            
558
  std::shared_ptr<UpstreamInfo> upstream_info_;
559
  const Network::ConnectionInfoProviderSharedPtr downstream_connection_info_provider_;
560
  const Http::RequestHeaderMap* request_headers_{};
561
  StreamIdProviderSharedPtr stream_id_provider_;
562
  absl::optional<DownstreamTiming> downstream_timing_;
563
  absl::optional<Upstream::ClusterInfoConstSharedPtr> upstream_cluster_info_;
564
  // Default construct the object because upstream stream is not constructed in some cases.
565
  BytesMeterSharedPtr upstream_bytes_meter_{std::make_shared<BytesMeter>()};
566
  BytesMeterSharedPtr downstream_bytes_meter_;
567
  std::string downstream_transport_failure_reason_;
568
  std::string downstream_local_close_reason_;
569
  DetectedCloseType downstream_detected_close_type_{DetectedCloseType::Normal};
570
  OptRef<const StreamInfo> parent_stream_info_;
571
  uint64_t bytes_received_{};
572
  uint64_t bytes_retransmitted_{};
573
  uint64_t packets_retransmitted_{};
574
  uint64_t bytes_sent_{};
575
  Tracing::Reason trace_reason_;
576
  bool health_check_request_{};
577
  bool should_scheme_match_upstream_{false};
578
  bool should_drain_connection_{false};
579
  bool is_shadow_{false};
580
  absl::optional<uint32_t> codec_stream_id_{};
581
};
582

            
583
} // namespace StreamInfo
584
} // namespace Envoy