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