Mercurial > hg > nginx-vendor-0-8
diff src/http/modules/ngx_http_headers_filter_module.c @ 122:d25a1d6034f1 NGINX_0_3_8
nginx 0.3.8
*) Security: nginx now checks URI got from a backend in
"X-Accel-Redirect" header line or in SSI file for the "/../" paths
and zeroes.
*) Change: nginx now does not treat the empty user name in the
"Authorization" header line as valid one.
*) Feature: the "ssl_session_timeout" directives of the
ngx_http_ssl_module and ngx_imap_ssl_module.
*) Feature: the "auth_http_header" directive of the
ngx_imap_auth_http_module.
*) Feature: the "add_header" directive.
*) Feature: the ngx_http_realip_module.
*) Feature: the new variables to use in the "log_format" directive:
$bytes_sent, $apache_bytes_sent, $status, $time_gmt, $uri,
$request_time, $request_length, $upstream_status,
$upstream_response_time, $gzip_ratio, $uid_got, $uid_set,
$connection, $pipe, and $msec. The parameters in the "%name" form
will be canceled soon.
*) Change: now the false variable values in the "if" directive are the
empty string "" and string starting with "0".
*) Bugfix: while using proxied or FastCGI-server nginx may leave
connections and temporary files with client requests in open state.
*) Bugfix: the worker processes did not flush the buffered logs on
graceful exit.
*) Bugfix: if the request URI was changes by the "rewrite" directive
and the request was proxied in location given by regular expression,
then the incorrect request was transferred to backend; bug appeared
in 0.2.6.
*) Bugfix: the "expires" directive did not remove the previous
"Expires" header.
*) Bugfix: nginx may stop to accept requests if the "rtsig" method and
several worker processes were used.
*) Bugfix: the "\"" and "\'" escape symbols were incorrectly handled in
SSI commands.
*) Bugfix: if the response was ended just after the SSI command and
gzipping was used, then the response did not transferred complete or
did not transferred at all.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Wed, 09 Nov 2005 00:00:00 +0300 |
parents | f63280c59dd5 |
children | df17fbafec8f |
line wrap: on
line diff
--- a/src/http/modules/ngx_http_headers_filter_module.c +++ b/src/http/modules/ngx_http_headers_filter_module.c @@ -10,7 +10,9 @@ typedef struct { - time_t expires; + time_t expires; + ngx_str_t cache_control; + ngx_array_t *headers; } ngx_http_headers_conf_t; @@ -22,20 +24,31 @@ typedef struct { static ngx_int_t ngx_http_headers_filter_init(ngx_cycle_t *cycle); static void *ngx_http_headers_create_conf(ngx_conf_t *cf); static char *ngx_http_headers_merge_conf(ngx_conf_t *cf, - void *parent, void *child); + void *parent, void *child); static char *ngx_http_headers_expires(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); +static char *ngx_http_headers_add(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); static ngx_command_t ngx_http_headers_filter_commands[] = { { ngx_string("expires"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF + |NGX_CONF_TAKE1, ngx_http_headers_expires, NGX_HTTP_LOC_CONF_OFFSET, 0, NULL}, + { ngx_string("add_header"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF + |NGX_CONF_TAKE2, + ngx_http_headers_add, + NGX_HTTP_LOC_CONF_OFFSET, + 0, + NULL}, + ngx_null_command }; @@ -79,7 +92,7 @@ ngx_http_headers_filter(ngx_http_request { size_t len; ngx_uint_t i; - ngx_table_elt_t *expires, *cc, **ccp; + ngx_table_elt_t *expires, *cc, **ccp, *h, *out; ngx_http_headers_conf_t *conf; if ((r->headers_out.status != NGX_HTTP_OK @@ -117,7 +130,8 @@ ngx_http_headers_filter(ngx_http_request if (ccp == NULL) { if (ngx_array_init(&r->headers_out.cache_control, r->pool, - 1, sizeof(ngx_table_elt_t *)) != NGX_OK) + 1, sizeof(ngx_table_elt_t *)) + != NGX_OK) { return NGX_ERROR; } @@ -188,6 +202,50 @@ ngx_http_headers_filter(ngx_http_request } } + if (conf->cache_control.len) { + + ccp = r->headers_out.cache_control.elts; + + if (ccp == NULL) { + + if (ngx_array_init(&r->headers_out.cache_control, r->pool, + 1, sizeof(ngx_table_elt_t *)) + != NGX_OK) + { + return NGX_ERROR; + } + } + + ccp = ngx_array_push(&r->headers_out.cache_control); + if (ccp == NULL) { + return NGX_ERROR; + } + + cc = ngx_list_push(&r->headers_out.headers); + if (cc == NULL) { + return NGX_ERROR; + } + + cc->hash = 1; + cc->key.len = sizeof("Cache-Control") - 1; + cc->key.data = (u_char *) "Cache-Control"; + cc->value = conf->cache_control; + + *ccp = cc; + } + + if (conf->headers) { + h = conf->headers->elts; + for (i = 0; i < conf->headers->nelts; i++) { + out = ngx_list_push(&r->headers_out.headers); + if (out == NULL) { + return NGX_ERROR; + } + + *out = h[i]; + } + } + return ngx_http_next_header_filter(r); } @@ -207,11 +265,19 @@ ngx_http_headers_create_conf(ngx_conf_t { ngx_http_headers_conf_t *conf; - conf = ngx_palloc(cf->pool, sizeof(ngx_http_headers_conf_t)); + conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_headers_conf_t)); if (conf == NULL) { return NGX_CONF_ERROR; } + /* + * set by ngx_pcalloc(): + * + * conf->cache_control.len = 0; + * conf->cache_control.data = NULL; + * conf->headers = NULL; + */ + conf->expires = NGX_HTTP_EXPIRES_UNSET; return conf; @@ -229,6 +295,14 @@ ngx_http_headers_merge_conf(ngx_conf_t * NGX_HTTP_EXPIRES_OFF : prev->expires; } + if (conf->cache_control.data == NULL) { + conf->cache_control = prev->cache_control; + } + + if (conf->headers == NULL) { + conf->headers = prev->headers; + } + return NGX_CONF_OK; } @@ -287,3 +361,38 @@ ngx_http_headers_expires(ngx_conf_t *cf, return NGX_CONF_OK; } + + +static char * +ngx_http_headers_add(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_http_headers_conf_t *hcf = conf; + + ngx_str_t *value; + ngx_table_elt_t *h; + + value = cf->args->elts; + + if (ngx_strcasecmp(value[1].data, "cache-control") == 0) { + hcf->cache_control = value[2]; + return NGX_CONF_OK; + } + + if (hcf->headers == NULL) { + hcf->headers = ngx_array_create(cf->pool, 1, sizeof(ngx_table_elt_t)); + if (hcf->headers == NULL) { + return NGX_CONF_ERROR; + } + } + + h = ngx_array_push(hcf->headers); + if (h == NULL) { + return NGX_CONF_ERROR; + } + + h->hash = 1; + h->key = value[1]; + h->value = value[2]; + + return NGX_CONF_OK; +}