Changeset 5734:af229f8cf987 in nginx


Ignore:
Timestamp:
06/25/14 22:21:20 (6 years ago)
Author:
Maxim Dounin <mdounin@…>
Branch:
default
Phase:
public
Message:

Entity tags: weak comparison for If-None-Match.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/http/modules/ngx_http_not_modified_filter_module.c

    r5729 r5734  
    1414static ngx_uint_t ngx_http_test_if_modified(ngx_http_request_t *r);
    1515static ngx_uint_t ngx_http_test_if_match(ngx_http_request_t *r,
    16     ngx_table_elt_t *header);
     16    ngx_table_elt_t *header, ngx_uint_t weak);
    1717static ngx_int_t ngx_http_not_modified_filter_init(ngx_conf_t *cf);
    1818
     
    7070
    7171    if (r->headers_in.if_match
    72         && !ngx_http_test_if_match(r, r->headers_in.if_match))
     72        && !ngx_http_test_if_match(r, r->headers_in.if_match, 0))
    7373    {
    7474        return ngx_http_filter_finalize_request(r, NULL,
     
    8585
    8686        if (r->headers_in.if_none_match
    87             && !ngx_http_test_if_match(r, r->headers_in.if_none_match))
     87            && !ngx_http_test_if_match(r, r->headers_in.if_none_match, 1))
    8888        {
    8989            return ngx_http_next_header_filter(r);
     
    162162
    163163static ngx_uint_t
    164 ngx_http_test_if_match(ngx_http_request_t *r, ngx_table_elt_t *header)
     164ngx_http_test_if_match(ngx_http_request_t *r, ngx_table_elt_t *header,
     165    ngx_uint_t weak)
    165166{
    166167    u_char     *start, *end, ch;
    167     ngx_str_t  *etag, *list;
     168    ngx_str_t   etag, *list;
    168169
    169170    list = &header->value;
     
    177178    }
    178179
    179     etag = &r->headers_out.etag->value;
     180    etag = r->headers_out.etag->value;
    180181
    181182    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
    182                    "http im:\"%V\" etag:%V", list, etag);
     183                   "http im:\"%V\" etag:%V", list, &etag);
     184
     185    if (weak
     186        && etag.len > 2
     187        && etag.data[0] == 'W'
     188        && etag.data[1] == '/')
     189    {
     190        etag.len -= 2;
     191        etag.data += 2;
     192    }
    183193
    184194    start = list->data;
     
    187197    while (start < end) {
    188198
    189         if (etag->len > (size_t) (end - start)) {
     199        if (weak
     200            && end - start > 2
     201            && start[0] == 'W'
     202            && start[1] == '/')
     203        {
     204            start += 2;
     205        }
     206
     207        if (etag.len > (size_t) (end - start)) {
    190208            return 0;
    191209        }
    192210
    193         if (ngx_strncmp(start, etag->data, etag->len) != 0) {
     211        if (ngx_strncmp(start, etag.data, etag.len) != 0) {
    194212            goto skip;
    195213        }
    196214
    197         start += etag->len;
     215        start += etag.len;
    198216
    199217        while (start < end) {
Note: See TracChangeset for help on using the changeset viewer.