1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
4e18a033bSKonstantin Ananyev * Copyright (C) Valentin V. Bartenev
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#include <ngx_config.h>
9e18a033bSKonstantin Ananyev#include <ngx_core.h>
10e18a033bSKonstantin Ananyev#include <ngx_http.h>
11e18a033bSKonstantin Ananyev#include <ngx_http_v2_module.h>
12e18a033bSKonstantin Ananyev
13e18a033bSKonstantin Ananyev
14e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_v2_add_variables(ngx_conf_t *cf);
15e18a033bSKonstantin Ananyev
16e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_v2_variable(ngx_http_request_t *r,
17e18a033bSKonstantin Ananyev    ngx_http_variable_value_t *v, uintptr_t data);
18e18a033bSKonstantin Ananyev
19e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_v2_module_init(ngx_cycle_t *cycle);
20e18a033bSKonstantin Ananyev
21e18a033bSKonstantin Ananyevstatic void *ngx_http_v2_create_main_conf(ngx_conf_t *cf);
22e18a033bSKonstantin Ananyevstatic char *ngx_http_v2_init_main_conf(ngx_conf_t *cf, void *conf);
23e18a033bSKonstantin Ananyevstatic void *ngx_http_v2_create_srv_conf(ngx_conf_t *cf);
24e18a033bSKonstantin Ananyevstatic char *ngx_http_v2_merge_srv_conf(ngx_conf_t *cf, void *parent,
25e18a033bSKonstantin Ananyev    void *child);
26e18a033bSKonstantin Ananyevstatic void *ngx_http_v2_create_loc_conf(ngx_conf_t *cf);
27e18a033bSKonstantin Ananyevstatic char *ngx_http_v2_merge_loc_conf(ngx_conf_t *cf, void *parent,
28e18a033bSKonstantin Ananyev    void *child);
29e18a033bSKonstantin Ananyev
30e18a033bSKonstantin Ananyevstatic char *ngx_http_v2_recv_buffer_size(ngx_conf_t *cf, void *post,
31e18a033bSKonstantin Ananyev    void *data);
32e18a033bSKonstantin Ananyevstatic char *ngx_http_v2_pool_size(ngx_conf_t *cf, void *post, void *data);
33e18a033bSKonstantin Ananyevstatic char *ngx_http_v2_preread_size(ngx_conf_t *cf, void *post, void *data);
34e18a033bSKonstantin Ananyevstatic char *ngx_http_v2_streams_index_mask(ngx_conf_t *cf, void *post,
35e18a033bSKonstantin Ananyev    void *data);
36e18a033bSKonstantin Ananyevstatic char *ngx_http_v2_chunk_size(ngx_conf_t *cf, void *post, void *data);
37e18a033bSKonstantin Ananyevstatic char *ngx_http_v2_spdy_deprecated(ngx_conf_t *cf, ngx_command_t *cmd,
38e18a033bSKonstantin Ananyev    void *conf);
39e18a033bSKonstantin Ananyev
40e18a033bSKonstantin Ananyev
41e18a033bSKonstantin Ananyevstatic ngx_conf_post_t  ngx_http_v2_recv_buffer_size_post =
42e18a033bSKonstantin Ananyev    { ngx_http_v2_recv_buffer_size };
43e18a033bSKonstantin Ananyevstatic ngx_conf_post_t  ngx_http_v2_pool_size_post =
44e18a033bSKonstantin Ananyev    { ngx_http_v2_pool_size };
45e18a033bSKonstantin Ananyevstatic ngx_conf_post_t  ngx_http_v2_preread_size_post =
46e18a033bSKonstantin Ananyev    { ngx_http_v2_preread_size };
47e18a033bSKonstantin Ananyevstatic ngx_conf_post_t  ngx_http_v2_streams_index_mask_post =
48e18a033bSKonstantin Ananyev    { ngx_http_v2_streams_index_mask };
49e18a033bSKonstantin Ananyevstatic ngx_conf_post_t  ngx_http_v2_chunk_size_post =
50e18a033bSKonstantin Ananyev    { ngx_http_v2_chunk_size };
51e18a033bSKonstantin Ananyev
52e18a033bSKonstantin Ananyev
53e18a033bSKonstantin Ananyevstatic ngx_command_t  ngx_http_v2_commands[] = {
54e18a033bSKonstantin Ananyev
55e18a033bSKonstantin Ananyev    { ngx_string("http2_recv_buffer_size"),
56e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
57e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
58e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF_OFFSET,
59e18a033bSKonstantin Ananyev      offsetof(ngx_http_v2_main_conf_t, recv_buffer_size),
60e18a033bSKonstantin Ananyev      &ngx_http_v2_recv_buffer_size_post },
61e18a033bSKonstantin Ananyev
62e18a033bSKonstantin Ananyev    { ngx_string("http2_pool_size"),
63e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
64e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
65e18a033bSKonstantin Ananyev      NGX_HTTP_SRV_CONF_OFFSET,
66e18a033bSKonstantin Ananyev      offsetof(ngx_http_v2_srv_conf_t, pool_size),
67e18a033bSKonstantin Ananyev      &ngx_http_v2_pool_size_post },
68e18a033bSKonstantin Ananyev
69e18a033bSKonstantin Ananyev    { ngx_string("http2_max_concurrent_streams"),
70e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
71e18a033bSKonstantin Ananyev      ngx_conf_set_num_slot,
72e18a033bSKonstantin Ananyev      NGX_HTTP_SRV_CONF_OFFSET,
73e18a033bSKonstantin Ananyev      offsetof(ngx_http_v2_srv_conf_t, concurrent_streams),
74e18a033bSKonstantin Ananyev      NULL },
75e18a033bSKonstantin Ananyev
76e18a033bSKonstantin Ananyev    { ngx_string("http2_max_requests"),
77e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
78e18a033bSKonstantin Ananyev      ngx_conf_set_num_slot,
79e18a033bSKonstantin Ananyev      NGX_HTTP_SRV_CONF_OFFSET,
80e18a033bSKonstantin Ananyev      offsetof(ngx_http_v2_srv_conf_t, max_requests),
81e18a033bSKonstantin Ananyev      NULL },
82e18a033bSKonstantin Ananyev
83e18a033bSKonstantin Ananyev    { ngx_string("http2_max_field_size"),
84e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
85e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
86e18a033bSKonstantin Ananyev      NGX_HTTP_SRV_CONF_OFFSET,
87e18a033bSKonstantin Ananyev      offsetof(ngx_http_v2_srv_conf_t, max_field_size),
88e18a033bSKonstantin Ananyev      NULL },
89e18a033bSKonstantin Ananyev
90e18a033bSKonstantin Ananyev    { ngx_string("http2_max_header_size"),
91e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
92e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
93e18a033bSKonstantin Ananyev      NGX_HTTP_SRV_CONF_OFFSET,
94e18a033bSKonstantin Ananyev      offsetof(ngx_http_v2_srv_conf_t, max_header_size),
95e18a033bSKonstantin Ananyev      NULL },
96e18a033bSKonstantin Ananyev
97e18a033bSKonstantin Ananyev    { ngx_string("http2_body_preread_size"),
98e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
99e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
100e18a033bSKonstantin Ananyev      NGX_HTTP_SRV_CONF_OFFSET,
101e18a033bSKonstantin Ananyev      offsetof(ngx_http_v2_srv_conf_t, preread_size),
102e18a033bSKonstantin Ananyev      &ngx_http_v2_preread_size_post },
103e18a033bSKonstantin Ananyev
104e18a033bSKonstantin Ananyev    { ngx_string("http2_streams_index_size"),
105e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
106e18a033bSKonstantin Ananyev      ngx_conf_set_num_slot,
107e18a033bSKonstantin Ananyev      NGX_HTTP_SRV_CONF_OFFSET,
108e18a033bSKonstantin Ananyev      offsetof(ngx_http_v2_srv_conf_t, streams_index_mask),
109e18a033bSKonstantin Ananyev      &ngx_http_v2_streams_index_mask_post },
110e18a033bSKonstantin Ananyev
111e18a033bSKonstantin Ananyev    { ngx_string("http2_recv_timeout"),
112e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
113e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
114e18a033bSKonstantin Ananyev      NGX_HTTP_SRV_CONF_OFFSET,
115e18a033bSKonstantin Ananyev      offsetof(ngx_http_v2_srv_conf_t, recv_timeout),
116e18a033bSKonstantin Ananyev      NULL },
117e18a033bSKonstantin Ananyev
118e18a033bSKonstantin Ananyev    { ngx_string("http2_idle_timeout"),
119e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
120e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
121e18a033bSKonstantin Ananyev      NGX_HTTP_SRV_CONF_OFFSET,
122e18a033bSKonstantin Ananyev      offsetof(ngx_http_v2_srv_conf_t, idle_timeout),
123e18a033bSKonstantin Ananyev      NULL },
124e18a033bSKonstantin Ananyev
125e18a033bSKonstantin Ananyev    { ngx_string("http2_chunk_size"),
126e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
127e18a033bSKonstantin Ananyev      ngx_conf_set_size_slot,
128e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
129e18a033bSKonstantin Ananyev      offsetof(ngx_http_v2_loc_conf_t, chunk_size),
130e18a033bSKonstantin Ananyev      &ngx_http_v2_chunk_size_post },
131e18a033bSKonstantin Ananyev
132e18a033bSKonstantin Ananyev    { ngx_string("spdy_recv_buffer_size"),
133e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
134e18a033bSKonstantin Ananyev      ngx_http_v2_spdy_deprecated,
135e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF_OFFSET,
136e18a033bSKonstantin Ananyev      0,
137e18a033bSKonstantin Ananyev      NULL },
138e18a033bSKonstantin Ananyev
139e18a033bSKonstantin Ananyev    { ngx_string("spdy_pool_size"),
140e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
141e18a033bSKonstantin Ananyev      ngx_http_v2_spdy_deprecated,
142e18a033bSKonstantin Ananyev      NGX_HTTP_SRV_CONF_OFFSET,
143e18a033bSKonstantin Ananyev      0,
144e18a033bSKonstantin Ananyev      NULL },
145e18a033bSKonstantin Ananyev
146e18a033bSKonstantin Ananyev    { ngx_string("spdy_max_concurrent_streams"),
147e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
148e18a033bSKonstantin Ananyev      ngx_http_v2_spdy_deprecated,
149e18a033bSKonstantin Ananyev      NGX_HTTP_SRV_CONF_OFFSET,
150e18a033bSKonstantin Ananyev      0,
151e18a033bSKonstantin Ananyev      NULL },
152e18a033bSKonstantin Ananyev
153e18a033bSKonstantin Ananyev    { ngx_string("spdy_streams_index_size"),
154e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
155e18a033bSKonstantin Ananyev      ngx_http_v2_spdy_deprecated,
156e18a033bSKonstantin Ananyev      NGX_HTTP_SRV_CONF_OFFSET,
157e18a033bSKonstantin Ananyev      0,
158e18a033bSKonstantin Ananyev      NULL },
159e18a033bSKonstantin Ananyev
160e18a033bSKonstantin Ananyev    { ngx_string("spdy_recv_timeout"),
161e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
162e18a033bSKonstantin Ananyev      ngx_http_v2_spdy_deprecated,
163e18a033bSKonstantin Ananyev      NGX_HTTP_SRV_CONF_OFFSET,
164e18a033bSKonstantin Ananyev      0,
165e18a033bSKonstantin Ananyev      NULL },
166e18a033bSKonstantin Ananyev
167e18a033bSKonstantin Ananyev    { ngx_string("spdy_keepalive_timeout"),
168e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
169e18a033bSKonstantin Ananyev      ngx_http_v2_spdy_deprecated,
170e18a033bSKonstantin Ananyev      NGX_HTTP_SRV_CONF_OFFSET,
171e18a033bSKonstantin Ananyev      0,
172e18a033bSKonstantin Ananyev      NULL },
173e18a033bSKonstantin Ananyev
174e18a033bSKonstantin Ananyev    { ngx_string("spdy_headers_comp"),
175e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
176e18a033bSKonstantin Ananyev      ngx_http_v2_spdy_deprecated,
177e18a033bSKonstantin Ananyev      NGX_HTTP_SRV_CONF_OFFSET,
178e18a033bSKonstantin Ananyev      0,
179e18a033bSKonstantin Ananyev      NULL },
180e18a033bSKonstantin Ananyev
181e18a033bSKonstantin Ananyev    { ngx_string("spdy_chunk_size"),
182e18a033bSKonstantin Ananyev      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
183e18a033bSKonstantin Ananyev      ngx_http_v2_spdy_deprecated,
184e18a033bSKonstantin Ananyev      NGX_HTTP_LOC_CONF_OFFSET,
185e18a033bSKonstantin Ananyev      0,
186e18a033bSKonstantin Ananyev      NULL },
187e18a033bSKonstantin Ananyev
188e18a033bSKonstantin Ananyev      ngx_null_command
189e18a033bSKonstantin Ananyev};
190e18a033bSKonstantin Ananyev
191e18a033bSKonstantin Ananyev
192e18a033bSKonstantin Ananyevstatic ngx_http_module_t  ngx_http_v2_module_ctx = {
193e18a033bSKonstantin Ananyev    ngx_http_v2_add_variables,             /* preconfiguration */
194e18a033bSKonstantin Ananyev    NULL,                                  /* postconfiguration */
195e18a033bSKonstantin Ananyev
196e18a033bSKonstantin Ananyev    ngx_http_v2_create_main_conf,          /* create main configuration */
197e18a033bSKonstantin Ananyev    ngx_http_v2_init_main_conf,            /* init main configuration */
198e18a033bSKonstantin Ananyev
199e18a033bSKonstantin Ananyev    ngx_http_v2_create_srv_conf,           /* create server configuration */
200e18a033bSKonstantin Ananyev    ngx_http_v2_merge_srv_conf,            /* merge server configuration */
201e18a033bSKonstantin Ananyev
202e18a033bSKonstantin Ananyev    ngx_http_v2_create_loc_conf,           /* create location configuration */
203e18a033bSKonstantin Ananyev    ngx_http_v2_merge_loc_conf             /* merge location configuration */
204e18a033bSKonstantin Ananyev};
205e18a033bSKonstantin Ananyev
206e18a033bSKonstantin Ananyev
207e18a033bSKonstantin Ananyevngx_module_t  ngx_http_v2_module = {
208e18a033bSKonstantin Ananyev    NGX_MODULE_V1,
209e18a033bSKonstantin Ananyev    &ngx_http_v2_module_ctx,               /* module context */
210e18a033bSKonstantin Ananyev    ngx_http_v2_commands,                  /* module directives */
211e18a033bSKonstantin Ananyev    NGX_HTTP_MODULE,                       /* module type */
212e18a033bSKonstantin Ananyev    NULL,                                  /* init master */
213e18a033bSKonstantin Ananyev    ngx_http_v2_module_init,               /* init module */
214e18a033bSKonstantin Ananyev    NULL,                                  /* init process */
215e18a033bSKonstantin Ananyev    NULL,                                  /* init thread */
216e18a033bSKonstantin Ananyev    NULL,                                  /* exit thread */
217e18a033bSKonstantin Ananyev    NULL,                                  /* exit process */
218e18a033bSKonstantin Ananyev    NULL,                                  /* exit master */
219e18a033bSKonstantin Ananyev    NGX_MODULE_V1_PADDING
220e18a033bSKonstantin Ananyev};
221e18a033bSKonstantin Ananyev
222e18a033bSKonstantin Ananyev
223e18a033bSKonstantin Ananyevstatic ngx_http_variable_t  ngx_http_v2_vars[] = {
224e18a033bSKonstantin Ananyev
225e18a033bSKonstantin Ananyev    { ngx_string("http2"), NULL,
226e18a033bSKonstantin Ananyev      ngx_http_v2_variable, 0, 0, 0 },
227e18a033bSKonstantin Ananyev
228e18a033bSKonstantin Ananyev    { ngx_null_string, NULL, NULL, 0, 0, 0 }
229e18a033bSKonstantin Ananyev};
230e18a033bSKonstantin Ananyev
231e18a033bSKonstantin Ananyev
232e18a033bSKonstantin Ananyevstatic ngx_int_t
233e18a033bSKonstantin Ananyevngx_http_v2_add_variables(ngx_conf_t *cf)
234e18a033bSKonstantin Ananyev{
235e18a033bSKonstantin Ananyev    ngx_http_variable_t  *var, *v;
236e18a033bSKonstantin Ananyev
237e18a033bSKonstantin Ananyev    for (v = ngx_http_v2_vars; v->name.len; v++) {
238e18a033bSKonstantin Ananyev        var = ngx_http_add_variable(cf, &v->name, v->flags);
239e18a033bSKonstantin Ananyev        if (var == NULL) {
240e18a033bSKonstantin Ananyev            return NGX_ERROR;
241e18a033bSKonstantin Ananyev        }
242e18a033bSKonstantin Ananyev
243e18a033bSKonstantin Ananyev        var->get_handler = v->get_handler;
244e18a033bSKonstantin Ananyev        var->data = v->data;
245e18a033bSKonstantin Ananyev    }
246e18a033bSKonstantin Ananyev
247e18a033bSKonstantin Ananyev    return NGX_OK;
248e18a033bSKonstantin Ananyev}
249e18a033bSKonstantin Ananyev
250e18a033bSKonstantin Ananyev
251e18a033bSKonstantin Ananyevstatic ngx_int_t
252e18a033bSKonstantin Ananyevngx_http_v2_variable(ngx_http_request_t *r,
253e18a033bSKonstantin Ananyev    ngx_http_variable_value_t *v, uintptr_t data)
254e18a033bSKonstantin Ananyev{
255e18a033bSKonstantin Ananyev
256e18a033bSKonstantin Ananyev    if (r->stream) {
257e18a033bSKonstantin Ananyev#if (NGX_HTTP_SSL)
258e18a033bSKonstantin Ananyev
259e18a033bSKonstantin Ananyev        if (r->connection->ssl) {
260e18a033bSKonstantin Ananyev            v->len = sizeof("h2") - 1;
261e18a033bSKonstantin Ananyev            v->valid = 1;
262e18a033bSKonstantin Ananyev            v->no_cacheable = 0;
263e18a033bSKonstantin Ananyev            v->not_found = 0;
264e18a033bSKonstantin Ananyev            v->data = (u_char *) "h2";
265e18a033bSKonstantin Ananyev
266e18a033bSKonstantin Ananyev            return NGX_OK;
267e18a033bSKonstantin Ananyev        }
268e18a033bSKonstantin Ananyev
269e18a033bSKonstantin Ananyev#endif
270e18a033bSKonstantin Ananyev        v->len = sizeof("h2c") - 1;
271e18a033bSKonstantin Ananyev        v->valid = 1;
272e18a033bSKonstantin Ananyev        v->no_cacheable = 0;
273e18a033bSKonstantin Ananyev        v->not_found = 0;
274e18a033bSKonstantin Ananyev        v->data = (u_char *) "h2c";
275e18a033bSKonstantin Ananyev
276e18a033bSKonstantin Ananyev        return NGX_OK;
277e18a033bSKonstantin Ananyev    }
278e18a033bSKonstantin Ananyev
279e18a033bSKonstantin Ananyev    *v = ngx_http_variable_null_value;
280e18a033bSKonstantin Ananyev
281e18a033bSKonstantin Ananyev    return NGX_OK;
282e18a033bSKonstantin Ananyev}
283e18a033bSKonstantin Ananyev
284e18a033bSKonstantin Ananyev
285e18a033bSKonstantin Ananyevstatic ngx_int_t
286e18a033bSKonstantin Ananyevngx_http_v2_module_init(ngx_cycle_t *cycle)
287e18a033bSKonstantin Ananyev{
288e18a033bSKonstantin Ananyev    return NGX_OK;
289e18a033bSKonstantin Ananyev}
290e18a033bSKonstantin Ananyev
291e18a033bSKonstantin Ananyev
292e18a033bSKonstantin Ananyevstatic void *
293e18a033bSKonstantin Ananyevngx_http_v2_create_main_conf(ngx_conf_t *cf)
294e18a033bSKonstantin Ananyev{
295e18a033bSKonstantin Ananyev    ngx_http_v2_main_conf_t  *h2mcf;
296e18a033bSKonstantin Ananyev
297e18a033bSKonstantin Ananyev    h2mcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v2_main_conf_t));
298e18a033bSKonstantin Ananyev    if (h2mcf == NULL) {
299e18a033bSKonstantin Ananyev        return NULL;
300e18a033bSKonstantin Ananyev    }
301e18a033bSKonstantin Ananyev
302e18a033bSKonstantin Ananyev    h2mcf->recv_buffer_size = NGX_CONF_UNSET_SIZE;
303e18a033bSKonstantin Ananyev
304e18a033bSKonstantin Ananyev    return h2mcf;
305e18a033bSKonstantin Ananyev}
306e18a033bSKonstantin Ananyev
307e18a033bSKonstantin Ananyev
308e18a033bSKonstantin Ananyevstatic char *
309e18a033bSKonstantin Ananyevngx_http_v2_init_main_conf(ngx_conf_t *cf, void *conf)
310e18a033bSKonstantin Ananyev{
311e18a033bSKonstantin Ananyev    ngx_http_v2_main_conf_t *h2mcf = conf;
312e18a033bSKonstantin Ananyev
313e18a033bSKonstantin Ananyev    ngx_conf_init_size_value(h2mcf->recv_buffer_size, 256 * 1024);
314e18a033bSKonstantin Ananyev
315e18a033bSKonstantin Ananyev    return NGX_CONF_OK;
316e18a033bSKonstantin Ananyev}
317e18a033bSKonstantin Ananyev
318e18a033bSKonstantin Ananyev
319e18a033bSKonstantin Ananyevstatic void *
320e18a033bSKonstantin Ananyevngx_http_v2_create_srv_conf(ngx_conf_t *cf)
321e18a033bSKonstantin Ananyev{
322e18a033bSKonstantin Ananyev    ngx_http_v2_srv_conf_t  *h2scf;
323e18a033bSKonstantin Ananyev
324e18a033bSKonstantin Ananyev    h2scf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v2_srv_conf_t));
325e18a033bSKonstantin Ananyev    if (h2scf == NULL) {
326e18a033bSKonstantin Ananyev        return NULL;
327e18a033bSKonstantin Ananyev    }
328e18a033bSKonstantin Ananyev
329e18a033bSKonstantin Ananyev    h2scf->pool_size = NGX_CONF_UNSET_SIZE;
330e18a033bSKonstantin Ananyev
331e18a033bSKonstantin Ananyev    h2scf->concurrent_streams = NGX_CONF_UNSET_UINT;
332e18a033bSKonstantin Ananyev    h2scf->max_requests = NGX_CONF_UNSET_UINT;
333e18a033bSKonstantin Ananyev
334e18a033bSKonstantin Ananyev    h2scf->max_field_size = NGX_CONF_UNSET_SIZE;
335e18a033bSKonstantin Ananyev    h2scf->max_header_size = NGX_CONF_UNSET_SIZE;
336e18a033bSKonstantin Ananyev
337e18a033bSKonstantin Ananyev    h2scf->preread_size = NGX_CONF_UNSET_SIZE;
338e18a033bSKonstantin Ananyev
339e18a033bSKonstantin Ananyev    h2scf->streams_index_mask = NGX_CONF_UNSET_UINT;
340e18a033bSKonstantin Ananyev
341e18a033bSKonstantin Ananyev    h2scf->recv_timeout = NGX_CONF_UNSET_MSEC;
342e18a033bSKonstantin Ananyev    h2scf->idle_timeout = NGX_CONF_UNSET_MSEC;
343e18a033bSKonstantin Ananyev
344e18a033bSKonstantin Ananyev    return h2scf;
345e18a033bSKonstantin Ananyev}
346e18a033bSKonstantin Ananyev
347e18a033bSKonstantin Ananyev
348e18a033bSKonstantin Ananyevstatic char *
349e18a033bSKonstantin Ananyevngx_http_v2_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
350e18a033bSKonstantin Ananyev{
351e18a033bSKonstantin Ananyev    ngx_http_v2_srv_conf_t *prev = parent;
352e18a033bSKonstantin Ananyev    ngx_http_v2_srv_conf_t *conf = child;
353e18a033bSKonstantin Ananyev
354e18a033bSKonstantin Ananyev    ngx_conf_merge_size_value(conf->pool_size, prev->pool_size, 4096);
355e18a033bSKonstantin Ananyev
356e18a033bSKonstantin Ananyev    ngx_conf_merge_uint_value(conf->concurrent_streams,
357e18a033bSKonstantin Ananyev                              prev->concurrent_streams, 128);
358e18a033bSKonstantin Ananyev    ngx_conf_merge_uint_value(conf->max_requests, prev->max_requests, 1000);
359e18a033bSKonstantin Ananyev
360e18a033bSKonstantin Ananyev    ngx_conf_merge_size_value(conf->max_field_size, prev->max_field_size,
361e18a033bSKonstantin Ananyev                              4096);
362e18a033bSKonstantin Ananyev    ngx_conf_merge_size_value(conf->max_header_size, prev->max_header_size,
363e18a033bSKonstantin Ananyev                              16384);
364e18a033bSKonstantin Ananyev
365e18a033bSKonstantin Ananyev    ngx_conf_merge_size_value(conf->preread_size, prev->preread_size, 65536);
366e18a033bSKonstantin Ananyev
367e18a033bSKonstantin Ananyev    ngx_conf_merge_uint_value(conf->streams_index_mask,
368e18a033bSKonstantin Ananyev                              prev->streams_index_mask, 32 - 1);
369e18a033bSKonstantin Ananyev
370e18a033bSKonstantin Ananyev    ngx_conf_merge_msec_value(conf->recv_timeout,
371e18a033bSKonstantin Ananyev                              prev->recv_timeout, 30000);
372e18a033bSKonstantin Ananyev    ngx_conf_merge_msec_value(conf->idle_timeout,
373e18a033bSKonstantin Ananyev                              prev->idle_timeout, 180000);
374e18a033bSKonstantin Ananyev
375e18a033bSKonstantin Ananyev    return NGX_CONF_OK;
376e18a033bSKonstantin Ananyev}
377e18a033bSKonstantin Ananyev
378e18a033bSKonstantin Ananyev
379e18a033bSKonstantin Ananyevstatic void *
380e18a033bSKonstantin Ananyevngx_http_v2_create_loc_conf(ngx_conf_t *cf)
381e18a033bSKonstantin Ananyev{
382e18a033bSKonstantin Ananyev    ngx_http_v2_loc_conf_t  *h2lcf;
383e18a033bSKonstantin Ananyev
384e18a033bSKonstantin Ananyev    h2lcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v2_loc_conf_t));
385e18a033bSKonstantin Ananyev    if (h2lcf == NULL) {
386e18a033bSKonstantin Ananyev        return NULL;
387e18a033bSKonstantin Ananyev    }
388e18a033bSKonstantin Ananyev
389e18a033bSKonstantin Ananyev    h2lcf->chunk_size = NGX_CONF_UNSET_SIZE;
390e18a033bSKonstantin Ananyev
391e18a033bSKonstantin Ananyev    return h2lcf;
392e18a033bSKonstantin Ananyev}
393e18a033bSKonstantin Ananyev
394e18a033bSKonstantin Ananyev
395e18a033bSKonstantin Ananyevstatic char *
396e18a033bSKonstantin Ananyevngx_http_v2_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
397e18a033bSKonstantin Ananyev{
398e18a033bSKonstantin Ananyev    ngx_http_v2_loc_conf_t *prev = parent;
399e18a033bSKonstantin Ananyev    ngx_http_v2_loc_conf_t *conf = child;
400e18a033bSKonstantin Ananyev
401e18a033bSKonstantin Ananyev    ngx_conf_merge_size_value(conf->chunk_size, prev->chunk_size, 8 * 1024);
402e18a033bSKonstantin Ananyev
403e18a033bSKonstantin Ananyev    return NGX_CONF_OK;
404e18a033bSKonstantin Ananyev}
405e18a033bSKonstantin Ananyev
406e18a033bSKonstantin Ananyev
407e18a033bSKonstantin Ananyevstatic char *
408e18a033bSKonstantin Ananyevngx_http_v2_recv_buffer_size(ngx_conf_t *cf, void *post, void *data)
409e18a033bSKonstantin Ananyev{
410e18a033bSKonstantin Ananyev    size_t *sp = data;
411e18a033bSKonstantin Ananyev
412e18a033bSKonstantin Ananyev    if (*sp <= 2 * NGX_HTTP_V2_STATE_BUFFER_SIZE) {
413e18a033bSKonstantin Ananyev        return "value is too small";
414e18a033bSKonstantin Ananyev    }
415e18a033bSKonstantin Ananyev
416e18a033bSKonstantin Ananyev    return NGX_CONF_OK;
417