Mercurial > hg > nginx-quic
comparison src/http/ngx_http_variables.c @ 5083:a805dc9c85cd
Fixed separator in $sent_http_cache_control.
In case multiple "Cache-Control" headers are sent to a client,
multiple values in $sent_http_cache_control were incorrectly
split by a semicolon. Now they are split by a comma.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Wed, 27 Feb 2013 13:22:20 +0000 |
parents | 7fa7e60a7f66 |
children | f7fe817c92a2 |
comparison
equal
deleted
inserted
replaced
5082:42a888fdad0b | 5083:a805dc9c85cd |
---|---|
19 ngx_http_variable_value_t *v, uintptr_t data); | 19 ngx_http_variable_value_t *v, uintptr_t data); |
20 static void ngx_http_variable_request_set_size(ngx_http_request_t *r, | 20 static void ngx_http_variable_request_set_size(ngx_http_request_t *r, |
21 ngx_http_variable_value_t *v, uintptr_t data); | 21 ngx_http_variable_value_t *v, uintptr_t data); |
22 static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r, | 22 static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r, |
23 ngx_http_variable_value_t *v, uintptr_t data); | 23 ngx_http_variable_value_t *v, uintptr_t data); |
24 | |
25 static ngx_int_t ngx_http_variable_cookies(ngx_http_request_t *r, | |
26 ngx_http_variable_value_t *v, uintptr_t data); | |
24 static ngx_int_t ngx_http_variable_headers(ngx_http_request_t *r, | 27 static ngx_int_t ngx_http_variable_headers(ngx_http_request_t *r, |
25 ngx_http_variable_value_t *v, uintptr_t data); | 28 ngx_http_variable_value_t *v, uintptr_t data); |
29 static ngx_int_t ngx_http_variable_headers_internal(ngx_http_request_t *r, | |
30 ngx_http_variable_value_t *v, uintptr_t data, u_char sep); | |
26 | 31 |
27 static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r, | 32 static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r, |
28 ngx_http_variable_value_t *v, uintptr_t data); | 33 ngx_http_variable_value_t *v, uintptr_t data); |
29 static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r, | 34 static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r, |
30 ngx_http_variable_value_t *v, uintptr_t data); | 35 ngx_http_variable_value_t *v, uintptr_t data); |
158 #if (NGX_HTTP_X_FORWARDED_FOR) | 163 #if (NGX_HTTP_X_FORWARDED_FOR) |
159 { ngx_string("http_x_forwarded_for"), NULL, ngx_http_variable_header, | 164 { ngx_string("http_x_forwarded_for"), NULL, ngx_http_variable_header, |
160 offsetof(ngx_http_request_t, headers_in.x_forwarded_for), 0, 0 }, | 165 offsetof(ngx_http_request_t, headers_in.x_forwarded_for), 0, 0 }, |
161 #endif | 166 #endif |
162 | 167 |
163 { ngx_string("http_cookie"), NULL, ngx_http_variable_headers, | 168 { ngx_string("http_cookie"), NULL, ngx_http_variable_cookies, |
164 offsetof(ngx_http_request_t, headers_in.cookies), 0, 0 }, | 169 offsetof(ngx_http_request_t, headers_in.cookies), 0, 0 }, |
165 | 170 |
166 { ngx_string("content_length"), NULL, ngx_http_variable_content_length, | 171 { ngx_string("content_length"), NULL, ngx_http_variable_content_length, |
167 0, 0, 0 }, | 172 0, 0, 0 }, |
168 | 173 |
724 return NGX_OK; | 729 return NGX_OK; |
725 } | 730 } |
726 | 731 |
727 | 732 |
728 static ngx_int_t | 733 static ngx_int_t |
729 ngx_http_variable_headers(ngx_http_request_t *r, ngx_http_variable_value_t *v, | 734 ngx_http_variable_cookies(ngx_http_request_t *r, |
730 uintptr_t data) | 735 ngx_http_variable_value_t *v, uintptr_t data) |
736 { | |
737 return ngx_http_variable_headers_internal(r, v, data, ';'); | |
738 } | |
739 | |
740 | |
741 static ngx_int_t | |
742 ngx_http_variable_headers(ngx_http_request_t *r, | |
743 ngx_http_variable_value_t *v, uintptr_t data) | |
744 { | |
745 return ngx_http_variable_headers_internal(r, v, data, ','); | |
746 } | |
747 | |
748 | |
749 static ngx_int_t | |
750 ngx_http_variable_headers_internal(ngx_http_request_t *r, | |
751 ngx_http_variable_value_t *v, uintptr_t data, u_char sep) | |
731 { | 752 { |
732 size_t len; | 753 size_t len; |
733 u_char *p, *end; | 754 u_char *p, *end; |
734 ngx_uint_t i, n; | 755 ngx_uint_t i, n; |
735 ngx_array_t *a; | 756 ngx_array_t *a; |
746 | 767 |
747 if (h[i]->hash == 0) { | 768 if (h[i]->hash == 0) { |
748 continue; | 769 continue; |
749 } | 770 } |
750 | 771 |
751 len += h[i]->value.len + sizeof("; ") - 1; | 772 len += h[i]->value.len + 2; |
752 } | 773 } |
753 | 774 |
754 if (len == 0) { | 775 if (len == 0) { |
755 v->not_found = 1; | 776 v->not_found = 1; |
756 return NGX_OK; | 777 return NGX_OK; |
757 } | 778 } |
758 | 779 |
759 len -= sizeof("; ") - 1; | 780 len -= 2; |
760 | 781 |
761 v->valid = 1; | 782 v->valid = 1; |
762 v->no_cacheable = 0; | 783 v->no_cacheable = 0; |
763 v->not_found = 0; | 784 v->not_found = 0; |
764 | 785 |
789 | 810 |
790 if (p == end) { | 811 if (p == end) { |
791 break; | 812 break; |
792 } | 813 } |
793 | 814 |
794 *p++ = ';'; *p++ = ' '; | 815 *p++ = sep; *p++ = ' '; |
795 } | 816 } |
796 | 817 |
797 return NGX_OK; | 818 return NGX_OK; |
798 } | 819 } |
799 | 820 |