Coverage Report

Created: 2023-06-07 06:20

/src/h2o/include/h2o/http2_common.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (c) 2018 Fastly Inc, Ichito Nagata
3
 *
4
 * Permission is hereby granted, free of charge, to any person obtaining a copy
5
 * of this software and associated documentation files (the "Software"), to
6
 * deal in the Software without restriction, including without limitation the
7
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
8
 * sell copies of the Software, and to permit persons to whom the Software is
9
 * furnished to do so, subject to the following conditions:
10
 *
11
 * The above copyright notice and this permission notice shall be included in
12
 * all copies or substantial portions of the Software.
13
 *
14
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20
 * IN THE SOFTWARE.
21
 */
22
#ifndef h2o__http2_common_h
23
#define h2o__http2_common_h
24
25
#include "h2o/string_.h"
26
#include "h2o/header.h"
27
#include "h2o/url.h"
28
#include "h2o/memory.h"
29
#include "h2o/cache_digests.h"
30
31
0
#define H2O_HTTP2_SETTINGS_HEADER_TABLE_SIZE 1
32
0
#define H2O_HTTP2_SETTINGS_ENABLE_PUSH 2
33
0
#define H2O_HTTP2_SETTINGS_MAX_CONCURRENT_STREAMS 3
34
0
#define H2O_HTTP2_SETTINGS_INITIAL_WINDOW_SIZE 4
35
0
#define H2O_HTTP2_SETTINGS_MAX_FRAME_SIZE 5
36
#define H2O_HTTP2_SETTINGS_MAX_HEADER_LIST_SIZE 6
37
38
/* defined as negated form of the error codes defined in HTTP2-spec section 7 */
39
0
#define H2O_HTTP2_ERROR_NONE 0
40
112
#define H2O_HTTP2_ERROR_PROTOCOL -1
41
0
#define H2O_HTTP2_ERROR_INTERNAL -2
42
0
#define H2O_HTTP2_ERROR_FLOW_CONTROL -3
43
0
#define H2O_HTTP2_ERROR_SETTINGS_TIMEOUT -4
44
0
#define H2O_HTTP2_ERROR_STREAM_CLOSED -5
45
0
#define H2O_HTTP2_ERROR_FRAME_SIZE -6
46
0
#define H2O_HTTP2_ERROR_REFUSED_STREAM -7
47
0
#define H2O_HTTP2_ERROR_CANCEL -8
48
23
#define H2O_HTTP2_ERROR_COMPRESSION -9
49
0
#define H2O_HTTP2_ERROR_CONNECT -10
50
0
#define H2O_HTTP2_ERROR_ENHANCE_YOUR_CALM -11
51
0
#define H2O_HTTP2_ERROR_INADEQUATE_SECURITY -12
52
0
#define H2O_HTTP2_ERROR_MAX 13
53
/* end of the HTTP2-spec defined errors */
54
#define H2O_HTTP2_ERROR_INVALID_HEADER_CHAR                                                                                        \
55
71.1k
    -254 /* an internal value indicating that invalid characters were found in the header name or value */
56
209
#define H2O_HTTP2_ERROR_INCOMPLETE -255 /* an internal value indicating that all data is not ready */
57
0
#define H2O_HTTP2_ERROR_PROTOCOL_CLOSE_IMMEDIATELY -256
58
59
typedef struct st_h2o_http2_settings_t {
60
    uint32_t header_table_size;
61
    uint32_t enable_push;
62
    uint32_t max_concurrent_streams;
63
    uint32_t initial_window_size;
64
    uint32_t max_frame_size;
65
} h2o_http2_settings_t;
66
67
extern const h2o_http2_settings_t H2O_HTTP2_SETTINGS_DEFAULT;
68
69
int h2o_http2_update_peer_settings(h2o_http2_settings_t *settings, const uint8_t *src, size_t len, const char **err_desc);
70
71
typedef struct st_h2o_http2_priority_t {
72
    int exclusive;
73
    uint32_t dependency;
74
    uint16_t weight;
75
} h2o_http2_priority_t;
76
77
extern const h2o_http2_priority_t h2o_http2_default_priority;
78
79
#define H2O_HTTP2_DEFAULT_OUTBUF_SIZE 81920 /* the target size of each write call; connection flow control window + alpha */
80
0
#define H2O_HTTP2_DEFAULT_OUTBUF_SOFT_MAX_SIZE 524288 /* 512KB; stops reading if size exceeds this value */
81
0
#define H2O_HTTP2_DEFAULT_OUTBUF_WRITE_TIMEOUT 60000  /* 60 seconds; close if write does not complete within the period */
82
83
/* hpack */
84
85
typedef struct st_h2o_hpack_header_table_t {
86
    /* ring buffer */
87
    struct st_h2o_hpack_header_table_entry_t *entries;
88
    size_t num_entries, entry_capacity, entry_start_index;
89
    /* size and capacities are 32+name_len+value_len (as defined by hpack spec.) */
90
    size_t hpack_size;
91
    size_t hpack_capacity;     /* the value set by SETTINGS_HEADER_TABLE_SIZE _and_ dynamic table size update */
92
    size_t hpack_max_capacity; /* the value set by SETTINGS_HEADER_TABLE_SIZE */
93
} h2o_hpack_header_table_t;
94
95
typedef struct st_h2o_hpack_header_table_entry_t {
96
    h2o_iovec_t *name;
97
    h2o_iovec_t *value;
98
    unsigned soft_errors;
99
} h2o_hpack_header_table_entry_t;
100
101
void h2o_hpack_dispose_header_table(h2o_hpack_header_table_t *header_table);
102
103
size_t h2o_hpack_encode_string(uint8_t *dst, const char *s, size_t len);
104
void h2o_hpack_flatten_push_promise(h2o_buffer_t **buf, h2o_hpack_header_table_t *header_table, uint32_t hpack_capacity,
105
                                    uint32_t stream_id, size_t max_frame_size, const h2o_url_scheme_t *scheme,
106
                                    h2o_iovec_t authority, h2o_iovec_t method, h2o_iovec_t path, const h2o_header_t *headers,
107
                                    size_t num_headers, uint32_t parent_stream_id);
