Mercurial > hg > nginx
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, |