Mercurial > hg > nginx-mail
comparison src/http/ngx_http_core_module.c @ 362:54fad6c4b555 NGINX_0_6_25
nginx 0.6.25
*) Change: now the "server_name_in_redirect" directive is used instead
of the "server_name" directive's special "*" parameter.
*) Change: now wildcard and regex names can be used as main name in a
"server_name" directive.
*) Change: the "satisfy_any" directive was replaced by the "satisfy"
directive.
*) Workaround: old worker processes might hog CPU after reconfiguration
if they was run under Linux OpenVZ.
*) Feature: the "min_delete_depth" directive.
*) Bugfix: the COPY and MOVE methods did not work with single files.
*) Bugfix: the ngx_http_gzip_static_module did not allow the
ngx_http_dav_module to work; bug appeared in 0.6.23.
*) Bugfix: socket leak in HTTPS mode if deferred accept was used.
Thanks to Ben Maurer.
*) Bugfix: nginx could not be built without PCRE library; bug appeared
in 0.6.23.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Tue, 08 Jan 2008 00:00:00 +0300 |
parents | 9121a0a91f47 |
children | a39aab45a53f |
comparison
equal
deleted
inserted
replaced
361:160660bad929 | 362:54fad6c4b555 |
---|---|
91 | 91 |
92 static ngx_conf_deprecated_t ngx_conf_deprecated_open_file_cache_retest = { | 92 static ngx_conf_deprecated_t ngx_conf_deprecated_open_file_cache_retest = { |
93 ngx_conf_deprecated, "open_file_cache_retest", "open_file_cache_valid" | 93 ngx_conf_deprecated, "open_file_cache_retest", "open_file_cache_valid" |
94 }; | 94 }; |
95 | 95 |
96 static ngx_conf_deprecated_t ngx_conf_deprecated_satisfy_any = { | |
97 ngx_conf_deprecated, "satisfy_any", "satisfy" | |
98 }; | |
99 | |
96 | 100 |
97 static ngx_conf_enum_t ngx_http_core_request_body_in_file[] = { | 101 static ngx_conf_enum_t ngx_http_core_request_body_in_file[] = { |
98 { ngx_string("off"), NGX_HTTP_REQUEST_BODY_FILE_OFF }, | 102 { ngx_string("off"), NGX_HTTP_REQUEST_BODY_FILE_OFF }, |
99 { ngx_string("on"), NGX_HTTP_REQUEST_BODY_FILE_ON }, | 103 { ngx_string("on"), NGX_HTTP_REQUEST_BODY_FILE_ON }, |
100 { ngx_string("clean"), NGX_HTTP_REQUEST_BODY_FILE_CLEAN }, | 104 { ngx_string("clean"), NGX_HTTP_REQUEST_BODY_FILE_CLEAN }, |
105 { ngx_null_string, 0 } | |
106 }; | |
107 | |
108 | |
109 static ngx_conf_enum_t ngx_http_core_satisfy[] = { | |
110 { ngx_string("all"), NGX_HTTP_SATISFY_ALL }, | |
111 { ngx_string("any"), NGX_HTTP_SATISFY_ANY }, | |
101 { ngx_null_string, 0 } | 112 { ngx_null_string, 0 } |
102 }; | 113 }; |
103 | 114 |
104 | 115 |
105 #if (NGX_HTTP_GZIP) | 116 #if (NGX_HTTP_GZIP) |
402 ngx_http_core_keepalive, | 413 ngx_http_core_keepalive, |
403 NGX_HTTP_LOC_CONF_OFFSET, | 414 NGX_HTTP_LOC_CONF_OFFSET, |
404 0, | 415 0, |
405 NULL }, | 416 NULL }, |
406 | 417 |
418 { ngx_string("satisfy"), | |
419 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
420 ngx_conf_set_enum_slot, | |
421 NGX_HTTP_LOC_CONF_OFFSET, | |
422 offsetof(ngx_http_core_loc_conf_t, satisfy), | |
423 &ngx_http_core_satisfy }, | |
424 | |
407 { ngx_string("satisfy_any"), | 425 { ngx_string("satisfy_any"), |
408 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, | 426 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, |
409 ngx_conf_set_flag_slot, | 427 ngx_conf_set_flag_slot, |
410 NGX_HTTP_LOC_CONF_OFFSET, | 428 NGX_HTTP_LOC_CONF_OFFSET, |
411 offsetof(ngx_http_core_loc_conf_t, satisfy_any), | 429 offsetof(ngx_http_core_loc_conf_t, satisfy), |
412 NULL }, | 430 &ngx_conf_deprecated_satisfy_any }, |
413 | 431 |
414 { ngx_string("internal"), | 432 { ngx_string("internal"), |
415 NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS, | 433 NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS, |
416 ngx_http_core_internal, | 434 ngx_http_core_internal, |
417 NGX_HTTP_LOC_CONF_OFFSET, | 435 NGX_HTTP_LOC_CONF_OFFSET, |
435 { ngx_string("reset_timedout_connection"), | 453 { ngx_string("reset_timedout_connection"), |
436 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, | 454 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, |
437 ngx_conf_set_flag_slot, | 455 ngx_conf_set_flag_slot, |
438 NGX_HTTP_LOC_CONF_OFFSET, | 456 NGX_HTTP_LOC_CONF_OFFSET, |
439 offsetof(ngx_http_core_loc_conf_t, reset_timedout_connection), | 457 offsetof(ngx_http_core_loc_conf_t, reset_timedout_connection), |
458 NULL }, | |
459 | |
460 { ngx_string("server_name_in_redirect"), | |
461 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, | |
462 ngx_conf_set_flag_slot, | |
463 NGX_HTTP_LOC_CONF_OFFSET, | |
464 offsetof(ngx_http_core_loc_conf_t, server_name_in_redirect), | |
440 NULL }, | 465 NULL }, |
441 | 466 |
442 { ngx_string("port_in_redirect"), | 467 { ngx_string("port_in_redirect"), |
443 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, | 468 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, |
444 ngx_conf_set_flag_slot, | 469 ngx_conf_set_flag_slot, |
909 return NGX_OK; | 934 return NGX_OK; |
910 } | 935 } |
911 | 936 |
912 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); | 937 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
913 | 938 |
914 if (clcf->satisfy_any == 0) { | 939 if (clcf->satisfy == NGX_HTTP_SATISFY_ALL) { |
915 | 940 |
916 if (rc == NGX_OK) { | 941 if (rc == NGX_OK) { |
917 r->phase_handler++; | 942 r->phase_handler++; |
918 return NGX_AGAIN; | 943 return NGX_AGAIN; |
919 } | 944 } |
1469 | 1494 |
1470 return NGX_OK; | 1495 return NGX_OK; |
1471 } | 1496 } |
1472 | 1497 |
1473 | 1498 |
1499 ngx_int_t | |
1500 ngx_http_server_addr(ngx_http_request_t *r, ngx_str_t *s) | |
1501 { | |
1502 socklen_t len; | |
1503 ngx_connection_t *c; | |
1504 struct sockaddr_in sin; | |
1505 | |
1506 /* AF_INET only */ | |
1507 | |
1508 c = r->connection; | |
1509 | |
1510 if (r->in_addr == 0) { | |
1511 len = sizeof(struct sockaddr_in); | |
1512 if (getsockname(c->fd, (struct sockaddr *) &sin, &len) == -1) { | |
1513 ngx_connection_error(c, ngx_socket_errno, "getsockname() failed"); | |
1514 return NGX_ERROR; | |
1515 } | |
1516 | |
1517 r->in_addr = sin.sin_addr.s_addr; | |
1518 } | |
1519 | |
1520 if (s == NULL) { | |
1521 return NGX_OK; | |
1522 } | |
1523 | |
1524 s->len = ngx_inet_ntop(c->listening->family, &r->in_addr, | |
1525 s->data, INET_ADDRSTRLEN); | |
1526 | |
1527 return NGX_OK; | |
1528 } | |
1529 | |
1530 | |
1474 #if (NGX_HTTP_GZIP) | 1531 #if (NGX_HTTP_GZIP) |
1475 | 1532 |
1476 ngx_int_t | 1533 ngx_int_t |
1477 ngx_http_gzip_ok(ngx_http_request_t *r) | 1534 ngx_http_gzip_ok(ngx_http_request_t *r) |
1478 { | 1535 { |
1608 | 1665 |
1609 #if (NGX_PCRE) | 1666 #if (NGX_PCRE) |
1610 | 1667 |
1611 if (clcf->gzip_disable && r->headers_in.user_agent) { | 1668 if (clcf->gzip_disable && r->headers_in.user_agent) { |
1612 | 1669 |
1613 if (ngx_regex_exec_array(clcf->gzip_disable, | 1670 if (ngx_regex_exec_array(clcf->gzip_disable, |
1614 &r->headers_in.user_agent->value, | 1671 &r->headers_in.user_agent->value, |
1615 r->connection->log) | 1672 r->connection->log) |
1616 != NGX_DECLINED) | 1673 != NGX_DECLINED) |
1617 { | 1674 { |
1618 return NGX_DECLINED; | 1675 return NGX_DECLINED; |
1721 } | 1778 } |
1722 | 1779 |
1723 sr->in_addr = r->in_addr; | 1780 sr->in_addr = r->in_addr; |
1724 sr->port = r->port; | 1781 sr->port = r->port; |
1725 sr->port_text = r->port_text; | 1782 sr->port_text = r->port_text; |
1726 sr->server_name = r->server_name; | |
1727 | 1783 |
1728 sr->variables = r->variables; | 1784 sr->variables = r->variables; |
1729 | 1785 |
1730 sr->log_handler = r->log_handler; | 1786 sr->log_handler = r->log_handler; |
1731 | 1787 |
2633 */ | 2689 */ |
2634 | 2690 |
2635 lcf->client_max_body_size = NGX_CONF_UNSET; | 2691 lcf->client_max_body_size = NGX_CONF_UNSET; |
2636 lcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE; | 2692 lcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE; |
2637 lcf->client_body_timeout = NGX_CONF_UNSET_MSEC; | 2693 lcf->client_body_timeout = NGX_CONF_UNSET_MSEC; |
2638 lcf->satisfy_any = NGX_CONF_UNSET; | 2694 lcf->satisfy = NGX_CONF_UNSET_UINT; |
2639 lcf->internal = NGX_CONF_UNSET; | 2695 lcf->internal = NGX_CONF_UNSET; |
2640 lcf->client_body_in_file_only = NGX_CONF_UNSET; | 2696 lcf->client_body_in_file_only = NGX_CONF_UNSET; |
2641 lcf->sendfile = NGX_CONF_UNSET; | 2697 lcf->sendfile = NGX_CONF_UNSET; |
2642 lcf->sendfile_max_chunk = NGX_CONF_UNSET_SIZE; | 2698 lcf->sendfile_max_chunk = NGX_CONF_UNSET_SIZE; |
2643 lcf->tcp_nopush = NGX_CONF_UNSET; | 2699 lcf->tcp_nopush = NGX_CONF_UNSET; |
2650 lcf->keepalive_header = NGX_CONF_UNSET; | 2706 lcf->keepalive_header = NGX_CONF_UNSET; |
2651 lcf->lingering_time = NGX_CONF_UNSET_MSEC; | 2707 lcf->lingering_time = NGX_CONF_UNSET_MSEC; |
2652 lcf->lingering_timeout = NGX_CONF_UNSET_MSEC; | 2708 lcf->lingering_timeout = NGX_CONF_UNSET_MSEC; |
2653 lcf->resolver_timeout = NGX_CONF_UNSET_MSEC; | 2709 lcf->resolver_timeout = NGX_CONF_UNSET_MSEC; |
2654 lcf->reset_timedout_connection = NGX_CONF_UNSET; | 2710 lcf->reset_timedout_connection = NGX_CONF_UNSET; |
2711 lcf->server_name_in_redirect = NGX_CONF_UNSET; | |
2655 lcf->port_in_redirect = NGX_CONF_UNSET; | 2712 lcf->port_in_redirect = NGX_CONF_UNSET; |
2656 lcf->msie_padding = NGX_CONF_UNSET; | 2713 lcf->msie_padding = NGX_CONF_UNSET; |
2657 lcf->msie_refresh = NGX_CONF_UNSET; | 2714 lcf->msie_refresh = NGX_CONF_UNSET; |
2658 lcf->log_not_found = NGX_CONF_UNSET; | 2715 lcf->log_not_found = NGX_CONF_UNSET; |
2659 lcf->recursive_error_pages = NGX_CONF_UNSET; | 2716 lcf->recursive_error_pages = NGX_CONF_UNSET; |
2668 lcf->open_file_cache_events = NGX_CONF_UNSET; | 2725 lcf->open_file_cache_events = NGX_CONF_UNSET; |
2669 | 2726 |
2670 #if (NGX_HTTP_GZIP) | 2727 #if (NGX_HTTP_GZIP) |
2671 lcf->gzip_vary = NGX_CONF_UNSET; | 2728 lcf->gzip_vary = NGX_CONF_UNSET; |
2672 lcf->gzip_http_version = NGX_CONF_UNSET_UINT; | 2729 lcf->gzip_http_version = NGX_CONF_UNSET_UINT; |
2730 #if (NGX_PCRE) | |
2673 lcf->gzip_disable = NGX_CONF_UNSET_PTR; | 2731 lcf->gzip_disable = NGX_CONF_UNSET_PTR; |
2732 #endif | |
2674 #endif | 2733 #endif |
2675 | 2734 |
2676 return lcf; | 2735 return lcf; |
2677 } | 2736 } |
2678 | 2737 |
2815 prev->client_body_buffer_size, | 2874 prev->client_body_buffer_size, |
2816 (size_t) 2 * ngx_pagesize); | 2875 (size_t) 2 * ngx_pagesize); |
2817 ngx_conf_merge_msec_value(conf->client_body_timeout, | 2876 ngx_conf_merge_msec_value(conf->client_body_timeout, |
2818 prev->client_body_timeout, 60000); | 2877 prev->client_body_timeout, 60000); |
2819 | 2878 |
2820 ngx_conf_merge_value(conf->satisfy_any, prev->satisfy_any, 0); | 2879 ngx_conf_merge_uint_value(conf->satisfy, prev->satisfy, |
2880 NGX_HTTP_SATISFY_ALL); | |
2821 ngx_conf_merge_value(conf->internal, prev->internal, 0); | 2881 ngx_conf_merge_value(conf->internal, prev->internal, 0); |
2822 ngx_conf_merge_value(conf->client_body_in_file_only, | 2882 ngx_conf_merge_value(conf->client_body_in_file_only, |
2823 prev->client_body_in_file_only, 0); | 2883 prev->client_body_in_file_only, 0); |
2824 ngx_conf_merge_value(conf->sendfile, prev->sendfile, 0); | 2884 ngx_conf_merge_value(conf->sendfile, prev->sendfile, 0); |
2825 ngx_conf_merge_size_value(conf->sendfile_max_chunk, | 2885 ngx_conf_merge_size_value(conf->sendfile_max_chunk, |
2859 NGX_HTTP_CLIENT_TEMP_PATH, 0, 0, 0, | 2919 NGX_HTTP_CLIENT_TEMP_PATH, 0, 0, 0, |
2860 ngx_garbage_collector_temp_handler, cf); | 2920 ngx_garbage_collector_temp_handler, cf); |
2861 | 2921 |
2862 ngx_conf_merge_value(conf->reset_timedout_connection, | 2922 ngx_conf_merge_value(conf->reset_timedout_connection, |
2863 prev->reset_timedout_connection, 0); | 2923 prev->reset_timedout_connection, 0); |
2924 ngx_conf_merge_value(conf->server_name_in_redirect, | |
2925 prev->server_name_in_redirect, 1); | |
2864 ngx_conf_merge_value(conf->port_in_redirect, prev->port_in_redirect, 1); | 2926 ngx_conf_merge_value(conf->port_in_redirect, prev->port_in_redirect, 1); |
2865 ngx_conf_merge_value(conf->msie_padding, prev->msie_padding, 1); | 2927 ngx_conf_merge_value(conf->msie_padding, prev->msie_padding, 1); |
2866 ngx_conf_merge_value(conf->msie_refresh, prev->msie_refresh, 0); | 2928 ngx_conf_merge_value(conf->msie_refresh, prev->msie_refresh, 0); |
2867 ngx_conf_merge_value(conf->log_not_found, prev->log_not_found, 1); | 2929 ngx_conf_merge_value(conf->log_not_found, prev->log_not_found, 1); |
2868 ngx_conf_merge_value(conf->recursive_error_pages, | 2930 ngx_conf_merge_value(conf->recursive_error_pages, |
2889 ngx_conf_merge_uint_value(conf->gzip_http_version, prev->gzip_http_version, | 2951 ngx_conf_merge_uint_value(conf->gzip_http_version, prev->gzip_http_version, |
2890 NGX_HTTP_VERSION_11); | 2952 NGX_HTTP_VERSION_11); |
2891 ngx_conf_merge_bitmask_value(conf->gzip_proxied, prev->gzip_proxied, | 2953 ngx_conf_merge_bitmask_value(conf->gzip_proxied, prev->gzip_proxied, |
2892 (NGX_CONF_BITMASK_SET|NGX_HTTP_GZIP_PROXIED_OFF)); | 2954 (NGX_CONF_BITMASK_SET|NGX_HTTP_GZIP_PROXIED_OFF)); |
2893 | 2955 |
2956 #if (NGX_PCRE) | |
2894 ngx_conf_merge_ptr_value(conf->gzip_disable, prev->gzip_disable, NULL); | 2957 ngx_conf_merge_ptr_value(conf->gzip_disable, prev->gzip_disable, NULL); |
2958 #endif | |
2895 | 2959 |
2896 #endif | 2960 #endif |
2897 | 2961 |
2898 return NGX_CONF_OK; | 2962 return NGX_CONF_OK; |
2899 } | 2963 } |
3072 value = cf->args->elts; | 3136 value = cf->args->elts; |
3073 | 3137 |
3074 ch = value[1].data[0]; | 3138 ch = value[1].data[0]; |
3075 | 3139 |
3076 if (cscf->server_name.data == NULL && value[1].len) { | 3140 if (cscf->server_name.data == NULL && value[1].len) { |
3077 if (ngx_strchr(value[1].data, '*')) { | |
3078 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
3079 "first server name \"%V\" must not be wildcard", | |
3080 &value[1]); | |
3081 return NGX_CONF_ERROR; | |
3082 } | |
3083 | |
3084 if (value[1].data[0] == '~') { | |
3085 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
3086 "first server name \"%V\" " | |
3087 "must not be regular expression", &value[1]); | |
3088 return NGX_CONF_ERROR; | |
3089 } | |
3090 | |
3091 name = value[1]; | 3141 name = value[1]; |
3092 | 3142 |
3093 if (ch == '.') { | 3143 if (ch == '.') { |
3094 name.len--; | 3144 name.len--; |
3095 name.data++; | 3145 name.data++; |
3103 } | 3153 } |
3104 | 3154 |
3105 for (i = 1; i < cf->args->nelts; i++) { | 3155 for (i = 1; i < cf->args->nelts; i++) { |
3106 | 3156 |
3107 ch = value[i].data[0]; | 3157 ch = value[i].data[0]; |
3108 | |
3109 if (value[i].len == 1 && ch == '*') { | |
3110 cscf->wildcard = 1; | |
3111 continue; | |
3112 } | |
3113 | 3158 |
3114 if (value[i].len == 0 | 3159 if (value[i].len == 0 |
3115 || (ch == '*' && (value[i].len < 3 || value[i].data[1] != '.')) | 3160 || (ch == '*' && (value[i].len < 3 || value[i].data[1] != '.')) |
3116 || (ch == '.' && value[i].len < 2)) | 3161 || (ch == '.' && value[i].len < 2)) |
3117 { | 3162 { |
3122 | 3167 |
3123 if (ngx_strchr(value[i].data, '/')) { | 3168 if (ngx_strchr(value[i].data, '/')) { |
3124 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, | 3169 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, |
3125 "server name \"%V\" has strange symbols", | 3170 "server name \"%V\" has strange symbols", |
3126 &value[i]); | 3171 &value[i]); |
3172 } | |
3173 | |
3174 if (value[i].len == 1 && ch == '*') { | |
3175 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
3176 "\"server_name *\" is unsupported, use " | |
3177 "\"server_name_in_redirect off\" instead"); | |
3178 return NGX_CONF_ERROR; | |
3127 } | 3179 } |
3128 | 3180 |
3129 sn = ngx_array_push(&cscf->server_names); | 3181 sn = ngx_array_push(&cscf->server_names); |
3130 if (sn == NULL) { | 3182 if (sn == NULL) { |
3131 return NGX_CONF_ERROR; | 3183 return NGX_CONF_ERROR; |