108
void h2o_hpack_flatten_response(h2o_buffer_t **buf, h2o_hpack_header_table_t *header_table, uint32_t hpack_capacity,
109
                                uint32_t stream_id, size_t max_frame_size, int status, const h2o_header_t *headers,
110
                                size_t num_headers, const h2o_iovec_t *server_name, size_t content_length);
111
void h2o_hpack_flatten_request(h2o_buffer_t **buf, h2o_hpack_header_table_t *header_table, uint32_t hpack_capacity,
112
                               uint32_t stream_id, size_t max_frame_size, h2o_iovec_t method, h2o_url_t *url,
113
                               const h2o_header_t *headers, size_t num_headers, int is_end_stream);
114
void h2o_hpack_flatten_trailers(h2o_buffer_t **buf, h2o_hpack_header_table_t *header_table, uint32_t hpack_capacity,
115
                                uint32_t stream_id, size_t max_frame_size, const h2o_header_t *headers, size_t num_headers);
116
117
extern h2o_buffer_prototype_t h2o_http2_wbuf_buffer_prototype;
118
119
/* frames */
120
121
0
#define H2O_HTTP2_FRAME_HEADER_SIZE 9
122
123
0
#define H2O_HTTP2_FRAME_TYPE_DATA 0
124
0
#define H2O_HTTP2_FRAME_TYPE_HEADERS 1
125
#define H2O_HTTP2_FRAME_TYPE_PRIORITY 2
126
0
#define H2O_HTTP2_FRAME_TYPE_RST_STREAM 3
127
0
#define H2O_HTTP2_FRAME_TYPE_SETTINGS 4
128
0
#define H2O_HTTP2_FRAME_TYPE_PUSH_PROMISE 5
129
0
#define H2O_HTTP2_FRAME_TYPE_PING 6
130
0
#define H2O_HTTP2_FRAME_TYPE_GOAWAY 7
131
0
#define H2O_HTTP2_FRAME_TYPE_WINDOW_UPDATE 8
132
0
#define H2O_HTTP2_FRAME_TYPE_CONTINUATION 9
133
0
#define H2O_HTTP2_FRAME_TYPE_ORIGIN 12
134
135
0
#define H2O_HTTP2_FRAME_FLAG_END_STREAM 0x1
136
0
#define H2O_HTTP2_FRAME_FLAG_ACK 0x1
137
0
#define H2O_HTTP2_FRAME_FLAG_END_HEADERS 0x4
138
0
#define H2O_HTTP2_FRAME_FLAG_PADDED 0x8
139
0
#define H2O_HTTP2_FRAME_FLAG_PRIORITY 0x20
140
141
typedef struct st_h2o_http2_frame_t {
142
    uint32_t length;
143
    uint8_t type;
144
    uint8_t flags;
145
    uint32_t stream_id;
146
    const uint8_t *payload;
147
} h2o_http2_frame_t;
148
149
typedef struct st_h2o_http2_data_payload_t {
150
    const uint8_t *data;
151
    size_t length;
152
} h2o_http2_data_payload_t;
153
154
typedef struct st_h2o_http2_headers_payload_t {
155
    h2o_http2_priority_t priority;
156
    const uint8_t *headers;
157
    size_t headers_len;
158
} h2o_http2_headers_payload_t;
159
160
typedef struct st_h2o_http2_rst_stream_payload_t {
161
    uint32_t error_code;
162
} h2o_http2_rst_stream_payload_t;
163
164
typedef struct st_h2o_http2_ping_payload_t {
165
    uint8_t data[8];
166
} h2o_http2_ping_payload_t;
167
168
typedef struct st_h2o_http2_goaway_payload_t {
169
    uint32_t last_stream_id;
170
    uint32_t error_code;
171
    h2o_iovec_t debug_data;
172
} h2o_http2_goaway_payload_t;
173
174
typedef struct st_h2o_http2_window_update_payload_t {
175
    uint32_t window_size_increment;
176
} h2o_http2_window_update_payload_t;
177
178
uint8_t *h2o_http2_encode_frame_header(uint8_t *dst, size_t length, uint8_t type, uint8_t flags, int32_t stream_id);
179
180
#define h2o_http2_encode_rst_stream_frame(buf, stream_id, errnum)                                                                  \
181
0
    h2o_http2__encode_rst_stream_frame(buf, stream_id, (H2O_BUILD_ASSERT((errnum) > 0), errnum))
182
183
void h2o_http2__encode_rst_stream_frame(h2o_buffer_t **buf, uint32_t stream_id, int errnum);
184
void h2o_http2_encode_ping_frame(h2o_buffer_t **buf, int is_ack, const uint8_t *data);
185
void h2o_http2_encode_goaway_frame(h2o_buffer_t **buf, uint32_t last_stream_id, int errnum, h2o_iovec_t additional_data);
186
void h2o_http2_encode_window_update_frame(h2o_buffer_t **buf, uint32_t stream_id, int32_t window_size_increment);
187
void h2o_http2_encode_origin_frame(h2o_buffer_t **buf, h2o_iovec_t payload);
188
ssize_t h2o_http2_decode_frame(h2o_http2_frame_t *frame, const uint8_t *src, size_t len, size_t max_frame_size,
189
                               const char **err_desc);
190
int h2o_http2_decode_data_payload(h2o_http2_data_payload_t *payload, const h2o_http2_frame_t *frame, const char **err_desc);
191
int h2o_http2_decode_headers_payload(h2o_http2_headers_payload_t *payload, const h2o_http2_frame_t *frame, const char **err_desc);
192
int h2o_http2_decode_priority_payload(h2o_http2_priority_t *payload, const h2o_http2_frame_t *frame, const char **err_desc);
193
int h2o_http2_decode_rst_stream_payload(h2o_http2_rst_stream_payload_t *payload, const h2o_http2_frame_t *frame,
194
                                        const char **err_desc);
195
int h2o_http2_decode_ping_payload(h2o_http2_ping_payload_t *payload, const h2o_http2_frame_t *frame, const char **err_desc);
196
int h2o_http2_decode_goaway_payload(h2o_http2_goaway_payload_t *payload, const h2o_http2_frame_t *frame, const char **err_desc);
197
int h2o_http2_decode_window_update_payload(h2o_http2_window_update_payload_t *paylaod, const h2o_http2_frame_t *frame,
198
                                           const char **err_desc, int *err_is_stream_level);
