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