comparison src/http/ngx_http.c @ 3217:a22bf524a456

refactor http listen code: *) add listen's to the global cmcf->ports array instead of server's one *) rename ngx_http_listen_conf_t to ngx_http_listen_opt_t
author Igor Sysoev <igor@sysoev.ru>
date Wed, 21 Oct 2009 08:19:46 +0000
parents 98e288c6dac3
children 022a7662b4ed
comparison
equal deleted inserted replaced
3216:79ae445ec57b 3217:a22bf524a456
15 static ngx_int_t ngx_http_init_headers_in_hash(ngx_conf_t *cf, 15 static ngx_int_t ngx_http_init_headers_in_hash(ngx_conf_t *cf,
16 ngx_http_core_main_conf_t *cmcf); 16 ngx_http_core_main_conf_t *cmcf);
17 static ngx_int_t ngx_http_init_phase_handlers(ngx_conf_t *cf, 17 static ngx_int_t ngx_http_init_phase_handlers(ngx_conf_t *cf,
18 ngx_http_core_main_conf_t *cmcf); 18 ngx_http_core_main_conf_t *cmcf);
19 19
20 static ngx_int_t ngx_http_init_server_lists(ngx_conf_t *cf,
21 ngx_array_t *servers, ngx_array_t *ports);
22 static ngx_int_t ngx_http_add_ports(ngx_conf_t *cf,
23 ngx_http_core_srv_conf_t *cscf, ngx_array_t *ports,
24 ngx_http_listen_t *listen);
25 static ngx_int_t ngx_http_add_addresses(ngx_conf_t *cf, 20 static ngx_int_t ngx_http_add_addresses(ngx_conf_t *cf,
26 ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port, 21 ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port,
27 ngx_http_listen_t *listen); 22 ngx_http_listen_t *listen);
28 static ngx_int_t ngx_http_add_address(ngx_conf_t *cf, 23 static ngx_int_t ngx_http_add_address(ngx_conf_t *cf,
29 ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port, 24 ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port,
120 ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) 115 ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
121 { 116 {
122 char *rv; 117 char *rv;
123 ngx_uint_t mi, m, s; 118 ngx_uint_t mi, m, s;
124 ngx_conf_t pcf; 119 ngx_conf_t pcf;
125 ngx_array_t ports;
126 ngx_http_module_t *module; 120 ngx_http_module_t *module;
127 ngx_http_conf_ctx_t *ctx; 121 ngx_http_conf_ctx_t *ctx;
128 ngx_http_core_loc_conf_t *clcf; 122 ngx_http_core_loc_conf_t *clcf;
129 ngx_http_core_srv_conf_t **cscfp; 123 ngx_http_core_srv_conf_t **cscfp;
130 ngx_http_core_main_conf_t *cmcf; 124 ngx_http_core_main_conf_t *cmcf;
360 if (ngx_http_init_phase_handlers(cf, cmcf) != NGX_OK) { 354 if (ngx_http_init_phase_handlers(cf, cmcf) != NGX_OK) {
361 return NGX_CONF_ERROR; 355 return NGX_CONF_ERROR;
362 } 356 }
363 357
364 358
365 /*
366 * create the lists of ports, addresses and server names
367 * to find quickly the server core module configuration at run-time
368 */
369
370 if (ngx_http_init_server_lists(cf, &cmcf->servers, &ports) != NGX_OK) {
371 return NGX_CONF_ERROR;
372 }
373
374
375 /* optimize the lists of ports, addresses and server names */ 359 /* optimize the lists of ports, addresses and server names */
376 360
377 if (ngx_http_optimize_servers(cf, cmcf, &ports) != NGX_OK) { 361 if (ngx_http_optimize_servers(cf, cmcf, cmcf->ports) != NGX_OK) {
378 return NGX_CONF_ERROR; 362 return NGX_CONF_ERROR;
379 } 363 }
380 364
381 return NGX_CONF_OK; 365 return NGX_CONF_OK;
382 366
1107 1091
1108 return node; 1092 return node;
1109 } 1093 }
1110 1094
1111 1095
1112 static ngx_int_t 1096 ngx_int_t
1113 ngx_http_init_server_lists(ngx_conf_t *cf, ngx_array_t *servers, 1097 ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
1114 ngx_array_t *ports) 1098 ngx_http_listen_t *listen)
1115 { 1099 {
1116 ngx_uint_t s, i; 1100 in_port_t p;
1117 ngx_http_listen_t *listen; 1101 ngx_uint_t i;
1118 ngx_http_core_srv_conf_t **cscfp; 1102 struct sockaddr *sa;
1119 1103 struct sockaddr_in *sin;
1120 if (ngx_array_init(ports, cf->temp_pool, 2, sizeof(ngx_http_conf_port_t)) 1104 ngx_http_conf_port_t *port;
1121 != NGX_OK) 1105 ngx_http_core_main_conf_t *cmcf;
1122 {
1123 return NGX_ERROR;
1124 }
1125
1126 /* "server" directives */
1127
1128 cscfp = servers->elts;
1129 for (s = 0; s < servers->nelts; s++) {
1130
1131 /* "listen" directives */
1132
1133 listen = cscfp[s]->listen.elts;
1134 for (i = 0; i < cscfp[s]->listen.nelts; i++) {
1135
1136 if (ngx_http_add_ports(cf, cscfp[s], ports, &listen[i]) != NGX_OK) {
1137 return NGX_ERROR;
1138 }
1139 }
1140 }
1141
1142 return NGX_OK;
1143 }
1144
1145
1146 static ngx_int_t
1147 ngx_http_add_ports(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
1148 ngx_array_t *ports, ngx_http_listen_t *listen)
1149 {
1150 in_port_t p;
1151 ngx_uint_t i;
1152 struct sockaddr *sa;
1153 struct sockaddr_in *sin;
1154 ngx_http_conf_port_t *port;
1155 #if (NGX_HAVE_INET6) 1106 #if (NGX_HAVE_INET6)
1156 struct sockaddr_in6 *sin6; 1107 struct sockaddr_in6 *sin6;
1157 #endif 1108 #endif
1109
1110 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
1111
1112 if (cmcf->ports == NULL) {
1113 cmcf->ports = ngx_array_create(cf->temp_pool, 2,
1114 sizeof(ngx_http_conf_port_t));
1115 if (cmcf->ports == NULL) {
1116 return NGX_ERROR;
1117 }
1118 }
1158 1119
1159 sa = (struct sockaddr *) &listen->sockaddr; 1120 sa = (struct sockaddr *) &listen->sockaddr;
1160 1121
1161 switch (sa->sa_family) { 1122 switch (sa->sa_family) {
1162 1123
1171 sin = (struct sockaddr_in *) sa; 1132 sin = (struct sockaddr_in *) sa;
1172 p = sin->sin_port; 1133 p = sin->sin_port;
1173 break; 1134 break;
1174 } 1135 }
1175 1136
1176 port = ports->elts; 1137 port = cmcf->ports->elts;
1177 for (i = 0; i < ports->nelts; i++) { 1138 for (i = 0; i < cmcf->ports->nelts; i++) {
1178 1139
1179 if (p != port[i].port || sa->sa_family != port[i].family) { 1140 if (p != port[i].port || sa->sa_family != port[i].family) {
1180 continue; 1141 continue;
1181 } 1142 }
1182 1143
1185 return ngx_http_add_addresses(cf, cscf, &port[i], listen); 1146 return ngx_http_add_addresses(cf, cscf, &port[i], listen);
1186 } 1147 }
1187 1148
1188 /* add a port to the port list */ 1149 /* add a port to the port list */
1189 1150
1190 port = ngx_array_push(ports); 1151 port = ngx_array_push(cmcf->ports);
1191 if (port == NULL) { 1152 if (port == NULL) {
1192 return NGX_ERROR; 1153 return NGX_ERROR;
1193 } 1154 }
1194 1155
1195 port->family = sa->sa_family; 1156 port->family = sa->sa_family;
1248 return NGX_ERROR; 1209 return NGX_ERROR;
1249 } 1210 }
1250 1211
1251 /* check the duplicate "default" server for this address:port */ 1212 /* check the duplicate "default" server for this address:port */
1252 1213
1253 if (listen->conf.default_server) { 1214 if (listen->opt.default_server) {
1254 1215
1255 if (addr[i].default_server) { 1216 if (addr[i].default_server) {
1256 ngx_log_error(NGX_LOG_ERR, cf->log, 0, 1217 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1257 "the duplicate default server in %s:%ui", 1218 "the duplicate default server");
1258 listen->file_name, listen->line);
1259
1260 return NGX_ERROR; 1219 return NGX_ERROR;
1261 } 1220 }
1262 1221
1263 addr[i].core_srv_conf = cscf; 1222 addr[i].core_srv_conf = cscf;
1264 addr[i].default_server = 1; 1223 addr[i].default_server = 1;
1265 #if (NGX_HTTP_SSL) 1224 #if (NGX_HTTP_SSL)
1266 addr[i].ssl = listen->conf.ssl; 1225 addr[i].ssl = listen->opt.ssl;
1267 #endif 1226 #endif
1268 addr[i].listen_conf = &listen->conf; 1227 addr[i].opt = listen->opt;
1269 } 1228 }
1270 1229
1271 return NGX_OK; 1230 return NGX_OK;
1272 } 1231 }
1273 1232
1300 addr = ngx_array_push(&port->addrs); 1259 addr = ngx_array_push(&port->addrs);
1301 if (addr == NULL) { 1260 if (addr == NULL) {
1302 return NGX_ERROR; 1261 return NGX_ERROR;
1303 } 1262 }
1304 1263
1305 addr->sockaddr = (struct sockaddr *) &listen->sockaddr; 1264 ngx_memcpy(addr->sockaddr, listen->sockaddr, listen->socklen);
1306 addr->socklen = listen->socklen; 1265 addr->socklen = listen->socklen;
1307 addr->hash.buckets = NULL; 1266 addr->hash.buckets = NULL;
1308 addr->hash.size = 0; 1267 addr->hash.size = 0;
1309 addr->wc_head = NULL; 1268 addr->wc_head = NULL;
1310 addr->wc_tail = NULL; 1269 addr->wc_tail = NULL;
1312 #if (NGX_PCRE) 1271 #if (NGX_PCRE)
1313 addr->nregex = 0; 1272 addr->nregex = 0;
1314 addr->regex = NULL; 1273 addr->regex = NULL;
1315 #endif 1274 #endif
1316 addr->core_srv_conf = cscf; 1275 addr->core_srv_conf = cscf;
1317 addr->default_server = listen->conf.default_server; 1276 addr->default_server = listen->opt.default_server;
1318 addr->bind = listen->conf.bind; 1277 addr->bind = listen->opt.bind;
1319 addr->wildcard = listen->conf.wildcard; 1278 addr->wildcard = listen->opt.wildcard;
1320 #if (NGX_HTTP_SSL) 1279 #if (NGX_HTTP_SSL)
1321 addr->ssl = listen->conf.ssl; 1280 addr->ssl = listen->opt.ssl;
1322 #endif 1281 #endif
1323 addr->listen_conf = &listen->conf; 1282 addr->opt = listen->opt;
1324 1283
1325 return ngx_http_add_names(cf, cscf, addr); 1284 return ngx_http_add_names(cf, cscf, addr);
1326 } 1285 }
1327 1286
1328 1287
1468 } 1427 }
1469 1428
1470 if (rc == NGX_DECLINED) { 1429 if (rc == NGX_DECLINED) {
1471 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, 1430 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
1472 "invalid server name or wildcard \"%V\" on %s", 1431 "invalid server name or wildcard \"%V\" on %s",
1473 &name[s].name, addr->listen_conf->addr); 1432 &name[s].name, addr->opt.addr);
1474 return NGX_ERROR; 1433 return NGX_ERROR;
1475 } 1434 }
1476 1435
1477 if (rc == NGX_BUSY) { 1436 if (rc == NGX_BUSY) {
1478 ngx_log_error(NGX_LOG_WARN, cf->log, 0, 1437 ngx_log_error(NGX_LOG_WARN, cf->log, 0,
1479 "conflicting server name \"%V\" on %s, ignored", 1438 "conflicting server name \"%V\" on %s, ignored",
1480 &name[s].name, addr->listen_conf->addr); 1439 &name[s].name, addr->opt.addr);
1481 } 1440 }
1482 } 1441 }
1483 1442
1484 hash.key = ngx_hash_key_lc; 1443 hash.key = ngx_hash_key_lc;
1485 hash.max_size = cmcf->server_names_hash_max_size; 1444 hash.max_size = cmcf->server_names_hash_max_size;
1719 ls->post_accept_buffer_size = cscf->client_header_buffer_size; 1678 ls->post_accept_buffer_size = cscf->client_header_buffer_size;
1720 } 1679 }
1721 } 1680 }
1722 #endif 1681 #endif
1723 1682
1724 ls->backlog = addr->listen_conf->backlog; 1683 ls->backlog = addr->opt.backlog;
1725 ls->rcvbuf = addr->listen_conf->rcvbuf; 1684 ls->rcvbuf = addr->opt.rcvbuf;
1726 ls->sndbuf = addr->listen_conf->sndbuf; 1685 ls->sndbuf = addr->opt.sndbuf;
1727 1686
1728 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) 1687 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
1729 ls->accept_filter = addr->listen_conf->accept_filter; 1688 ls->accept_filter = addr->opt.accept_filter;
1730 #endif 1689 #endif
1731 1690
1732 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT) 1691 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
1733 ls->deferred_accept = addr->listen_conf->deferred_accept; 1692 ls->deferred_accept = addr->opt.deferred_accept;
1734 #endif 1693 #endif
1735 1694
1736 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) 1695 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
1737 ls->ipv6only = addr->listen_conf->ipv6only; 1696 ls->ipv6only = addr->opt.ipv6only;
1738 #endif 1697 #endif
1739 1698
1740 return ls; 1699 return ls;
1741 } 1700 }
1742 1701