Mercurial > hg > nginx
comparison src/http/ngx_http_file_cache.c @ 5881:ee9230cd4bda
Cache: normalization of some Vary headers.
Spaces in Accept-Charset, Accept-Encoding, and Accept-Language headers
are now ignored. As per syntax of these headers spaces can only appear
in places where they are optional.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 27 Oct 2014 21:14:12 +0300 |
parents | 78c49e243848 |
children | f0af7ba616d8 |
comparison
equal
deleted
inserted
replaced
5880:78c49e243848 | 5881:ee9230cd4bda |
---|---|
949 | 949 |
950 static void | 950 static void |
951 ngx_http_file_cache_vary_header(ngx_http_request_t *r, ngx_md5_t *md5, | 951 ngx_http_file_cache_vary_header(ngx_http_request_t *r, ngx_md5_t *md5, |
952 ngx_str_t *name) | 952 ngx_str_t *name) |
953 { | 953 { |
954 ngx_uint_t i; | 954 size_t len; |
955 u_char *p, *start, *last; | |
956 ngx_uint_t i, multiple, normalize; | |
955 ngx_list_part_t *part; | 957 ngx_list_part_t *part; |
956 ngx_table_elt_t *header; | 958 ngx_table_elt_t *header; |
959 | |
960 multiple = 0; | |
961 normalize = 0; | |
962 | |
963 if (name->len == sizeof("Accept-Charset") - 1 | |
964 && ngx_strncasecmp(name->data, (u_char *) "Accept-Charset", | |
965 sizeof("Accept-Charset") - 1) == 0) | |
966 { | |
967 normalize = 1; | |
968 | |
969 } else if (name->len == sizeof("Accept-Encoding") - 1 | |
970 && ngx_strncasecmp(name->data, (u_char *) "Accept-Encoding", | |
971 sizeof("Accept-Encoding") - 1) == 0) | |
972 { | |
973 normalize = 1; | |
974 | |
975 } else if (name->len == sizeof("Accept-Language") - 1 | |
976 && ngx_strncasecmp(name->data, (u_char *) "Accept-Language", | |
977 sizeof("Accept-Language") - 1) == 0) | |
978 { | |
979 normalize = 1; | |
980 } | |
957 | 981 |
958 part = &r->headers_in.headers.part; | 982 part = &r->headers_in.headers.part; |
959 header = part->elts; | 983 header = part->elts; |
960 | 984 |
961 for (i = 0; /* void */ ; i++) { | 985 for (i = 0; /* void */ ; i++) { |
980 | 1004 |
981 if (ngx_strncasecmp(header[i].key.data, name->data, name->len) != 0) { | 1005 if (ngx_strncasecmp(header[i].key.data, name->data, name->len) != 0) { |
982 continue; | 1006 continue; |
983 } | 1007 } |
984 | 1008 |
985 ngx_md5_update(md5, header[i].value.data, header[i].value.len); | 1009 if (!normalize) { |
1010 | |
1011 if (multiple) { | |
1012 ngx_md5_update(md5, (u_char *) ",", sizeof(",") - 1); | |
1013 } | |
1014 | |
1015 ngx_md5_update(md5, header[i].value.data, header[i].value.len); | |
1016 | |
1017 multiple = 1; | |
1018 | |
1019 continue; | |
1020 } | |
1021 | |
1022 /* normalize spaces */ | |
1023 | |
1024 p = header[i].value.data; | |
1025 start = p; | |
1026 last = p + header[i].value.len; | |
1027 | |
1028 while (p < last) { | |
1029 | |
1030 while (p < last && (*p == ' ' || *p == ',')) { p++; } | |
1031 | |
1032 start = p; | |
1033 | |
1034 while (p < last && *p != ',' && *p != ' ') { p++; } | |
1035 | |
1036 len = p - start; | |
1037 | |
1038 if (len == 0) { | |
1039 break; | |
1040 } | |
1041 | |
1042 if (multiple) { | |
1043 ngx_md5_update(md5, (u_char *) ",", sizeof(",") - 1); | |
1044 } | |
1045 | |
1046 ngx_md5_update(md5, start, len); | |
1047 | |
1048 multiple = 1; | |
1049 } | |
986 } | 1050 } |
987 } | 1051 } |
988 | 1052 |
989 | 1053 |
990 static ngx_int_t | 1054 static ngx_int_t |