1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
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
12e18a033bSKonstantin Ananyev
13e18a033bSKonstantin Ananyevstatic char *ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
14e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_init_phases(ngx_conf_t *cf,
15e18a033bSKonstantin Ananyev    ngx_http_core_main_conf_t *cmcf);
16e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_init_headers_in_hash(ngx_conf_t *cf,
17e18a033bSKonstantin Ananyev    ngx_http_core_main_conf_t *cmcf);
18e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_init_phase_handlers(ngx_conf_t *cf,
19e18a033bSKonstantin Ananyev    ngx_http_core_main_conf_t *cmcf);
20e18a033bSKonstantin Ananyev
21e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_add_addresses(ngx_conf_t *cf,
22e18a033bSKonstantin Ananyev    ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port,
23e18a033bSKonstantin Ananyev    ngx_http_listen_opt_t *lsopt);
24e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_add_address(ngx_conf_t *cf,
25e18a033bSKonstantin Ananyev    ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port,
26e18a033bSKonstantin Ananyev    ngx_http_listen_opt_t *lsopt);
27e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_add_server(ngx_conf_t *cf,
28e18a033bSKonstantin Ananyev    ngx_http_core_srv_conf_t *cscf, ngx_http_conf_addr_t *addr);
29e18a033bSKonstantin Ananyev
30e18a033bSKonstantin Ananyevstatic char *ngx_http_merge_servers(ngx_conf_t *cf,
31e18a033bSKonstantin Ananyev    ngx_http_core_main_conf_t *cmcf, ngx_http_module_t *module,
32e18a033bSKonstantin Ananyev    ngx_uint_t ctx_index);
33e18a033bSKonstantin Ananyevstatic char *ngx_http_merge_locations(ngx_conf_t *cf,
34e18a033bSKonstantin Ananyev    ngx_queue_t *locations, void **loc_conf, ngx_http_module_t *module,
35e18a033bSKonstantin Ananyev    ngx_uint_t ctx_index);
36e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_init_locations(ngx_conf_t *cf,
37e18a033bSKonstantin Ananyev    ngx_http_core_srv_conf_t *cscf, ngx_http_core_loc_conf_t *pclcf);
38e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_init_static_location_trees(ngx_conf_t *cf,
39e18a033bSKonstantin Ananyev    ngx_http_core_loc_conf_t *pclcf);
40e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_cmp_locations(const ngx_queue_t *one,
41e18a033bSKonstantin Ananyev    const ngx_queue_t *two);
42e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_join_exact_locations(ngx_conf_t *cf,
43e18a033bSKonstantin Ananyev    ngx_queue_t *locations);
44e18a033bSKonstantin Ananyevstatic void ngx_http_create_locations_list(ngx_queue_t *locations,
45e18a033bSKonstantin Ananyev    ngx_queue_t *q);
46e18a033bSKonstantin Ananyevstatic ngx_http_location_tree_node_t *
47e18a033bSKonstantin Ananyev    ngx_http_create_locations_tree(ngx_conf_t *cf, ngx_queue_t *locations,
48e18a033bSKonstantin Ananyev    size_t prefix);
49e18a033bSKonstantin Ananyev
50e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_optimize_servers(ngx_conf_t *cf,
51e18a033bSKonstantin Ananyev    ngx_http_core_main_conf_t *cmcf, ngx_array_t *ports);
52e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_server_names(ngx_conf_t *cf,
53e18a033bSKonstantin Ananyev    ngx_http_core_main_conf_t *cmcf, ngx_http_conf_addr_t *addr);
54e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_cmp_conf_addrs(const void *one, const void *two);
55e18a033bSKonstantin Ananyevstatic int ngx_libc_cdecl ngx_http_cmp_dns_wildcards(const void *one,
56e18a033bSKonstantin Ananyev    const void *two);
57e18a033bSKonstantin Ananyev
58e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_init_listening(ngx_conf_t *cf,
59e18a033bSKonstantin Ananyev    ngx_http_conf_port_t *port);
60e18a033bSKonstantin Ananyevstatic ngx_listening_t *ngx_http_add_listening(ngx_conf_t *cf,
61e18a033bSKonstantin Ananyev    ngx_http_conf_addr_t *addr);
62e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_add_addrs(ngx_conf_t *cf, ngx_http_port_t *hport,
63e18a033bSKonstantin Ananyev    ngx_http_conf_addr_t *addr);
64e18a033bSKonstantin Ananyev#if (NGX_HAVE_INET6)
65e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_http_add_addrs6(ngx_conf_t *cf, ngx_http_port_t *hport,
66e18a033bSKonstantin Ananyev    ngx_http_conf_addr_t *addr);
67e18a033bSKonstantin Ananyev#endif
68e18a033bSKonstantin Ananyev
69e18a033bSKonstantin Ananyevngx_uint_t   ngx_http_max_module;
70e18a033bSKonstantin Ananyev
71e18a033bSKonstantin Ananyev
72e18a033bSKonstantin Ananyevngx_http_output_header_filter_pt  ngx_http_top_header_filter;
73e18a033bSKonstantin Ananyevngx_http_output_body_filter_pt    ngx_http_top_body_filter;
74e18a033bSKonstantin Ananyevngx_http_request_body_filter_pt   ngx_http_top_request_body_filter;
75e18a033bSKonstantin Ananyev
76e18a033bSKonstantin Ananyev
77e18a033bSKonstantin Ananyevngx_str_t  ngx_http_html_default_types[] = {
78e18a033bSKonstantin Ananyev    ngx_string("text/html"),
79e18a033bSKonstantin Ananyev    ngx_null_string
80e18a033bSKonstantin Ananyev};
81e18a033bSKonstantin Ananyev
82e18a033bSKonstantin Ananyev
83e18a033bSKonstantin Ananyevstatic ngx_command_t  ngx_http_commands[] = {
84e18a033bSKonstantin Ananyev
85e18a033bSKonstantin Ananyev    { ngx_string("http"),
86e18a033bSKonstantin Ananyev      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
87e18a033bSKonstantin Ananyev      ngx_http_block,
88e18a033bSKonstantin Ananyev      0,
89e18a033bSKonstantin Ananyev      0,
90e18a033bSKonstantin Ananyev      NULL },
91e18a033bSKonstantin Ananyev
92e18a033bSKonstantin Ananyev      ngx_null_command
93e18a033bSKonstantin Ananyev};
94e18a033bSKonstantin Ananyev
95e18a033bSKonstantin Ananyev
96e18a033bSKonstantin Ananyevstatic ngx_core_module_t  ngx_http_module_ctx = {
97e18a033bSKonstantin Ananyev    ngx_string("http"),
98e18a033bSKonstantin Ananyev    NULL,
99e18a033bSKonstantin Ananyev    NULL
100e18a033bSKonstantin Ananyev};
101e18a033bSKonstantin Ananyev
102e18a033bSKonstantin Ananyev
103e18a033bSKonstantin Ananyevngx_module_t  ngx_http_module = {
104e18a033bSKonstantin Ananyev    NGX_MODULE_V1,
105e18a033bSKonstantin Ananyev    &ngx_http_module_ctx,                  /* module context */
106e18a033bSKonstantin Ananyev    ngx_http_commands,                     /* module directives */
107e18a033bSKonstantin Ananyev    NGX_CORE_MODULE,                       /* module type */
108e18a033bSKonstantin Ananyev    NULL,                                  /* init master */
109e18a033bSKonstantin Ananyev    NULL,                                  /* init module */
110e18a033bSKonstantin Ananyev    NULL,                                  /* init process */
111e18a033bSKonstantin Ananyev    NULL,                                  /* init thread */
112e18a033bSKonstantin Ananyev    NULL,                                  /* exit thread */
113e18a033bSKonstantin Ananyev    NULL,                                  /* exit process */
114e18a033bSKonstantin Ananyev    NULL,                                  /* exit master */
115e18a033bSKonstantin Ananyev    NGX_MODULE_V1_PADDING
116e18a033bSKonstantin Ananyev};
117e18a033bSKonstantin Ananyev
118e18a033bSKonstantin Ananyev
119e18a033bSKonstantin Ananyevstatic char *
120e18a033bSKonstantin Ananyevngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
121e18a033bSKonstantin Ananyev{
122e18a033bSKonstantin Ananyev    char                        *rv;
123e18a033bSKonstantin Ananyev    ngx_uint_t                   mi, m, s;
124e18a033bSKonstantin Ananyev    ngx_conf_t                   pcf;
125e18a033bSKonstantin Ananyev    ngx_http_module_t           *module;
126e18a033bSKonstantin Ananyev    ngx_http_conf_ctx_t         *ctx;
127e18a033bSKonstantin Ananyev    ngx_http_core_loc_conf_t    *clcf;
128e18a033bSKonstantin Ananyev    ngx_http_core_srv_conf_t   **cscfp;
129e18a033bSKonstantin Ananyev    ngx_http_core_main_conf_t   *cmcf;
130e18a033bSKonstantin Ananyev
131e18a033bSKonstantin Ananyev    if (*(ngx_http_conf_ctx_t **) conf) {
132e18a033bSKonstantin Ananyev        return "is duplicate";
133e18a033bSKonstantin Ananyev    }
134e18a033bSKonstantin Ananyev
135e18a033bSKonstantin Ananyev    /* the main http context */
136e18a033bSKonstantin Ananyev
137e18a033bSKonstantin Ananyev    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));
138e18a033bSKonstantin Ananyev    if (ctx == NULL) {
139e18a033bSKonstantin Ananyev        return NGX_CONF_ERROR;
140e18a033bSKonstantin Ananyev    }
141e18a033bSKonstantin Ananyev
142e18a033bSKonstantin Ananyev    *(ngx_http_conf_ctx_t **) conf = ctx;
143e18a033bSKonstantin Ananyev
144e18a033bSKonstantin Ananyev
145e18a033bSKonstantin Ananyev    /* count the number of the http modules and set up their indices */
146e18a033bSKonstantin Ananyev
147e18a033bSKonstantin Ananyev    ngx_http_max_module = ngx_count_modules(cf->cycle, NGX_HTTP_MODULE);
148e18a033bSKonstantin Ananyev
149e18a033bSKonstantin Ananyev
150e18a033bSKonstantin Ananyev    /* the http main_conf context, it is the same in the all http contexts */
151e18a033bSKonstantin Ananyev
152e18a033bSKonstantin Ananyev    ctx->main_conf = ngx_pcalloc(cf->pool,
153e18a033bSKonstantin Ananyev                                 sizeof(void *) * ngx_http_max_module);
154e18a033bSKonstantin Ananyev    if (ctx->main_conf == NULL) {
155e18a033bSKonstantin Ananyev        return NGX_CONF_ERROR;
156e18a033bSKonstantin Ananyev    }
157e18a033bSKonstantin Ananyev
158e18a033bSKonstantin Ananyev
159e18a033bSKonstantin Ananyev    /*
160e18a033bSKonstantin Ananyev     * the http null srv_conf context, it is used to merge
161e18a033bSKonstantin Ananyev     * the server{}s' srv_conf's
162e18a033bSKonstantin Ananyev     */
163e18a033bSKonstantin Ananyev
164e18a033bSKonstantin Ananyev    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);
165e18a033bSKonstantin Ananyev    if (ctx->srv_conf == NULL) {
166e18a033bSKonstantin Ananyev        return NGX_CONF_ERROR;
167e18a033bSKonstantin Ananyev    }
168e18a033bSKonstantin Ananyev
169e18a033bSKonstantin Ananyev
170e18a033bSKonstantin Ananyev    /*
171e18a033bSKonstantin Ananyev     * the http null loc_conf context, it is used to merge
172e18a033bSKonstantin Ananyev     * the server{}s' loc_conf's
173e18a033bSKonstantin Ananyev     */
174e18a033bSKonstantin Ananyev
175e18a033bSKonstantin Ananyev    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);
176e18a033bSKonstantin Ananyev    if (ctx->loc_conf == NULL) {
177e18a033bSKonstantin Ananyev        return NGX_CONF_ERROR;
178e18a033bSKonstantin Ananyev    }
179e18a033bSKonstantin Ananyev
180e18a033bSKonstantin Ananyev
181e18a033bSKonstantin Ananyev    /*
182e18a033bSKonstantin Ananyev     * create the main_conf's, the null srv_conf's, and the null loc_conf's
183e18a033bSKonstantin Ananyev     * of the all http modules
184e18a033bSKonstantin Ananyev     */
185e18a033bSKonstantin Ananyev
186e18a033bSKonstantin Ananyev    for (m = 0; cf->cycle->modules[m]; m++) {
187e18a033bSKonstantin Ananyev        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {
188e18a033bSKonstantin Ananyev            continue;
189e18a033bSKonstantin Ananyev        }
190e18a033bSKonstantin Ananyev
191e18a033bSKonstantin Ananyev        module = cf->cycle->modules[m]->ctx;
192e18a033bSKonstantin Ananyev        mi = cf->cycle->modules[m]->ctx_index;
193e18a033bSKonstantin Ananyev
194e18a033bSKonstantin Ananyev        if (module->create_main_conf) {
195e18a033bSKonstantin Ananyev            ctx->main_conf[mi] = module->create_main_conf(cf);
196e18a033bSKonstantin Ananyev            if (ctx->main_conf[mi] == NULL) {
197e18a033bSKonstantin Ananyev                return NGX_CONF_ERROR;
198e18a033bSKonstantin Ananyev            }
199e18a033bSKonstantin Ananyev        }
200e18a033bSKonstantin Ananyev
201e18a033bSKonstantin Ananyev        if (module->create_srv_conf) {
202e18a033bSKonstantin Ananyev            ctx->srv_conf[mi] = module->create_srv_conf(cf);
203e18a033bSKonstantin Ananyev            if (ctx->srv_conf[mi] == NULL) {
204e18a033bSKonstantin Ananyev                return NGX_CONF_ERROR;
205e18a033bSKonstantin Ananyev            }
206e18a033bSKonstantin Ananyev        }
207e18a033bSKonstantin Ananyev
208e18a033bSKonstantin Ananyev        if (module->create_loc_conf) {
209e18a033bSKonstantin Ananyev            ctx->loc_conf[mi] = module->create_loc_conf(cf);
210e18a033bSKonstantin Ananyev            if (ctx->loc_conf[mi] == NULL) {
211e18a033bSKonstantin Ananyev                return NGX_CONF_ERROR;
212e18a033bSKonstantin Ananyev            }
213e18a033bSKonstantin Ananyev        }
214e18a033bSKonstantin Ananyev    }
215e18a033bSKonstantin Ananyev
216e18a033bSKonstantin Ananyev    pcf = *cf;
217e18a033bSKonstantin Ananyev    cf->ctx = ctx;
218e18a033bSKonstantin Ananyev
219e18a033bSKonstantin Ananyev    for (m = 0; cf->cycle->modules[m]; m++) {
220e18a033bSKonstantin Ananyev        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {
221e18a033bSKonstantin Ananyev            continue;
222e18a033bSKonstantin Ananyev        }
223e18a033bSKonstantin Ananyev
224e18a033bSKonstantin Ananyev        module = cf->cycle->modules[m]->ctx;
225e18a033bSKonstantin Ananyev
226e18a033bSKonstantin Ananyev        if (module->preconfiguration) {
227e18a033bSKonstantin Ananyev            if (module->preconfiguration(cf) != NGX_OK) {
228e18a033bSKonstantin Ananyev                return NGX_CONF_ERROR;
229e18a033bSKonstantin Ananyev            }
230e18a033bSKonstantin Ananyev        }
231e18a033bSKonstantin Ananyev    }
232e18a033bSKonstantin Ananyev
233e18a033bSKonstantin Ananyev    /* parse inside the http{} block */
234e18a033bSKonstantin Ananyev
235e18a033bSKonstantin Ananyev    cf->module_type = NGX_HTTP_MODULE;
236e18a033bSKonstantin Ananyev    cf->cmd_type = NGX_HTTP_MAIN_CONF;
237e18a033bSKonstantin Ananyev    rv = ngx_conf_parse(cf, NULL);
238e18a033bSKonstantin Ananyev
239e18a033bSKonstantin Ananyev    if (rv != NGX_CONF_OK) {
240e18a033bSKonstantin Ananyev        goto failed;
241e18a033bSKonstantin Ananyev    }
242e18a033bSKonstantin Ananyev
243e18a033bSKonstantin Ananyev    /*
244e18a033bSKonstantin Ananyev     * init http{} main_conf's, merge the server{}s' srv_conf's
245e18a033bSKonstantin Ananyev     * and its location{}s' loc_conf's
246e18a033bSKonstantin Ananyev     */
247e18a033bSKonstantin Ananyev
248e18a033bSKonstantin Ananyev    cmcf = ctx->main_conf[ngx_http_core_module.ctx_index];
249e18a033bSKonstantin Ananyev    cscfp = cmcf->servers.elts;
250e18a033bSKonstantin Ananyev
251e18a033bSKonstantin Ananyev    for (m = 0; cf->cycle->modules[m]; m++) {
252e18a033bSKonstantin Ananyev        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {
253e18a033bSKonstantin Ananyev            continue;
254e18a033bSKonstantin Ananyev        }
255e18a033bSKonstantin Ananyev
256e18a033bSKonstantin Ananyev        module = cf->cycle->modules[m]->ctx;
257e18a033bSKonstantin Ananyev        mi = cf->cycle->modules[m]->ctx_index;
258e18a033bSKonstantin Ananyev
259e18a033bSKonstantin Ananyev        /* init http{} main_conf's */
260e18a033bSKonstantin Ananyev
261e18a033bSKonstantin Ananyev        if (module->init_main_conf) {
262e18a033bSKonstantin Ananyev            rv = module->init_main_conf(cf, ctx->main_conf[mi]);
263e18a033bSKonstantin Ananyev            if (rv != NGX_CONF_OK) {
264e18a033bSKonstantin Ananyev                goto failed;
265e18a033bSKonstantin Ananyev            }
266e18a033bSKonstantin Ananyev        }
267e18a033bSKonstantin Ananyev
268e18a033bSKonstantin Ananyev        rv = ngx_http_merge_servers(cf, cmcf, module, mi);
269e18a033bSKonstantin Ananyev        if (rv != NGX_CONF_OK) {
270e18a033bSKonstantin Ananyev            goto failed;
271e18a033bSKonstantin Ananyev        }
272e18a033bSKonstantin Ananyev    }
273e18a033bSKonstantin Ananyev
274e18a033bSKonstantin Ananyev
275e18a033bSKonstantin Ananyev    /* create location trees */
276e18a033bSKonstantin Ananyev
277e18a033bSKonstantin Ananyev    for (s = 0; s < cmcf->servers.nelts; s++) {
278e18a033bSKonstantin Ananyev
279e18a033bSKonstantin Ananyev        clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];
280e18a033bSKonstantin Ananyev
281e18a033bSKonstantin Ananyev        if (ngx_http_init_locations(cf, cscfp[s], clcf) != NGX_OK) {
282e18a033bSKonstantin Ananyev            return NGX_CONF_ERROR;
283e18a033bSKonstantin Ananyev        }
284e18a033bSKonstantin Ananyev
285e18a033bSKonstantin Ananyev        if (ngx_http_init_static_location_trees(cf, clcf) != NGX_OK) {
286e18a033bSKonstantin Ananyev            return NGX_CONF_ERROR;
287e18a033bSKonstantin Ananyev        }
288e18a033bSKonstantin Ananyev    }
289e18a033bSKonstantin Ananyev
290e18a033bSKonstantin Ananyev
291e18a033bSKonstantin Ananyev    if (ngx_http_init_phases(cf, cmcf) != NGX_OK) {
292e18a033bSKonstantin Ananyev        return NGX_CONF_ERROR;
293e18a033bSKonstantin Ananyev    }
294e18a033bSKonstantin Ananyev
295e18a033bSKonstantin Ananyev    if (ngx_http_init_headers_in_hash(cf, cmcf) != NGX_OK) {
296e18a033bSKonstantin Ananyev        return NGX_CONF_ERROR;
297e18a033bSKonstantin Ananyev    }
298e18a033bSKonstantin Ananyev
299e18a033bSKonstantin Ananyev
300e18a033bSKonstantin Ananyev    for (m = 0; cf->cycle->modules[m]; m++) {
301e18a033bSKonstantin Ananyev        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {
302e18a033bSKonstantin Ananyev            continue;
303e18a033bSKonstantin Ananyev        }
304e18a033bSKonstantin Ananyev
305e18a033bSKonstantin Ananyev        module = cf->cycle->modules[m]->ctx;
306e18a033bSKonstantin Ananyev
307e18a033bSKonstantin Ananyev        if (module->postconfiguration) {
308e18a033bSKonstantin Ananyev            if (module->postconfiguration(cf) != NGX_OK) {
309e18a033bSKonstantin Ananyev                return NGX_CONF_ERROR;
310e18a033bSKonstantin Ananyev            }
311e18a033bSKonstantin Ananyev        }
312e18a033bSKonstantin Ananyev    }
313e18a033bSKonstantin Ananyev
314e18a033bSKonstantin Ananyev    if (ngx_http_variables_init_vars(cf) != NGX_OK) {
315e18a033bSKonstantin Ananyev        return NGX_CONF_ERROR;
316e18a033bSKonstantin Ananyev    }
317e18a033bSKonstantin Ananyev
318e18a033bSKonstantin Ananyev    /*
319e18a033bSKonstantin Ananyev     * http{}'s cf->ctx was needed while the configuration merging
320e18a033bSKonstantin Ananyev     * and in postconfiguration process
321e18a033bSKonstantin Ananyev     */
322e18a033bSKonstantin Ananyev
323e18a033bSKonstantin Ananyev    *cf = pcf;
324e18a033bSKonstantin Ananyev
325e18a033bSKonstantin Ananyev
326e18a033bSKonstantin Ananyev    if (ngx_http_init_phase_handlers(cf, cmcf) != NGX_OK) {
327e18a033bSKonstantin Ananyev        return NGX_CONF_ERROR;
328e18a033bSKonstantin Ananyev    }
329e18a033bSKonstantin Ananyev
330e18a033bSKonstantin Ananyev
331e18a033bSKonstantin Ananyev    /* optimize the lists of ports, addresses and server names */
332e18a033bSKonstantin Ananyev
333e18a033bSKonstantin Ananyev    if (ngx_http_optimize_servers(cf, cmcf, cmcf->ports) != NGX_OK) {
334e18a033bSKonstantin Ananyev        return NGX_CONF_ERROR;
335e18a033bSKonstantin Ananyev    }
336e18a033bSKonstantin Ananyev
337e18a033bSKonstantin Ananyev    return NGX_CONF_OK;
338e18a033bSKonstantin Ananyev
339e18a033bSKonstantin Ananyevfailed:
340e18a033bSKonstantin Ananyev
341e18a033bSKonstantin Ananyev    *cf = pcf;
342e18a033bSKonstantin Ananyev
343e18a033bSKonstantin Ananyev    return rv;
344e18a033bSKonstantin Ananyev}
345e18a033bSKonstantin Ananyev
346e18a033bSKonstantin Ananyev
347e18a033bSKonstantin Ananyevstatic ngx_int_t
348e18a033bSKonstantin Ananyevngx_http_init_phases(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)
349e18a033bSKonstantin Ananyev{
350e18a033bSKonstantin Ananyev    if (ngx_array_init(&cmcf->phases[NGX_HTTP_POST_READ_PHASE].handlers,
351e18a033bSKonstantin Ananyev                       cf->pool, 1, sizeof(ngx_http_handler_pt))
352e18a033bSKonstantin Ananyev        != NGX_OK)
353e18a033bSKonstantin Ananyev    {
354e18a033bSKonstantin Ananyev        return NGX_ERROR;
355e18a033bSKonstantin Ananyev    }
356e18a033bSKonstantin Ananyev
357e18a033bSKonstantin Ananyev    if (ngx_array_init(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers,
358e18a033bSKonstantin Ananyev                       cf->pool, 1, sizeof(ngx_http_handler_pt))
359e18a033bSKonstantin Ananyev        != NGX_OK)
360e18a033bSKonstantin Ananyev    {
361e18a033bSKonstantin Ananyev        return NGX_ERROR;
362e18a033bSKonstantin Ananyev    }
363e18a033bSKonstantin Ananyev
364e18a033bSKonstantin Ananyev    if (ngx_array_init(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers,
365e18a033bSKonstantin Ananyev                       cf->pool, 1, sizeof(ngx_http_handler_pt))
366e18a033bSKonstantin Ananyev        != NGX_OK)
367e18a033bSKonstantin Ananyev    {
368e18a033bSKonstantin Ananyev        return NGX_ERROR;
369e18a033bSKonstantin Ananyev    }
370e18a033bSKonstantin Ananyev
371e18a033bSKonstantin Ananyev    if (ngx_array_init(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers,
372e18a033bSKonstantin Ananyev                       cf->pool, 1, sizeof(ngx_http_handler_pt))
373e18a033bSKonstantin Ananyev        != NGX_OK)
374e18a033bSKonstantin Ananyev    {
375e18a033bSKonstantin Ananyev        return NGX_ERROR;
376e18a033bSKonstantin Ananyev    }
377e18a033bSKonstantin Ananyev
378e18a033bSKonstantin Ananyev    if (ngx_array_init(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers,
379e18a033bSKonstantin Ananyev                       cf->pool, 2, sizeof(ngx_http_handler_pt))
380e18a033bSKonstantin Ananyev        != NGX_OK)
381e18a033bSKonstantin Ananyev    {
382e18a033bSKonstantin Ananyev        return NGX_ERROR;
383e18a033bSKonstantin Ananyev    }
384e18a033bSKonstantin Ananyev
385e18a033bSKonstantin Ananyev    if (ngx_array_init(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers,
386e18a033bSKonstantin Ananyev                       cf->pool, 4, sizeof(ngx_http_handler_pt))
387e18a033bSKonstantin Ananyev        != NGX_OK)
388e18a033bSKonstantin Ananyev    {
389e18a033bSKonstantin Ananyev        return NGX_ERROR;
390e18a033bSKonstantin Ananyev    }
391e18a033bSKonstantin Ananyev
392e18a033bSKonstantin Ananyev    if (ngx_array_init(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers,
393e18a033bSKonstantin Ananyev                       cf->pool, 1, sizeof(ngx_http_handler_pt))
394e18a033bSKonstantin Ananyev        != NGX_OK)
395e18a033bSKonstantin Ananyev    {
396e18a033bSKonstantin Ananyev        return NGX_ERROR;
397e18a033bSKonstantin Ananyev    }
398e18a033bSKonstantin Ananyev
399e18a033bSKonstantin Ananyev    return NGX_OK;
400e18a033bSKonstantin Ananyev}
401e18a033bSKonstantin Ananyev
402e18a033bSKonstantin Ananyev
403e18a033bSKonstantin Ananyevstatic ngx_int_t
404e18a033bSKonstantin Ananyevngx_http_init_headers_in_hash(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)
405e18a033bSKonstantin Ananyev{
406e18a033bSKonstantin Ananyev    ngx_array_t         headers_in;
407e18a033bSKonstantin Ananyev    ngx_hash_key_t     *hk;
408e18a033bSKonstantin Ananyev    ngx_hash_init_t     hash;
409e18a033bSKonstantin Ananyev    ngx_http_header_t  *header;
410e18a033bSKonstantin Ananyev
411e18a033bSKonstantin Ananyev    if (ngx_array_init(&headers_in, cf->temp_pool, 32, sizeof(ngx_hash_key_t))
412e18a033bSKonstantin Ananyev        != NGX_OK)
413e18a033bSKonstantin Ananyev    {
414e18a033bSKonstantin Ananyev        return NGX_ERROR;
415e18a033bSKonstantin Ananyev    }
416e18a033bSKonstantin Ananyev
417e18a033bSKonstantin Ananyev    for (header = ngx_http_headers_in; header->name.len; header++) {
418