# HG changeset patch # User Ruslan Ermilov # Date 1518072858 -10800 # Node ID 6ba68ad8b24c44f50d89bb9352321d4fe9cae930 # Parent 573f2011616352a0d08eb7c4b7e322eb1dbf2425 Basic support of the Link response header. diff --git a/src/http/modules/ngx_http_headers_filter_module.c b/src/http/modules/ngx_http_headers_filter_module.c --- a/src/http/modules/ngx_http_headers_filter_module.c +++ b/src/http/modules/ngx_http_headers_filter_module.c @@ -56,7 +56,7 @@ static ngx_int_t ngx_http_set_expires(ng ngx_http_headers_conf_t *conf); static ngx_int_t ngx_http_parse_expires(ngx_str_t *value, ngx_http_expires_t *expires, time_t *expires_time, char **err); -static ngx_int_t ngx_http_add_cache_control(ngx_http_request_t *r, +static ngx_int_t ngx_http_add_multi_header_lines(ngx_http_request_t *r, ngx_http_header_val_t *hv, ngx_str_t *value); static ngx_int_t ngx_http_add_header(ngx_http_request_t *r, ngx_http_header_val_t *hv, ngx_str_t *value); @@ -77,7 +77,13 @@ static char *ngx_http_headers_add(ngx_co static ngx_http_set_header_t ngx_http_set_headers[] = { - { ngx_string("Cache-Control"), 0, ngx_http_add_cache_control }, + { ngx_string("Cache-Control"), + offsetof(ngx_http_headers_out_t, cache_control), + ngx_http_add_multi_header_lines }, + + { ngx_string("Link"), + offsetof(ngx_http_headers_out_t, link), + ngx_http_add_multi_header_lines }, { ngx_string("Last-Modified"), offsetof(ngx_http_headers_out_t, last_modified), @@ -555,42 +561,40 @@ ngx_http_add_header(ngx_http_request_t * static ngx_int_t -ngx_http_add_cache_control(ngx_http_request_t *r, ngx_http_header_val_t *hv, - ngx_str_t *value) +ngx_http_add_multi_header_lines(ngx_http_request_t *r, + ngx_http_header_val_t *hv, ngx_str_t *value) { - ngx_table_elt_t *cc, **ccp; + ngx_array_t *pa; + ngx_table_elt_t *h, **ph; if (value->len == 0) { return NGX_OK; } - ccp = r->headers_out.cache_control.elts; - - if (ccp == NULL) { + pa = (ngx_array_t *) ((char *) &r->headers_out + hv->offset); - if (ngx_array_init(&r->headers_out.cache_control, r->pool, - 1, sizeof(ngx_table_elt_t *)) - != NGX_OK) + if (pa->elts == NULL) { + if (ngx_array_init(pa, r->pool, 1, sizeof(ngx_table_elt_t *)) != NGX_OK) { return NGX_ERROR; } } - cc = ngx_list_push(&r->headers_out.headers); - if (cc == NULL) { + h = ngx_list_push(&r->headers_out.headers); + if (h == NULL) { return NGX_ERROR; } - cc->hash = 1; - ngx_str_set(&cc->key, "Cache-Control"); - cc->value = *value; + h->hash = 1; + h->key = hv->key; + h->value = *value; - ccp = ngx_array_push(&r->headers_out.cache_control); - if (ccp == NULL) { + ph = ngx_array_push(pa); + if (ph == NULL) { return NGX_ERROR; } - *ccp = cc; + *ph = h; return NGX_OK; } diff --git a/src/http/ngx_http_request.h b/src/http/ngx_http_request.h --- a/src/http/ngx_http_request.h +++ b/src/http/ngx_http_request.h @@ -279,6 +279,7 @@ typedef struct { ngx_uint_t content_type_hash; ngx_array_t cache_control; + ngx_array_t link; off_t content_length_n; off_t content_offset; diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c --- a/src/http/ngx_http_upstream.c +++ b/src/http/ngx_http_upstream.c @@ -284,6 +284,11 @@ static ngx_http_upstream_header_t ngx_h ngx_http_upstream_process_vary, 0, ngx_http_upstream_copy_header_line, 0, 0 }, + { ngx_string("Link"), + ngx_http_upstream_ignore_header_line, 0, + ngx_http_upstream_copy_multi_header_lines, + offsetof(ngx_http_headers_out_t, link), 0 }, + { ngx_string("X-Accel-Expires"), ngx_http_upstream_process_accel_expires, 0, ngx_http_upstream_copy_header_line, 0, 0 }, diff --git a/src/http/ngx_http_variables.c b/src/http/ngx_http_variables.c --- a/src/http/ngx_http_variables.c +++ b/src/http/ngx_http_variables.c @@ -318,6 +318,9 @@ static ngx_http_variable_t ngx_http_cor { ngx_string("sent_http_cache_control"), NULL, ngx_http_variable_headers, offsetof(ngx_http_request_t, headers_out.cache_control), 0, 0 }, + { ngx_string("sent_http_link"), NULL, ngx_http_variable_headers, + offsetof(ngx_http_request_t, headers_out.link), 0, 0 }, + { ngx_string("limit_rate"), ngx_http_variable_request_set_size, ngx_http_variable_request_get_size, offsetof(ngx_http_request_t, limit_rate),