comparison src/http/ngx_http_variables.c @ 7034:1b068a4e82d8

Added support for trailers in HTTP responses. Example: ngx_table_elt_t *h; h = ngx_list_push(&r->headers_out.trailers); if (h == NULL) { return NGX_ERROR; } ngx_str_set(&h->key, "Fun"); ngx_str_set(&h->value, "with trailers"); h->hash = ngx_hash_key_lc(h->key.data, h->key.len); The code above adds "Fun: with trailers" trailer to the response. Modules that want to emit trailers must set r->expect_trailers = 1 in header filter, otherwise they might not be emitted for HTTP/1.1 responses that aren't already chunked. This change also adds $sent_trailer_* variables. Signed-off-by: Piotr Sikora <piotrsikora@google.com>
author Piotr Sikora <piotrsikora@google.com>
date Fri, 24 Mar 2017 03:37:34 -0700
parents d2b2ff157da5
children 7f480434c7f2
comparison
equal deleted inserted replaced
7033:ab5117642647 7034:1b068a4e82d8
35 ngx_http_variable_value_t *v, uintptr_t data, u_char sep); 35 ngx_http_variable_value_t *v, uintptr_t data, u_char sep);
36 36
37 static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r, 37 static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r,
38 ngx_http_variable_value_t *v, uintptr_t data); 38 ngx_http_variable_value_t *v, uintptr_t data);
39 static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r, 39 static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r,
40 ngx_http_variable_value_t *v, uintptr_t data);
41 static ngx_int_t ngx_http_variable_unknown_trailer_out(ngx_http_request_t *r,
40 ngx_http_variable_value_t *v, uintptr_t data); 42 ngx_http_variable_value_t *v, uintptr_t data);
41 static ngx_int_t ngx_http_variable_request_line(ngx_http_request_t *r, 43 static ngx_int_t ngx_http_variable_request_line(ngx_http_request_t *r,
42 ngx_http_variable_value_t *v, uintptr_t data); 44 ngx_http_variable_value_t *v, uintptr_t data);
43 static ngx_int_t ngx_http_variable_cookie(ngx_http_request_t *r, 45 static ngx_int_t ngx_http_variable_cookie(ngx_http_request_t *r,
44 ngx_http_variable_value_t *v, uintptr_t data); 46 ngx_http_variable_value_t *v, uintptr_t data);
363 0, NGX_HTTP_VAR_PREFIX, 0 }, 365 0, NGX_HTTP_VAR_PREFIX, 0 },
364 366
365 { ngx_string("sent_http_"), NULL, ngx_http_variable_unknown_header_out, 367 { ngx_string("sent_http_"), NULL, ngx_http_variable_unknown_header_out,
366 0, NGX_HTTP_VAR_PREFIX, 0 }, 368 0, NGX_HTTP_VAR_PREFIX, 0 },
367 369
370 { ngx_string("sent_trailer_"), NULL, ngx_http_variable_unknown_trailer_out,
371 0, NGX_HTTP_VAR_PREFIX, 0 },
372
368 { ngx_string("cookie_"), NULL, ngx_http_variable_cookie, 373 { ngx_string("cookie_"), NULL, ngx_http_variable_cookie,
369 0, NGX_HTTP_VAR_PREFIX, 0 }, 374 0, NGX_HTTP_VAR_PREFIX, 0 },
370 375
371 { ngx_string("arg_"), NULL, ngx_http_variable_argument, 376 { ngx_string("arg_"), NULL, ngx_http_variable_argument,
372 0, NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_PREFIX, 0 }, 377 0, NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_PREFIX, 0 },
929 ngx_http_variable_value_t *v, uintptr_t data) 934 ngx_http_variable_value_t *v, uintptr_t data)
930 { 935 {
931 return ngx_http_variable_unknown_header(v, (ngx_str_t *) data, 936 return ngx_http_variable_unknown_header(v, (ngx_str_t *) data,
932 &r->headers_out.headers.part, 937 &r->headers_out.headers.part,
933 sizeof("sent_http_") - 1); 938 sizeof("sent_http_") - 1);
939 }
940
941
942 static ngx_int_t
943 ngx_http_variable_unknown_trailer_out(ngx_http_request_t *r,
944 ngx_http_variable_value_t *v, uintptr_t data)
945 {
946 return ngx_http_variable_unknown_header(v, (ngx_str_t *) data,
947 &r->headers_out.trailers.part,
948 sizeof("sent_trailer_") - 1);
934 } 949 }
935 950
936 951
937 ngx_int_t 952 ngx_int_t
938 ngx_http_variable_unknown_header(ngx_http_variable_value_t *v, ngx_str_t *var, 953 ngx_http_variable_unknown_header(ngx_http_variable_value_t *v, ngx_str_t *var,