Coverage Report

Created: 2026-10-23 06:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/trafficserver/include/proxy/http2/HTTP2.h
Line
Count
Source
1
/** @file
2
 *
3
 *  Fundamental HTTP/2 protocol definitions and parsers.
4
 *
5
 *  @section license License
6
 *
7
 *  Licensed to the Apache Software Foundation (ASF) under one
8
 *  or more contributor license agreements.  See the NOTICE file
9
 *  distributed with this work for additional information
10
 *  regarding copyright ownership.  The ASF licenses this file
11
 *  to you under the Apache License, Version 2.0 (the
12
 *  "License"); you may not use this file except in compliance
13
 *  with the License.  You may obtain a copy of the License at
14
 *
15
 *      http://www.apache.org/licenses/LICENSE-2.0
16
 *
17
 *  Unless required by applicable law or agreed to in writing, software
18
 *  distributed under the License is distributed on an "AS IS" BASIS,
19
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
 *  See the License for the specific language governing permissions and
21
 *  limitations under the License.
22
 */
23
24
#pragma once
25
26
#include "tscore/ink_defs.h"
27
#include "tscore/ink_memory.h"
28
#include "proxy/http2/HPACK.h"
29
#include "proxy/hdrs/MIME.h"
30
#include "records/RecDefs.h"
31
32
#include "tsutil/Metrics.h"
33
34
#include <atomic>
35
36
using ts::Metrics;
37
38
class HTTPHdr;
39
40
// [RFC 9113] 5.1.1 Stream identifiers.
41
using Http2StreamId = uint32_t;
42
43
constexpr Http2StreamId HTTP2_CONNECTION_CONTROL_STREAM = 0;
44
constexpr uint8_t       HTTP2_FRAME_NO_FLAG             = 0;
45
46
// [RFC 7540] 6.9.2. Initial Flow Control Window Size
47
// the flow control window can be come negative so we need to track it with a signed type.
48
using Http2WindowSize = int32_t;
49
50
extern const char *const HTTP2_CONNECTION_PREFACE;
51
const size_t             HTTP2_CONNECTION_PREFACE_LEN = 24;
52
53
const size_t HTTP2_FRAME_HEADER_LEN       = 9;
54
const size_t HTTP2_DATA_PADLEN_LEN        = 1;
55
const size_t HTTP2_HEADERS_PADLEN_LEN     = 1;
56
const size_t HTTP2_PRIORITY_LEN           = 5;
57
const size_t HTTP2_RST_STREAM_LEN         = 4;
58
const size_t HTTP2_PING_LEN               = 8;
59
const size_t HTTP2_GOAWAY_LEN             = 8;
60
const size_t HTTP2_WINDOW_UPDATE_LEN      = 4;
61
const size_t HTTP2_SETTINGS_PARAMETER_LEN = 6;
62
63
// SETTINGS initial values. NOTE: These should not be modified
64
// unless the protocol changes! Do not change this thinking you
65
// are changing server defaults. that is done via RecordsConfig.cc
66
const uint32_t HTTP2_ENABLE_PUSH            = 1;
67
const uint32_t HTTP2_MAX_CONCURRENT_STREAMS = UINT_MAX;
68
const uint32_t HTTP2_INITIAL_WINDOW_SIZE    = 65535;
69
const uint32_t HTTP2_MAX_FRAME_SIZE         = 16384;
70
const uint32_t HTTP2_HEADER_TABLE_SIZE      = 4096;
71
const uint32_t HTTP2_MAX_HEADER_LIST_SIZE   = UINT_MAX;
72
const uint32_t HTTP2_MAX_BUFFER_USAGE       = 524288;
73
74
// [RFC 7540] 5.3.5 Default Priorities
75
// The RFC says weight value is 1 to 256, but the value in TS is between 0 to 255
76
// to use uint8_t. So the default weight is 16 minus 1.
77
const uint32_t HTTP2_PRIORITY_DEFAULT_STREAM_DEPENDENCY = 0;
78
const uint8_t  HTTP2_PRIORITY_DEFAULT_WEIGHT            = 15;
79
80
// Statistics
81
struct Http2StatsBlock {
82
  Metrics::Gauge::AtomicType   *current_client_session_count;
83
  Metrics::Gauge::AtomicType   *current_server_session_count;
84
  Metrics::Gauge::AtomicType   *current_active_client_connection_count;
85
  Metrics::Gauge::AtomicType   *current_active_server_connection_count;
86
  Metrics::Gauge::AtomicType   *current_client_stream_count;
87
  Metrics::Gauge::AtomicType   *current_server_stream_count;
88
  Metrics::Counter::AtomicType *total_client_stream_count;
89
  Metrics::Counter::AtomicType *total_server_stream_count;
90
  Metrics::Counter::AtomicType *total_transactions_time;
91
  Metrics::Counter::AtomicType *total_client_connection_count;
92
  Metrics::Counter::AtomicType *total_server_connection_count;
93
  Metrics::Counter::AtomicType *stream_errors_count;
94
  Metrics::Counter::AtomicType *connection_errors_count;
95
  Metrics::Counter::AtomicType *session_die_default;
96
  Metrics::Counter::AtomicType *session_die_other;
97
  Metrics::Counter::AtomicType *session_die_active;
98
  Metrics::Counter::AtomicType *session_die_inactive;
99
  Metrics::Counter::AtomicType *session_die_eos;
100
  Metrics::Counter::AtomicType *session_die_error;
101
  Metrics::Counter::AtomicType *session_die_high_error_rate;
102
  Metrics::Counter::AtomicType *max_settings_per_frame_exceeded;
103
  Metrics::Counter::AtomicType *max_settings_per_minute_exceeded;
104
  Metrics::Counter::AtomicType *max_settings_frames_per_minute_exceeded;
105
  Metrics::Counter::AtomicType *max_ping_frames_per_minute_exceeded;
106
  Metrics::Counter::AtomicType *max_priority_frames_per_minute_exceeded;
107
  Metrics::Counter::AtomicType *max_rst_stream_frames_per_minute_exceeded;
108
  Metrics::Counter::AtomicType *max_continuation_frames_per_minute_exceeded;
109
  Metrics::Counter::AtomicType *max_empty_frames_per_minute_exceeded;
110
  Metrics::Counter::AtomicType *insufficient_avg_window_update;
111
  Metrics::Counter::AtomicType *max_concurrent_streams_exceeded_in;
112
  Metrics::Counter::AtomicType *max_concurrent_streams_exceeded_out;
113
  Metrics::Counter::AtomicType *max_active_streams_exceeded_in;
114
  Metrics::Counter::AtomicType *data_frames_in;
115
  Metrics::Counter::AtomicType *headers_frames_in;
116
  Metrics::Counter::AtomicType *priority_frames_in;
117
  Metrics::Counter::AtomicType *rst_stream_frames_in;
118
  Metrics::Counter::AtomicType *settings_frames_in;
119
  Metrics::Counter::AtomicType *push_promise_frames_in;
120
  Metrics::Counter::AtomicType *ping_frames_in;
121
  Metrics::Counter::AtomicType *goaway_frames_in;
122
  Metrics::Counter::AtomicType *window_update_frames_in;
123
  Metrics::Counter::AtomicType *continuation_frames_in;
124
  Metrics::Counter::AtomicType *unknown_frames_in;
125
};
126
127
extern Http2StatsBlock http2_rsb;
128
129
// [RFC 7540] 6.9.1. The Flow Control Window
130
static const Http2WindowSize HTTP2_MAX_WINDOW_SIZE = 0x7FFFFFFF;
131
132
// [RFC 7540] 5.4. Error Handling
133
enum class Http2ErrorClass {
134
  HTTP2_ERROR_CLASS_NONE,
135
  HTTP2_ERROR_CLASS_CONNECTION,
136
  HTTP2_ERROR_CLASS_STREAM,
137
};
138
139
// [RFC 7540] 7. Error Codes
140
enum class Http2ErrorCode {
141
  HTTP2_ERROR_NO_ERROR            = 0,
142
  HTTP2_ERROR_PROTOCOL_ERROR      = 1,
143
  HTTP2_ERROR_INTERNAL_ERROR      = 2,
144
  HTTP2_ERROR_FLOW_CONTROL_ERROR  = 3,
145
  HTTP2_ERROR_SETTINGS_TIMEOUT    = 4,
146
  HTTP2_ERROR_STREAM_CLOSED       = 5,
147
  HTTP2_ERROR_FRAME_SIZE_ERROR    = 6,
148
  HTTP2_ERROR_REFUSED_STREAM      = 7,
149
  HTTP2_ERROR_CANCEL              = 8,
150
  HTTP2_ERROR_COMPRESSION_ERROR   = 9,
151
  HTTP2_ERROR_CONNECT_ERROR       = 10,
152
  HTTP2_ERROR_ENHANCE_YOUR_CALM   = 11,
153
  HTTP2_ERROR_INADEQUATE_SECURITY = 12,
154
  HTTP2_ERROR_HTTP_1_1_REQUIRED   = 13,
155
156
  HTTP2_ERROR_MAX,
157
};
158
159
// [RFC 7540] 5.1. Stream States
160
enum class Http2StreamState {
161
  HTTP2_STREAM_STATE_IDLE,
162
  HTTP2_STREAM_STATE_RESERVED_LOCAL,
163
  HTTP2_STREAM_STATE_RESERVED_REMOTE,
164
  HTTP2_STREAM_STATE_OPEN,
165
  HTTP2_STREAM_STATE_HALF_CLOSED_LOCAL,
166
  HTTP2_STREAM_STATE_HALF_CLOSED_REMOTE,
167
  HTTP2_STREAM_STATE_CLOSED
168
};
169
170
enum Http2FrameType {
171
  HTTP2_FRAME_TYPE_DATA          = 0,
172
  HTTP2_FRAME_TYPE_HEADERS       = 1,
173
  HTTP2_FRAME_TYPE_PRIORITY      = 2,
174
  HTTP2_FRAME_TYPE_RST_STREAM    = 3,
175
  HTTP2_FRAME_TYPE_SETTINGS      = 4,
176
  HTTP2_FRAME_TYPE_PUSH_PROMISE  = 5,
177
  HTTP2_FRAME_TYPE_PING          = 6,
178
  HTTP2_FRAME_TYPE_GOAWAY        = 7,
179
  HTTP2_FRAME_TYPE_WINDOW_UPDATE = 8,
180
  HTTP2_FRAME_TYPE_CONTINUATION  = 9,
181
182
  HTTP2_FRAME_TYPE_MAX,
183
};
184
185
extern Metrics::Counter::AtomicType *http2_frame_metrics_in[HTTP2_FRAME_TYPE_MAX + 1];
186
187
// [RFC 7540] 6.1. Data
188
enum Http2FrameFlagsData {
189
  HTTP2_FLAGS_DATA_END_STREAM = 0x01,
190
  HTTP2_FLAGS_DATA_PADDED     = 0x08,
191
192
  HTTP2_FLAGS_DATA_MASK = 0x09,
193
};
194
195
// [RFC 7540] 6.2. Headers
196
enum Http2FrameFlagsHeaders {
197
  HTTP2_FLAGS_HEADERS_END_STREAM  = 0x01,
198
  HTTP2_FLAGS_HEADERS_END_HEADERS = 0x04,
199
  HTTP2_FLAGS_HEADERS_PADDED      = 0x08,
200
  HTTP2_FLAGS_HEADERS_PRIORITY    = 0x20,
201
202
  HTTP2_FLAGS_HEADERS_MASK = 0x2D,
203
};
204
205
// [RFC 7540] 6.3. Priority
206
enum Http2FrameFlagsPriority {
207
  HTTP2_FLAGS_PRIORITY_MASK = 0x00,
208
};
209
210
// [RFC 7540] 6.4. Rst Stream
211
enum Http2FrameFlagsRstStream {
212
  HTTP2_FLAGS_RST_STREAM_MASK = 0x00,
213
};
214
215
// [RFC 7540] 6.5. Settings
216
enum Http2FrameFlagsSettings {
217
  HTTP2_FLAGS_SETTINGS_ACK = 0x01,
218
219
  HTTP2_FLAGS_SETTINGS_MASK = 0x01
220
};
221
222
// [RFC 7540] 6.6. Push Promise
223
enum Http2FrameFlagsPushPromise {
224
  HTTP2_FLAGS_PUSH_PROMISE_END_HEADERS = 0x04,
225
  HTTP2_FLAGS_PUSH_PROMISE_PADDED      = 0x08,
226
227
  HTTP2_FLAGS_PUSH_PROMISE_MASK = 0x0C,
228
};
229
230
// [RFC 7540] 6.7. Ping
231
enum Http2FrameFlagsPing {
232
  HTTP2_FLAGS_PING_ACK = 0x01,
233
234
  HTTP2_FLAGS_PING_MASK = 0x01
235
};
236
237
// [RFC 7540] 6.8. Goaway
238
enum Http2FrameFlagsGoaway {
239
  HTTP2_FLAGS_GOAWAY_MASK = 0x00,
240
};
241
242
// [RFC 7540] 6.9. Window Update
243
enum Http2FrameFlagsWindowUpdate {
244
  HTTP2_FLAGS_WINDOW_UPDATE_MASK = 0x00,
245
};
246
247
// [RFC 7540] 6.10. Continuation
248
enum Http2FrameFlagsContinuation {
249
  HTTP2_FLAGS_CONTINUATION_END_HEADERS = 0x04,
250
251
  HTTP2_FLAGS_CONTINUATION_MASK = 0x04,
252
};
253
254
// [RFC 7540] 6.5.2. Defined SETTINGS Parameters
255
enum Http2SettingsIdentifier {
256
  HTTP2_SETTINGS_HEADER_TABLE_SIZE      = 1,
257
  HTTP2_SETTINGS_ENABLE_PUSH            = 2,
258
  HTTP2_SETTINGS_MAX_CONCURRENT_STREAMS = 3,
259
  HTTP2_SETTINGS_INITIAL_WINDOW_SIZE    = 4,
260
  HTTP2_SETTINGS_MAX_FRAME_SIZE         = 5,
261
  HTTP2_SETTINGS_MAX_HEADER_LIST_SIZE   = 6,
262
  HTTP2_SETTINGS_MAX, // Really just the max of the "densely numbered" core id's
263
};
264
265
// [RFC 7540] 4.1. Frame Format
266
struct Http2FrameHeader {
267
  uint32_t      length;
268
  uint8_t       type;
269
  uint8_t       flags;
270
  Http2StreamId streamid;
271
};
272
273
// [RFC 7540] 5.4. Error Handling
274
struct Http2Error {
275
  Http2Error(const Http2ErrorClass error_class = Http2ErrorClass::HTTP2_ERROR_CLASS_NONE,
276
             const Http2ErrorCode error_code = Http2ErrorCode::HTTP2_ERROR_NO_ERROR, const char *err_msg = "")
277
0
  {
278
0
    cls  = error_class;
279
0
    code = error_code;
280
0
    msg  = err_msg;
281
0
  };
282
283
  Http2ErrorClass cls;
284
  Http2ErrorCode  code;
285
  const char     *msg;
286
};
287
288
// [RFC 7540] 6.5.1. SETTINGS Format
289
struct Http2SettingsParameter {
290
  uint16_t id;
291
  uint32_t value;
292
};
293
294
// [RFC 7540] 6.3 PRIORITY Format
295
struct Http2Priority {
296
0
  Http2Priority() : weight(HTTP2_PRIORITY_DEFAULT_WEIGHT), stream_dependency(HTTP2_PRIORITY_DEFAULT_STREAM_DEPENDENCY) {}
297
298
  bool     exclusive_flag = false;
299
  uint8_t  weight;
300
  uint32_t stream_dependency;
301
};
302
303
// [RFC 7540] 6.2 HEADERS Format
304
struct Http2HeadersParameter {
305
0
  Http2HeadersParameter() {}
306
  uint8_t       pad_length = 0;
307
  Http2Priority priority;
308
};
309
310
// [RFC 7540] 6.8 GOAWAY Format
311
struct Http2Goaway {
312
0
  Http2Goaway() {}
313
  Http2StreamId  last_streamid = 0;
314
  Http2ErrorCode error_code    = Http2ErrorCode::HTTP2_ERROR_NO_ERROR;
315
316
  // NOTE: we don't (de)serialize the variable length debug data at this layer
317
  // because there's
318
  // really nothing we can do with it without some out of band agreement. Trying
319
  // to deal with it
320
  // just complicates memory management.
321
};
322
323
// [RFC 7540] 6.4 RST_STREAM Format
324
struct Http2RstStream {
325
  uint32_t error_code;
326
};
327
328
// [RFC 7540] 6.6 PUSH_PROMISE Format
329
struct Http2PushPromise {
330
  uint8_t       pad_length        = 0;
331
  Http2StreamId promised_streamid = 0;
332
};
333
334
static inline bool
335
http2_is_client_streamid(Http2StreamId streamid)
336
0
{
337
0
  return (streamid & 0x1u) == 0x1u;
338
0
}
Unexecuted instantiation: fuzz_hpack.cc:http2_is_client_streamid(unsigned int)
Unexecuted instantiation: HTTP2.cc:http2_is_client_streamid(unsigned int)
Unexecuted instantiation: Http2Frame.cc:http2_is_client_streamid(unsigned int)
Unexecuted instantiation: HttpSM.cc:http2_is_client_streamid(unsigned int)
Unexecuted instantiation: ProtocolProbeSessionAccept.cc:http2_is_client_streamid(unsigned int)
Unexecuted instantiation: Http2SessionAccept.cc:http2_is_client_streamid(unsigned int)
Unexecuted instantiation: Http2ClientSession.cc:http2_is_client_streamid(unsigned int)
Unexecuted instantiation: Http2CommonSession.cc:http2_is_client_streamid(unsigned int)
Unexecuted instantiation: Http2ConnectionState.cc:http2_is_client_streamid(unsigned int)
Unexecuted instantiation: Http2Stream.cc:http2_is_client_streamid(unsigned int)
Unexecuted instantiation: Http2DebugNames.cc:http2_is_client_streamid(unsigned int)
Unexecuted instantiation: Http2ServerSession.cc:http2_is_client_streamid(unsigned int)
339
340
static inline bool
341
http2_is_server_streamid(Http2StreamId streamid)
342
0
{
343
0
  return (streamid & 0x1u) == 0x0u && streamid != 0x0u;
344
0
}
Unexecuted instantiation: fuzz_hpack.cc:http2_is_server_streamid(unsigned int)
Unexecuted instantiation: HTTP2.cc:http2_is_server_streamid(unsigned int)
Unexecuted instantiation: Http2Frame.cc:http2_is_server_streamid(unsigned int)
Unexecuted instantiation: HttpSM.cc:http2_is_server_streamid(unsigned int)
Unexecuted instantiation: ProtocolProbeSessionAccept.cc:http2_is_server_streamid(unsigned int)
Unexecuted instantiation: Http2SessionAccept.cc:http2_is_server_streamid(unsigned int)
Unexecuted instantiation: Http2ClientSession.cc:http2_is_server_streamid(unsigned int)
Unexecuted instantiation: Http2CommonSession.cc:http2_is_server_streamid(unsigned int)
Unexecuted instantiation: Http2ConnectionState.cc:http2_is_server_streamid(unsigned int)
Unexecuted instantiation: Http2Stream.cc:http2_is_server_streamid(unsigned int)
Unexecuted instantiation: Http2DebugNames.cc:http2_is_server_streamid(unsigned int)
Unexecuted instantiation: Http2ServerSession.cc:http2_is_server_streamid(unsigned int)
345
346
bool http2_parse_frame_header(IOVec, Http2FrameHeader &);
347
348
bool http2_write_frame_header(const Http2FrameHeader &, IOVec);
349
350
bool http2_write_rst_stream(uint32_t, IOVec);
351
352
bool http2_write_settings(const Http2SettingsParameter &, const IOVec &);
353
354
bool http2_write_ping(const uint8_t *, IOVec);
355
356
bool http2_write_goaway(const Http2Goaway &, IOVec);
357
358
bool http2_write_window_update(const uint32_t new_size, const IOVec &);
359
360
bool http2_write_push_promise(const Http2PushPromise &push_promise, const uint8_t *src, size_t length, const IOVec &iov);
361
362
bool http2_frame_header_is_valid(const Http2FrameHeader &, unsigned);
363
364
bool http2_settings_parameter_is_valid(const Http2SettingsParameter &);
365
366
bool http2_parse_headers_parameter(IOVec, Http2HeadersParameter &);
367
368
bool http2_parse_priority_parameter(IOVec, Http2Priority &);
369
370
bool http2_parse_rst_stream(IOVec, Http2RstStream &);
371
372
bool http2_parse_settings_parameter(IOVec, Http2SettingsParameter &);
373
374
bool http2_parse_goaway(IOVec, Http2Goaway &);
375
376
bool http2_parse_window_update(IOVec, uint32_t &);
377
378
// Returns true if appending `payload_length` more bytes to an
379
// existing CONTINUATION header-block accumulator of `current_length` would
380
// overflow a uint32_t. Used by Http2ConnectionState::rcv_continuation_frame()
381
// to reject crafted CONTINUATION chains whose total payload would wrap the
382
// 32-bit accumulator and pair an undersized ats_realloc() with a memcpy at
383
// the pre-wrap offset.
384
static inline bool
385
http2_continuation_length_would_overflow(uint32_t current_length, uint32_t payload_length)
386
0
{
387
  return current_length > UINT32_MAX - payload_length;
388
0
}
Unexecuted instantiation: fuzz_hpack.cc:http2_continuation_length_would_overflow(unsigned int, unsigned int)
Unexecuted instantiation: HTTP2.cc:http2_continuation_length_would_overflow(unsigned int, unsigned int)
Unexecuted instantiation: Http2Frame.cc:http2_continuation_length_would_overflow(unsigned int, unsigned int)
Unexecuted instantiation: HttpSM.cc:http2_continuation_length_would_overflow(unsigned int, unsigned int)
Unexecuted instantiation: ProtocolProbeSessionAccept.cc:http2_continuation_length_would_overflow(unsigned int, unsigned int)
Unexecuted instantiation: Http2SessionAccept.cc:http2_continuation_length_would_overflow(unsigned int, unsigned int)
Unexecuted instantiation: Http2ClientSession.cc:http2_continuation_length_would_overflow(unsigned int, unsigned int)
Unexecuted instantiation: Http2CommonSession.cc:http2_continuation_length_would_overflow(unsigned int, unsigned int)
Unexecuted instantiation: Http2ConnectionState.cc:http2_continuation_length_would_overflow(unsigned int, unsigned int)
Unexecuted instantiation: Http2Stream.cc:http2_continuation_length_would_overflow(unsigned int, unsigned int)
Unexecuted instantiation: Http2DebugNames.cc:http2_continuation_length_would_overflow(unsigned int, unsigned int)
Unexecuted instantiation: Http2ServerSession.cc:http2_continuation_length_would_overflow(unsigned int, unsigned int)
389
390
Http2ErrorCode http2_decode_header_blocks(HTTPHdr *, const uint8_t *, const uint32_t, uint32_t *, HpackHandle &, bool, uint32_t,
391
                                          uint32_t, bool is_outbound = false);
