1/*
2 * nghttp2 - HTTP/2 C Library
3 *
4 * Copyright (c) 2014 Tatsuhiro Tsujikawa
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining
7 * a copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sublicense, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be
15 * included in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 */
25#ifndef NGHTTP2_OPTION_H
26#define NGHTTP2_OPTION_H
27
28#ifdef HAVE_CONFIG_H
29#  include <config.h>
30#endif /* HAVE_CONFIG_H */
31
32#include <nghttp2/nghttp2.h>
33
34/**
35 * Configuration options
36 */
37typedef enum {
38  /**
39   * This option prevents the library from sending WINDOW_UPDATE for a
40   * connection automatically.  If this option is set to nonzero, the
41   * library won't send WINDOW_UPDATE for DATA until application calls
42   * nghttp2_session_consume() to indicate the amount of consumed
43   * DATA.  By default, this option is set to zero.
44   */
45  NGHTTP2_OPT_NO_AUTO_WINDOW_UPDATE = 1,
46  /**
47   * This option sets the SETTINGS_MAX_CONCURRENT_STREAMS value of
48   * remote endpoint as if it is received in SETTINGS frame. Without
49   * specifying this option, before the local endpoint receives
50   * SETTINGS_MAX_CONCURRENT_STREAMS in SETTINGS frame from remote
51   * endpoint, SETTINGS_MAX_CONCURRENT_STREAMS is unlimited. This may
52   * cause problem if local endpoint submits lots of requests
53   * initially and sending them at once to the remote peer may lead to
54   * the rejection of some requests. Specifying this option to the
55   * sensible value, say 100, may avoid this kind of issue. This value
56   * will be overwritten if the local endpoint receives
57   * SETTINGS_MAX_CONCURRENT_STREAMS from the remote endpoint.
58   */
59  NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS = 1 << 1,
60  NGHTTP2_OPT_NO_RECV_CLIENT_MAGIC = 1 << 2,
61  NGHTTP2_OPT_NO_HTTP_MESSAGING = 1 << 3,
62  NGHTTP2_OPT_MAX_RESERVED_REMOTE_STREAMS = 1 << 4,
63  NGHTTP2_OPT_USER_RECV_EXT_TYPES = 1 << 5,
64  NGHTTP2_OPT_NO_AUTO_PING_ACK = 1 << 6,
65  NGHTTP2_OPT_BUILTIN_RECV_EXT_TYPES = 1 << 7,
66  NGHTTP2_OPT_MAX_SEND_HEADER_BLOCK_LENGTH = 1 << 8,
67  NGHTTP2_OPT_MAX_DEFLATE_DYNAMIC_TABLE_SIZE = 1 << 9,
68  NGHTTP2_OPT_NO_CLOSED_STREAMS = 1 << 10,
69  NGHTTP2_OPT_MAX_OUTBOUND_ACK = 1 << 11,
70  NGHTTP2_OPT_MAX_SETTINGS = 1 << 12,
71  NGHTTP2_OPT_SERVER_FALLBACK_RFC7540_PRIORITIES = 1 << 13,
72  NGHTTP2_OPT_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION = 1 << 14,
73  NGHTTP2_OPT_STREAM_RESET_RATE_LIMIT = 1 << 15,
74} nghttp2_option_flag;
75
76/**
77 * Struct to store option values for nghttp2_session.
78 */
79struct nghttp2_option {
80  /**
81   * NGHTTP2_OPT_STREAM_RESET_RATE_LIMIT
82   */
83  uint64_t stream_reset_burst;
84  uint64_t stream_reset_rate;
85  /**
86   * NGHTTP2_OPT_MAX_SEND_HEADER_BLOCK_LENGTH
87   */
88  size_t max_send_header_block_length;
89  /**
90   * NGHTTP2_OPT_MAX_DEFLATE_DYNAMIC_TABLE_SIZE
91   */
92  size_t max_deflate_dynamic_table_size;
93  /**
94   * NGHTTP2_OPT_MAX_OUTBOUND_ACK
95   */
96  size_t max_outbound_ack;
97  /**
98   * NGHTTP2_OPT_MAX_SETTINGS
99   */
100  size_t max_settings;
101  /**
102   * Bitwise OR of nghttp2_option_flag to determine that which fields
103   * are specified.
104   */
105  uint32_t opt_set_mask;
106  /**
107   * NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS
108   */
109  uint32_t peer_max_concurrent_streams;
110  /**
111   * NGHTTP2_OPT_MAX_RESERVED_REMOTE_STREAMS
112   */
113  uint32_t max_reserved_remote_streams;
114  /**
115   * NGHTTP2_OPT_BUILTIN_RECV_EXT_TYPES
116   */
117  uint32_t builtin_recv_ext_types;
118  /**
119   * NGHTTP2_OPT_NO_AUTO_WINDOW_UPDATE
120   */
121  int no_auto_window_update;
122  /**
123   * NGHTTP2_OPT_NO_RECV_CLIENT_MAGIC
124   */
125  int no_recv_client_magic;
126  /**
127   * NGHTTP2_OPT_NO_HTTP_MESSAGING
128   */
129  int no_http_messaging;
130  /**
131   * NGHTTP2_OPT_NO_AUTO_PING_ACK
132   */
133  int no_auto_ping_ack;
134  /**
135   * NGHTTP2_OPT_NO_CLOSED_STREAMS
136   */
137  int no_closed_streams;
138  /**
139   * NGHTTP2_OPT_SERVER_FALLBACK_RFC7540_PRIORITIES
140   */
141  int server_fallback_rfc7540_priorities;
142  /**
143   * NGHTTP2_OPT_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION
144   */
145  int no_rfc9113_leading_and_trailing_ws_validation;
146  /**
147   * NGHTTP2_OPT_USER_RECV_EXT_TYPES
148   */
149  uint8_t user_recv_ext_types[32];
150};
151
152#endif /* NGHTTP2_OPTION_H */
153