199
200
typedef struct st_h2o_http2_window_t {
201
    ssize_t _avail;
202
} h2o_http2_window_t;
203
204
static void h2o_http2_window_init(h2o_http2_window_t *window, uint32_t initial_window_size);
205
static int h2o_http2_window_update(h2o_http2_window_t *window, ssize_t delta);
206
static ssize_t h2o_http2_window_get_avail(h2o_http2_window_t *window);
207
static void h2o_http2_window_consume_window(h2o_http2_window_t *window, size_t bytes);
208
209
static h2o_hpack_header_table_entry_t *h2o_hpack_header_table_get(h2o_hpack_header_table_t *table, size_t index);
210
211
/* misc */
212
213
static uint16_t h2o_http2_decode16u(const uint8_t *src);
214
static uint32_t h2o_http2_decode24u(const uint8_t *src);
215
static uint32_t h2o_http2_decode32u(const uint8_t *src);
216
static uint8_t *h2o_http2_encode24u(uint8_t *dst, uint32_t value);
217
static uint8_t *h2o_http2_encode32u(uint8_t *dst, uint32_t value);
218
219
/* inline definitions */
220
221
inline void h2o_http2_window_init(h2o_http2_window_t *window, uint32_t initial_window_size)
222
0
{
223
0
    window->_avail = initial_window_size;
224
0
}
Unexecuted instantiation: driver_h3.cc:h2o_http2_window_init(st_h2o_http2_window_t*, unsigned int)
Unexecuted instantiation: driver_common.cc:h2o_http2_window_init(st_h2o_http2_window_t*, unsigned int)
Unexecuted instantiation: http2client.c:h2o_http2_window_init
Unexecuted instantiation: http3client.c:h2o_http2_window_init
Unexecuted instantiation: absprio.c:h2o_http2_window_init
Unexecuted instantiation: config.c:h2o_http2_window_init
Unexecuted instantiation: configurator.c:h2o_http2_window_init
Unexecuted instantiation: context.c:h2o_http2_window_init
Unexecuted instantiation: headers.c:h2o_http2_window_init
Unexecuted instantiation: logconf.c:h2o_http2_window_init
Unexecuted instantiation: proxy.c:h2o_http2_window_init
Unexecuted instantiation: request.c:h2o_http2_window_init
Unexecuted instantiation: util.c:h2o_http2_window_init
Unexecuted instantiation: access_log.c:h2o_http2_window_init
Unexecuted instantiation: compress.c:h2o_http2_window_init
Unexecuted instantiation: gzip.c:h2o_http2_window_init
Unexecuted instantiation: errordoc.c:h2o_http2_window_init
Unexecuted instantiation: expires.c:h2o_http2_window_init
Unexecuted instantiation: fastcgi.c:h2o_http2_window_init
Unexecuted instantiation: file.c:h2o_http2_window_init
Unexecuted instantiation: mimemap.c:h2o_http2_window_init
Unexecuted instantiation: connect.c:h2o_http2_window_init
Unexecuted instantiation: redirect.c:h2o_http2_window_init
Unexecuted instantiation: reproxy.c:h2o_http2_window_init
Unexecuted instantiation: throttle_resp.c:h2o_http2_window_init
Unexecuted instantiation: self_trace.c:h2o_http2_window_init
Unexecuted instantiation: server_timing.c:h2o_http2_window_init
Unexecuted instantiation: status.c:h2o_http2_window_init
Unexecuted instantiation: headers_util.c:h2o_http2_window_init
Unexecuted instantiation: events.c:h2o_http2_window_init
Unexecuted instantiation: memory.c:h2o_http2_window_init
Unexecuted instantiation: requests.c:h2o_http2_window_init
Unexecuted instantiation: ssl.c:h2o_http2_window_init
Unexecuted instantiation: http2_debug_state.c:h2o_http2_window_init
Unexecuted instantiation: durations.c:h2o_http2_window_init
Unexecuted instantiation: http1.c:h2o_http2_window_init
Unexecuted instantiation: connection.c:h2o_http2_window_init
Unexecuted instantiation: frame.c:h2o_http2_window_init
Unexecuted instantiation: hpack.c:h2o_http2_window_init
Unexecuted instantiation: scheduler.c:h2o_http2_window_init
Unexecuted instantiation: stream.c:h2o_http2_window_init
Unexecuted instantiation: qpack.c:h2o_http2_window_init
Unexecuted instantiation: server.c:h2o_http2_window_init
Unexecuted instantiation: brotli.c:h2o_http2_window_init
225
226
inline int h2o_http2_window_update(h2o_http2_window_t *window, ssize_t delta)
227
0
{
228
0
    ssize_t v = window->_avail + delta;
229
0
    if (v > INT32_MAX)
230
0
        return -1;
231
0
    window->_avail = v;
232
0
    return 0;
233
0
}
Unexecuted instantiation: driver_h3.cc:h2o_http2_window_update(st_h2o_http2_window_t*, long)
Unexecuted instantiation: driver_common.cc:h2o_http2_window_update(st_h2o_http2_window_t*, long)
Unexecuted instantiation: http2client.c:h2o_http2_window_update
Unexecuted instantiation: http3client.c:h2o_http2_window_update
Unexecuted instantiation: absprio.c:h2o_http2_window_update
Unexecuted instantiation: config.c:h2o_http2_window_update
Unexecuted instantiation: configurator.c:h2o_http2_window_update
Unexecuted instantiation: context.c:h2o_http2_window_update
Unexecuted instantiation: headers.c:h2o_http2_window_update
Unexecuted instantiation: logconf.c:h2o_http2_window_update
Unexecuted instantiation: proxy.c:h2o_http2_window_update
Unexecuted instantiation: request.c:h2o_http2_window_update
Unexecuted instantiation: util.c:h2o_http2_window_update
Unexecuted instantiation: access_log.c:h2o_http2_window_update
Unexecuted instantiation: compress.c:h2o_http2_window_update
Unexecuted instantiation: gzip.c:h2o_http2_window_update
Unexecuted instantiation: errordoc.c:h2o_http2_window_update
Unexecuted instantiation: expires.c:h2o_http2_window_update
Unexecuted instantiation: fastcgi.c:h2o_http2_window_update
Unexecuted instantiation: file.c:h2o_http2_window_update
Unexecuted instantiation: mimemap.c:h2o_http2_window_update
Unexecuted instantiation: connect.c:h2o_http2_window_update
Unexecuted instantiation: redirect.c:h2o_http2_window_update
Unexecuted instantiation: reproxy.c:h2o_http2_window_update
Unexecuted instantiation: throttle_resp.c:h2o_http2_window_update
Unexecuted instantiation: self_trace.c:h2o_http2_window_update
Unexecuted instantiation: server_timing.c:h2o_http2_window_update
Unexecuted instantiation: status.c:h2o_http2_window_update
Unexecuted instantiation: headers_util.c:h2o_http2_window_update
Unexecuted instantiation: events.c:h2o_http2_window_update
Unexecuted instantiation: memory.c:h2o_http2_window_update
Unexecuted instantiation: requests.c:h2o_http2_window_update
Unexecuted instantiation: ssl.c:h2o_http2_window_update
Unexecuted instantiation: http2_debug_state.c:h2o_http2_window_update
Unexecuted instantiation: durations.c:h2o_http2_window_update
Unexecuted instantiation: http1.c:h2o_http2_window_update
Unexecuted instantiation: connection.c:h2o_http2_window_update
Unexecuted instantiation: frame.c:h2o_http2_window_update
Unexecuted instantiation: hpack.c:h2o_http2_window_update
Unexecuted instantiation: scheduler.c:h2o_http2_window_update
Unexecuted instantiation: stream.c:h2o_http2_window_update
Unexecuted instantiation: qpack.c:h2o_http2_window_update
Unexecuted instantiation: server.c:h2o_http2_window_update
Unexecuted instantiation: brotli.c:h2o_http2_window_update
234
235
inline ssize_t h2o_http2_window_get_avail(h2o_http2_window_t *window)
236
0
{
237
0
    return window->_avail;
238
0
}
Unexecuted instantiation: driver_h3.cc:h2o_http2_window_get_avail(st_h2o_http2_window_t*)
Unexecuted instantiation: driver_common.cc:h2o_http2_window_get_avail(st_h2o_http2_window_t*)
Unexecuted instantiation: http2client.c:h2o_http2_window_get_avail
Unexecuted instantiation: http3client.c:h2o_http2_window_get_avail
Unexecuted instantiation: absprio.c:h2o_http2_window_get_avail
Unexecuted instantiation: config.c:h2o_http2_window_get_avail
Unexecuted instantiation: configurator.c:h2o_http2_window_get_avail
Unexecuted instantiation: context.c:h2o_http2_window_get_avail
Unexecuted instantiation: headers.c:h2o_http2_window_get_avail
Unexecuted instantiation: logconf.c:h2o_http2_window_get_avail
Unexecuted instantiation: proxy.c:h2o_http2_window_get_avail
Unexecuted instantiation: request.c:h2o_http2_window_get_avail
Unexecuted instantiation: util.c:h2o_http2_window_get_avail
Unexecuted instantiation: access_log.c:h2o_http2_window_get_avail
Unexecuted instantiation: compress.c:h2o_http2_window_get_avail
Unexecuted instantiation: gzip.c:h2o_http2_window_get_avail
Unexecuted instantiation: errordoc.c:h2o_http2_window_get_avail
Unexecuted instantiation: expires.c:h2o_http2_window_get_avail
Unexecuted instantiation: fastcgi.c:h2o_http2_window_get_avail
Unexecuted instantiation: file.c:h2o_http2_window_get_avail
Unexecuted instantiation: mimemap.c:h2o_http2_window_get_avail
Unexecuted instantiation: connect.c:h2o_http2_window_get_avail
Unexecuted instantiation: redirect.c:h2o_http2_window_get_avail
Unexecuted instantiation: reproxy.c:h2o_http2_window_get_avail
Unexecuted instantiation: throttle_resp.c:h2o_http2_window_get_avail
Unexecuted instantiation: self_trace.c:h2o_http2_window_get_avail
Unexecuted instantiation: server_timing.c:h2o_http2_window_get_avail
Unexecuted instantiation: status.c:h2o_http2_window_get_avail
Unexecuted instantiation: headers_util.c:h2o_http2_window_get_avail
Unexecuted instantiation: events.c:h2o_http2_window_get_avail
Unexecuted instantiation: memory.c:h2o_http2_window_get_avail
Unexecuted instantiation: requests.c:h2o_http2_window_get_avail
Unexecuted instantiation: ssl.c:h2o_http2_window_get_avail
Unexecuted instantiation: http2_debug_state.c:h2o_http2_window_get_avail
Unexecuted instantiation: durations.c:h2o_http2_window_get_avail
Unexecuted instantiation: http1.c:h2o_http2_window_get_avail
Unexecuted instantiation: connection.c:h2o_http2_window_get_avail
Unexecuted instantiation: frame.c:h2o_http2_window_get_avail
Unexecuted instantiation: hpack.c:h2o_http2_window_get_avail
Unexecuted instantiation: scheduler.c:h2o_http2_window_get_avail
Unexecuted instantiation: stream.c:h2o_http2_window_get_avail
Unexecuted instantiation: qpack.c:h2o_http2_window_get_avail
Unexecuted instantiation: server.c:h2o_http2_window_get_avail
Unexecuted instantiation: brotli.c:h2o_http2_window_get_avail
239
240
inline void h2o_http2_window_consume_window(h2o_http2_window_t *window, size_t bytes)
241
0
{
242
0
    window->_avail -= bytes;
243
0
}
Unexecuted instantiation: driver_h3.cc:h2o_http2_window_consume_window(st_h2o_http2_window_t*, unsigned long)
Unexecuted instantiation: driver_common.cc:h2o_http2_window_consume_window(st_h2o_http2_window_t*, unsigned long)
Unexecuted instantiation: http2client.c:h2o_http2_window_consume_window
Unexecuted instantiation: http3client.c:h2o_http2_window_consume_window
Unexecuted instantiation: absprio.c:h2o_http2_window_consume_window
Unexecuted instantiation: config.c:h2o_http2_window_consume_window
Unexecuted instantiation: configurator.c:h2o_http2_window_consume_window
Unexecuted instantiation: context.c:h2o_http2_window_consume_window
Unexecuted instantiation: headers.c:h2o_http2_window_consume_window
Unexecuted instantiation: logconf.c:h2o_http2_window_consume_window
Unexecuted instantiation: proxy.c:h2o_http2_window_consume_window
Unexecuted instantiation: request.c:h2o_http2_window_consume_window
Unexecuted instantiation: util.c:h2o_http2_window_consume_window
Unexecuted instantiation: access_log.c:h2o_http2_window_consume_window
Unexecuted instantiation: compress.c:h2o_http2_window_consume_window
Unexecuted instantiation: gzip.c:h2o_http2_window_consume_window
Unexecuted instantiation: errordoc.c:h2o_http2_window_consume_window
Unexecuted instantiation: expires.c:h2o_http2_window_consume_window
Unexecuted instantiation: fastcgi.c:h2o_http2_window_consume_window
Unexecuted instantiation: file.c:h2o_http2_window_consume_window
Unexecuted instantiation: mimemap.c:h2o_http2_window_consume_window
Unexecuted instantiation: connect.c:h2o_http2_window_consume_window
Unexecuted instantiation: redirect.c:h2o_http2_window_consume_window
Unexecuted instantiation: reproxy.c:h2o_http2_window_consume_window
Unexecuted instantiation: throttle_resp.c:h2o_http2_window_consume_window
Unexecuted instantiation: self_trace.c:h2o_http2_window_consume_window
Unexecuted instantiation: server_timing.c:h2o_http2_window_consume_window
Unexecuted instantiation: status.c:h2o_http2_window_consume_window
Unexecuted instantiation: headers_util.c:h2o_http2_window_consume_window
Unexecuted instantiation: events.c:h2o_http2_window_consume_window
Unexecuted instantiation: memory.c:h2o_http2_window_consume_window
Unexecuted instantiation: requests.c:h2o_http2_window_consume_window
Unexecuted instantiation: ssl.c:h2o_http2_window_consume_window
Unexecuted instantiation: http2_debug_state.c:h2o_http2_window_consume_window
Unexecuted instantiation: durations.c:h2o_http2_window_consume_window
Unexecuted instantiation: http1.c:h2o_http2_window_consume_window
Unexecuted instantiation: connection.c:h2o_http2_window_consume_window
Unexecuted instantiation: frame.c:h2o_http2_window_consume_window
Unexecuted instantiation: hpack.c:h2o_http2_window_consume_window
Unexecuted instantiation: scheduler.c:h2o_http2_window_consume_window
Unexecuted instantiation: stream.c:h2o_http2_window_consume_window
Unexecuted instantiation: qpack.c:h2o_http2_window_consume_window
Unexecuted instantiation: server.c:h2o_http2_window_consume_window
Unexecuted instantiation: brotli.c:h2o_http2_window_consume_window
244
245
inline uint16_t h2o_http2_decode16u(const uint8_t *src)
246
0
{
247
0
    return (uint16_t)src[0] << 8 | src[1];
248
0
}
Unexecuted instantiation: driver_h3.cc:h2o_http2_decode16u(unsigned char const*)
Unexecuted instantiation: driver_common.cc:h2o_http2_decode16u(unsigned char const*)
Unexecuted instantiation: http2client.c:h2o_http2_decode16u
Unexecuted instantiation: http3client.c:h2o_http2_decode16u
Unexecuted instantiation: absprio.c:h2o_http2_decode16u
Unexecuted instantiation: config.c:h2o_http2_decode16u
Unexecuted instantiation: configurator.c:h2o_http2_decode16u
Unexecuted instantiation: context.c:h2o_http2_decode16u
Unexecuted instantiation: headers.c:h2o_http2_decode16u
Unexecuted instantiation: logconf.c:h2o_http2_decode16u
Unexecuted instantiation: proxy.c:h2o_http2_decode16u
Unexecuted instantiation: request.c:h2o_http2_decode16u
Unexecuted instantiation: util.c:h2o_http2_decode16u
Unexecuted instantiation: access_log.c:h2o_http2_decode16u
Unexecuted instantiation: compress.c:h2o_http2_decode16u
Unexecuted instantiation: gzip.c:h2o_http2_decode16u
Unexecuted instantiation: errordoc.c:h2o_http2_decode16u
Unexecuted instantiation: expires.c:h2o_http2_decode16u
Unexecuted instantiation: fastcgi.c:h2o_http2_decode16u
Unexecuted instantiation: file.c:h2o_http2_decode16u
Unexecuted instantiation: mimemap.c:h2o_http2_decode16u
Unexecuted instantiation: connect.c:h2o_http2_decode16u
Unexecuted instantiation: redirect.c:h2o_http2_decode16u
Unexecuted instantiation: reproxy.c:h2o_http2_decode16u
Unexecuted instantiation: throttle_resp.c:h2o_http2_decode16u
Unexecuted instantiation: self_trace.c:h2o_http2_decode16u
Unexecuted instantiation: server_timing.c:h2o_http2_decode16u
Unexecuted instantiation: status.c:h2o_http2_decode16u
Unexecuted instantiation: headers_util.c:h2o_http2_decode16u
Unexecuted instantiation: events.c:h2o_http2_decode16u
Unexecuted instantiation: memory.c:h2o_http2_decode16u
Unexecuted instantiation: requests.c:h2o_http2_decode16u
Unexecuted instantiation: ssl.c:h2o_http2_decode16u
Unexecuted instantiation: http2_debug_state.c:h2o_http2_decode16u
Unexecuted instantiation: durations.c:h2o_http2_decode16u
Unexecuted instantiation: http1.c:h2o_http2_decode16u
Unexecuted instantiation: connection.c:h2o_http2_decode16u
Unexecuted instantiation: frame.c:h2o_http2_decode16u
Unexecuted instantiation: hpack.c:h2o_http2_decode16u
Unexecuted instantiation: scheduler.c:h2o_http2_decode16u
Unexecuted instantiation: stream.c:h2o_http2_decode16u
Unexecuted instantiation: qpack.c:h2o_http2_decode16u
Unexecuted instantiation: server.c:h2o_http2_decode16u
Unexecuted instantiation: brotli.c:h2o_http2_decode16u
249
250
inline uint32_t h2o_http2_decode24u(const uint8_t *src)
251
0
{
252
0
    return (uint32_t)src[0] << 16 | (uint32_t)src[1] << 8 | src[2];
253
0
}
Unexecuted instantiation: driver_h3.cc:h2o_http2_decode24u(unsigned char const*)
Unexecuted instantiation: driver_common.cc:h2o_http2_decode24u(unsigned char const*)
Unexecuted instantiation: http2client.c:h2o_http2_decode24u
Unexecuted instantiation: http3client.c:h2o_http2_decode24u
Unexecuted instantiation: absprio.c:h2o_http2_decode24u
Unexecuted instantiation: config.c:h2o_http2_decode24u
Unexecuted instantiation: configurator.c:h2o_http2_decode24u
Unexecuted instantiation: context.c:h2o_http2_decode24u
Unexecuted instantiation: headers.c:h2o_http2_decode24u
Unexecuted instantiation: logconf.c:h2o_http2_decode24u
Unexecuted instantiation: proxy.c:h2o_http2_decode24u
Unexecuted instantiation: request.c:h2o_http2_decode24u
Unexecuted instantiation: util.c:h2o_http2_decode24u
Unexecuted instantiation: access_log.c:h2o_http2_decode24u
Unexecuted instantiation: compress.c:h2o_http2_decode24u
Unexecuted instantiation: gzip.c:h2o_http2_decode24u
Unexecuted instantiation: errordoc.c:h2o_http2_decode24u
Unexecuted instantiation: expires.c:h2o_http2_decode24u
Unexecuted instantiation: fastcgi.c:h2o_http2_decode24u
Unexecuted instantiation: file.c:h2o_http2_decode24u
Unexecuted instantiation: mimemap.c:h2o_http2_decode24u
Unexecuted instantiation: connect.c:h2o_http2_decode24u
Unexecuted instantiation: redirect.c:h2o_http2_decode24u
Unexecuted instantiation: reproxy.c:h2o_http2_decode24u
Unexecuted instantiation: throttle_resp.c:h2o_http2_decode24u
Unexecuted instantiation: self_trace.c:h2o_http2_decode24u
Unexecuted instantiation: server_timing.c:h2o_http2_decode24u
Unexecuted instantiation: status.c:h2o_http2_decode24u
Unexecuted instantiation: headers_util.c:h2o_http2_decode24u
Unexecuted instantiation: events.c:h2o_http2_decode24u
Unexecuted instantiation: memory.c:h2o_http2_decode24u
Unexecuted instantiation: requests.c:h2o_http2_decode24u
Unexecuted instantiation: ssl.c:h2o_http2_decode24u
Unexecuted instantiation: http2_debug_state.c:h2o_http2_decode24u
Unexecuted instantiation: durations.c:h2o_http2_decode24u
Unexecuted instantiation: http1.c:h2o_http2_decode24u
Unexecuted instantiation: connection.c:h2o_http2_decode24u
Unexecuted instantiation: frame.c:h2o_http2_decode24u
Unexecuted instantiation: hpack.c:h2o_http2_decode24u
Unexecuted instantiation: scheduler.c:h2o_http2_decode24u
Unexecuted instantiation: stream.c:h2o_http2_decode24u
Unexecuted instantiation: qpack.c:h2o_http2_decode24u
Unexecuted instantiation: server.c:h2o_http2_decode24u
Unexecuted instantiation: brotli.c:h2o_http2_decode24u
254
255
inline uint32_t h2o_http2_decode32u(const uint8_t *src)
256
0
{
257
0
    return (uint32_t)src[0] << 24 | (uint32_t)src[1] << 16 | (uint32_t)src[2] << 8 | src[3];
258
0
}
Unexecuted instantiation: driver_h3.cc:h2o_http2_decode32u(unsigned char const*)
Unexecuted instantiation: driver_common.cc:h2o_http2_decode32u(unsigned char const*)
Unexecuted instantiation: http2client.c:h2o_http2_decode32u
Unexecuted instantiation: http3client.c:h2o_http2_decode32u
Unexecuted instantiation: absprio.c:h2o_http2_decode32u
Unexecuted instantiation: config.c:h2o_http2_decode32u
Unexecuted instantiation: configurator.c:h2o_http2_decode32u
Unexecuted instantiation: context.c:h2o_http2_decode32u
Unexecuted instantiation: headers.c:h2o_http2_decode32u
Unexecuted instantiation: logconf.c:h2o_http2_decode32u
Unexecuted instantiation: proxy.c:h2o_http2_decode32u
Unexecuted instantiation: request.c:h2o_http2_decode32u
Unexecuted instantiation: util.c:h2o_http2_decode32u
Unexecuted instantiation: access_log.c:h2o_http2_decode32u
Unexecuted instantiation: compress.c:h2o_http2_decode32u
Unexecuted instantiation: gzip.c:h2o_http2_decode32u
Unexecuted instantiation: errordoc.c:h2o_http2_decode32u
Unexecuted instantiation: expires.c:h2o_http2_decode32u
Unexecuted instantiation: fastcgi.c:h2o_http2_decode32u
Unexecuted instantiation: file.c:h2o_http2_decode32u
Unexecuted instantiation: mimemap.c:h2o_http2_decode32u
Unexecuted instantiation: connect.c:h2o_http2_decode32u
Unexecuted instantiation: redirect.c:h2o_http2_decode32u
Unexecuted instantiation: reproxy.c:h2o_http2_decode32u
Unexecuted instantiation: throttle_resp.c:h2o_http2_decode32u
Unexecuted instantiation: self_trace.c:h2o_http2_decode32u
Unexecuted instantiation: server_timing.c:h2o_http2_decode32u
Unexecuted instantiation: status.c:h2o_http2_decode32u
Unexecuted instantiation: headers_util.c:h2o_http2_decode32u
Unexecuted instantiation: events.c:h2o_http2_decode32u
Unexecuted instantiation: memory.c:h2o_http2_decode32u
Unexecuted instantiation: requests.c:h2o_http2_decode32u
Unexecuted instantiation: ssl.c:h2o_http2_decode32u
Unexecuted instantiation: http2_debug_state.c:h2o_http2_decode32u
Unexecuted instantiation: durations.c:h2o_http2_decode32u
Unexecuted instantiation: http1.c:h2o_http2_decode32u
Unexecuted instantiation: connection.c:h2o_http2_decode32u
Unexecuted instantiation: frame.c:h2o_http2_decode32u
Unexecuted instantiation: hpack.c:h2o_http2_decode32u
Unexecuted instantiation: scheduler.c:h2o_http2_decode32u
Unexecuted instantiation: stream.c:h2o_http2_decode32u
Unexecuted instantiation: qpack.c:h2o_http2_decode32u
Unexecuted instantiation: server.c:h2o_http2_decode32u
Unexecuted instantiation: brotli.c:h2o_http2_decode32u
259
260
inline uint8_t *h2o_http2_encode24u(uint8_t *dst, uint32_t value)
261
0
{
262
0
    *dst++ = value >> 16;
263
0
    *dst++ = value >> 8;
264
0
    *dst++ = value;
265
0
    return dst;
266
0
}
Unexecuted instantiation: driver_h3.cc:h2o_http2_encode24u(unsigned char*, unsigned int)
Unexecuted instantiation: driver_common.cc:h2o_http2_encode24u(unsigned char*, unsigned int)
Unexecuted instantiation: http2client.c:h2o_http2_encode24u
Unexecuted instantiation: http3client.c:h2o_http2_encode24u
Unexecuted instantiation: absprio.c:h2o_http2_encode24u
Unexecuted instantiation: config.c:h2o_http2_encode24u
Unexecuted instantiation: configurator.c:h2o_http2_encode24u
Unexecuted instantiation: context.c:h2o_http2_encode24u
Unexecuted instantiation: headers.c:h2o_http2_encode24u
Unexecuted instantiation: logconf.c:h2o_http2_encode24u
Unexecuted instantiation: proxy.c:h2o_http2_encode24u
Unexecuted instantiation: request.c:h2o_http2_encode24u
Unexecuted instantiation: util.c:h2o_http2_encode24u
Unexecuted instantiation: access_log.c:h2o_http2_encode24u
Unexecuted instantiation: compress.c:h2o_http2_encode24u
Unexecuted instantiation: gzip.c:h2o_http2_encode24u
Unexecuted instantiation: errordoc.c:h2o_http2_encode24u
Unexecuted instantiation: expires.c:h2o_http2_encode24u
Unexecuted instantiation: fastcgi.c:h2o_http2_encode24u
Unexecuted instantiation: file.c:h2o_http2_encode24u
Unexecuted instantiation: mimemap.c:h2o_http2_encode24u
Unexecuted instantiation: connect.c:h2o_http2_encode24u
Unexecuted instantiation: redirect.c:h2o_http2_encode24u
Unexecuted instantiation: reproxy.c:h2o_http2_encode24u
Unexecuted instantiation: throttle_resp.c:h2o_http2_encode24u
Unexecuted instantiation: self_trace.c:h2o_http2_encode24u
Unexecuted instantiation: server_timing.c:h2o_http2_encode24u
Unexecuted instantiation: status.c:h2o_http2_encode24u
Unexecuted instantiation: headers_util.c:h2o_http2_encode24u
Unexecuted instantiation: events.c:h2o_http2_encode24u
Unexecuted instantiation: memory.c:h2o_http2_encode24u
Unexecuted instantiation: requests.c:h2o_http2_encode24u
Unexecuted instantiation: ssl.c:h2o_http2_encode24u
Unexecuted instantiation: http2_debug_state.c:h2o_http2_encode24u
Unexecuted instantiation: durations.c:h2o_http2_encode24u
Unexecuted instantiation: http1.c:h2o_http2_encode24u
Unexecuted instantiation: connection.c:h2o_http2_encode24u
Unexecuted instantiation: frame.c:h2o_http2_encode24u
Unexecuted instantiation: hpack.c:h2o_http2_encode24u
Unexecuted instantiation: scheduler.c:h2o_http2_encode24u
Unexecuted instantiation: stream.c:h2o_http2_encode24u
Unexecuted instantiation: qpack.c:h2o_http2_encode24u
Unexecuted instantiation: server.c:h2o_http2_encode24u
Unexecuted instantiation: brotli.c:h2o_http2_encode24u
267
268
inline uint8_t *h2o_http2_encode32u(uint8_t *dst, uint32_t value)
269
0
{
270
0
    *dst++ = value >> 24;
271
0
    *dst++ = value >> 16;
272
0
    *dst++ = value >> 8;
273
0
    *dst++ = value;
274
0
    return dst;
275
0
}
Unexecuted instantiation: driver_h3.cc:h2o_http2_encode32u(unsigned char*, unsigned int)
Unexecuted instantiation: driver_common.cc:h2o_http2_encode32u(unsigned char*, unsigned int)
Unexecuted instantiation: http2client.c:h2o_http2_encode32u
Unexecuted instantiation: http3client.c:h2o_http2_encode32u
Unexecuted instantiation: absprio.c:h2o_http2_encode32u
Unexecuted instantiation: config.c:h2o_http2_encode32u
Unexecuted instantiation: configurator.c:h2o_http2_encode32u
Unexecuted instantiation: context.c:h2o_http2_encode32u
Unexecuted instantiation: headers.c:h2o_http2_encode32u
Unexecuted instantiation: logconf.c:h2o_http2_encode32u
Unexecuted instantiation: proxy.c:h2o_http2_encode32u
Unexecuted instantiation: request.c:h2o_http2_encode32u
Unexecuted instantiation: util.c:h2o_http2_encode32u
Unexecuted instantiation: access_log.c:h2o_http2_encode32u
Unexecuted instantiation: compress.c:h2o_http2_encode32u
Unexecuted instantiation: gzip.c:h2o_http2_encode32u
Unexecuted instantiation: errordoc.c:h2o_http2_encode32u
Unexecuted instantiation: expires.c:h2o_http2_encode32u
Unexecuted instantiation: fastcgi.c:h2o_http2_encode32u
Unexecuted instantiation: file.c:h2o_http2_encode32u
Unexecuted instantiation: mimemap.c:h2o_http2_encode32u
Unexecuted instantiation: connect.c:h2o_http2_encode32u
Unexecuted instantiation: redirect.c:h2o_http2_encode32u
Unexecuted instantiation: reproxy.c:h2o_http2_encode32u
Unexecuted instantiation: throttle_resp.c:h2o_http2_encode32u
Unexecuted instantiation: self_trace.c:h2o_http2_encode32u
Unexecuted instantiation: server_timing.c:h2o_http2_encode32u
Unexecuted instantiation: status.c:h2o_http2_encode32u
Unexecuted instantiation: headers_util.c:h2o_http2_encode32u
Unexecuted instantiation: events.c:h2o_http2_encode32u
Unexecuted instantiation: memory.c:h2o_http2_encode32u
Unexecuted instantiation: requests.c:h2o_http2_encode32u
Unexecuted instantiation: ssl.c:h2o_http2_encode32u
Unexecuted instantiation: http2_debug_state.c:h2o_http2_encode32u
Unexecuted instantiation: durations.c:h2o_http2_encode32u
Unexecuted instantiation: http1.c:h2o_http2_encode32u
Unexecuted instantiation: connection.c:h2o_http2_encode32u
Unexecuted instantiation: frame.c:h2o_http2_encode32u
Unexecuted instantiation: hpack.c:h2o_http2_encode32u
Unexecuted instantiation: scheduler.c:h2o_http2_encode32u
Unexecuted instantiation: stream.c:h2o_http2_encode32u
Unexecuted instantiation: qpack.c:h2o_http2_encode32u
Unexecuted instantiation: server.c:h2o_http2_encode32u
Unexecuted instantiation: brotli.c:h2o_http2_encode32u
276
277
inline h2o_hpack_header_table_entry_t *h2o_hpack_header_table_get(h2o_hpack_header_table_t *table, size_t index)
278
0
{
279
0
    size_t entry_index = (index + table->entry_start_index) % table->entry_capacity;
280
0
    struct st_h2o_hpack_header_table_entry_t *entry = table->entries + entry_index;
281
0
    assert(entry->name != NULL);
282
0
    return entry;
283
0
}
Unexecuted instantiation: driver_h3.cc:h2o_hpack_header_table_get(st_h2o_hpack_header_table_t*, unsigned long)
Unexecuted instantiation: driver_common.cc:h2o_hpack_header_table_get(st_h2o_hpack_header_table_t*, unsigned long)
Unexecuted instantiation: http2client.c:h2o_hpack_header_table_get
Unexecuted instantiation: http3client.c:h2o_hpack_header_table_get
Unexecuted instantiation: absprio.c:h2o_hpack_header_table_get
Unexecuted instantiation: config.c:h2o_hpack_header_table_get
Unexecuted instantiation: configurator.c:h2o_hpack_header_table_get
Unexecuted instantiation: context.c:h2o_hpack_header_table_get
Unexecuted instantiation: headers.c:h2o_hpack_header_table_get
Unexecuted instantiation: logconf.c:h2o_hpack_header_table_get
Unexecuted instantiation: proxy.c:h2o_hpack_header_table_get
Unexecuted instantiation: request.c:h2o_hpack_header_table_get
Unexecuted instantiation: util.c:h2o_hpack_header_table_get
Unexecuted instantiation: access_log.c:h2o_hpack_header_table_get
Unexecuted instantiation: compress.c:h2o_hpack_header_table_get
Unexecuted instantiation: gzip.c:h2o_hpack_header_table_get
Unexecuted instantiation: errordoc.c:h2o_hpack_header_table_get
Unexecuted instantiation: expires.c:h2o_hpack_header_table_get
Unexecuted instantiation: fastcgi.c:h2o_hpack_header_table_get
Unexecuted instantiation: file.c:h2o_hpack_header_table_get
Unexecuted instantiation: mimemap.c:h2o_hpack_header_table_get
Unexecuted instantiation: connect.c:h2o_hpack_header_table_get
Unexecuted instantiation: redirect.c:h2o_hpack_header_table_get
Unexecuted instantiation: reproxy.c:h2o_hpack_header_table_get
Unexecuted instantiation: throttle_resp.c:h2o_hpack_header_table_get
Unexecuted instantiation: self_trace.c:h2o_hpack_header_table_get
Unexecuted instantiation: server_timing.c:h2o_hpack_header_table_get
Unexecuted instantiation: status.c:h2o_hpack_header_table_get
Unexecuted instantiation: headers_util.c:h2o_hpack_header_table_get
Unexecuted instantiation: events.c:h2o_hpack_header_table_get
Unexecuted instantiation: memory.c:h2o_hpack_header_table_get
Unexecuted instantiation: requests.c:h2o_hpack_header_table_get
Unexecuted instantiation: ssl.c:h2o_hpack_header_table_get
Unexecuted instantiation: http2_debug_state.c:h2o_hpack_header_table_get
Unexecuted instantiation: durations.c:h2o_hpack_header_table_get
Unexecuted instantiation: http1.c:h2o_hpack_header_table_get
Unexecuted instantiation: connection.c:h2o_hpack_header_table_get
Unexecuted instantiation: frame.c:h2o_hpack_header_table_get
Unexecuted instantiation: hpack.c:h2o_hpack_header_table_get
Unexecuted instantiation: scheduler.c:h2o_hpack_header_table_get
Unexecuted instantiation: stream.c:h2o_hpack_header_table_get
Unexecuted instantiation: qpack.c:h2o_hpack_header_table_get
Unexecuted instantiation: server.c:h2o_hpack_header_table_get
Unexecuted instantiation: brotli.c:h2o_hpack_header_table_get
284
285
#endif