392
393
Http2ErrorCode http2_encode_header_blocks(HTTPHdr *, uint8_t *, uint32_t, uint32_t *, HpackHandle &, int32_t);
394
395
ParseResult http2_convert_header_from_2_to_1_1(HTTPHdr *);
396
ParseResult http2_convert_header_from_1_1_to_2(HTTPHdr *);
397
void        http2_init();
398
399
/** Each of these values correspond to the flow control policy described in or
400
 * records.yaml documentation for proxy.config.http2.flow_control.policy_in.
401
 */
402
enum class Http2FlowControlPolicy {
403
  STATIC_SESSION_AND_STATIC_STREAM,
404
  LARGE_SESSION_AND_STATIC_STREAM,
405
  LARGE_SESSION_AND_DYNAMIC_STREAM,
406
};
407
408
// Not sure where else to put this, but figure this is as good of a start as
409
// anything else.
410
// Right now, only the static init() is available, which sets up some basic
411
// librecords
412
// dependencies.
413
class Http2
414
{
415
public:
416
  static uint32_t                            max_concurrent_streams_in;
417
  static uint32_t                            min_concurrent_streams_in;
418
  static uint32_t                            max_active_streams_in;
419
  static uint32_t                            max_active_streams_policy_in;
420
  static bool                                throttling;
421
  static uint32_t                            stream_priority_enabled;
422
  static uint32_t                            initial_window_size_in;
423
  static std::atomic<Http2FlowControlPolicy> flow_control_policy_in;
424
  static uint32_t                            max_frame_size;
425
  static uint32_t                            header_table_size;
426
  static uint32_t                            max_header_list_size;
427
  static uint32_t                            accept_no_activity_timeout;
428
  static uint32_t                            no_activity_timeout_in;
429
  static uint32_t                            active_timeout_in;
430
  static uint32_t                            incomplete_header_timeout_in;
431
  static uint32_t                            push_diary_size;
432
  static uint32_t                            zombie_timeout_in;
433
434
  static uint32_t                            max_concurrent_streams_out;
435
  static uint32_t                            min_concurrent_streams_out;
436
  static uint32_t                            max_active_streams_out;
437
  static uint32_t                            no_activity_timeout_out;
438
  static uint32_t                            initial_window_size_out;
439
  static std::atomic<Http2FlowControlPolicy> flow_control_policy_out;
440
441
  static float    stream_error_rate_threshold;
442
  static uint32_t stream_error_sampling_threshold;
443
  static int32_t  max_settings_per_frame;
444
  static int32_t  max_settings_per_minute;
445
  static int32_t  max_settings_frames_per_minute;
446
  static int32_t  max_ping_frames_per_minute;
447
  static int32_t  max_priority_frames_per_minute;
448
  static int32_t  max_rst_stream_frames_per_minute;
449
  static int32_t  max_continuation_frames_per_minute;
450
  static int32_t  max_empty_frames_per_minute;
451
  static float    min_avg_window_update;
452
  static uint32_t con_slow_log_threshold;
453
  static uint32_t stream_slow_log_threshold;
454
  static uint32_t header_table_size_limit;
455
  static uint32_t write_buffer_block_size;
456
  static int64_t  write_buffer_block_size_index;
457
  static float    write_size_threshold;
458
  static uint32_t write_time_threshold;
459
  static uint32_t buffer_water_mark;
460
461
  static void init();
462
};