|  |  | 
|  | /* | 
|  | * Copyright (C) Igor Sysoev | 
|  | * Copyright (C) Nginx, Inc. | 
|  | */ | 
|  |  | 
|  |  | 
|  | #ifndef _NGX_HTTP_CACHE_H_INCLUDED_ | 
|  | #define _NGX_HTTP_CACHE_H_INCLUDED_ | 
|  |  | 
|  |  | 
|  | #include <ngx_config.h> | 
|  | #include <ngx_core.h> | 
|  | #include <ngx_http.h> | 
|  |  | 
|  |  | 
|  | #define NGX_HTTP_CACHE_MISS          1 | 
|  | #define NGX_HTTP_CACHE_BYPASS        2 | 
|  | #define NGX_HTTP_CACHE_EXPIRED       3 | 
|  | #define NGX_HTTP_CACHE_STALE         4 | 
|  | #define NGX_HTTP_CACHE_UPDATING      5 | 
|  | #define NGX_HTTP_CACHE_REVALIDATED   6 | 
|  | #define NGX_HTTP_CACHE_HIT           7 | 
|  | #define NGX_HTTP_CACHE_SCARCE        8 | 
|  |  | 
|  | #define NGX_HTTP_CACHE_KEY_LEN       16 | 
|  | #define NGX_HTTP_CACHE_ETAG_LEN      42 | 
|  | #define NGX_HTTP_CACHE_VARY_LEN      42 | 
|  |  | 
|  | #define NGX_HTTP_CACHE_VERSION       3 | 
|  |  | 
|  |  | 
|  | typedef struct { | 
|  | ngx_uint_t                       status; | 
|  | time_t                           valid; | 
|  | } ngx_http_cache_valid_t; | 
|  |  | 
|  |  | 
|  | typedef struct { | 
|  | ngx_rbtree_node_t                node; | 
|  | ngx_queue_t                      queue; | 
|  |  | 
|  | u_char                           key[NGX_HTTP_CACHE_KEY_LEN | 
|  | - sizeof(ngx_rbtree_key_t)]; | 
|  |  | 
|  | unsigned                         count:20; | 
|  | unsigned                         uses:10; | 
|  | unsigned                         valid_msec:10; | 
|  | unsigned                         error:10; | 
|  | unsigned                         exists:1; | 
|  | unsigned                         updating:1; | 
|  | unsigned                         deleting:1; | 
|  | unsigned                         purged:1; | 
|  | /* 10 unused bits */ | 
|  |  | 
|  | ngx_file_uniq_t                  uniq; | 
|  | time_t                           expire; | 
|  | time_t                           valid_sec; | 
|  | size_t                           body_start; | 
|  | off_t                            fs_size; | 
|  | ngx_msec_t                       lock_time; | 
|  | } ngx_http_file_cache_node_t; | 
|  |  | 
|  |  | 
|  | struct ngx_http_cache_s { | 
|  | ngx_file_t                       file; | 
|  | ngx_array_t                      keys; | 
|  | uint32_t                         crc32; | 
|  | u_char                           key[NGX_HTTP_CACHE_KEY_LEN]; | 
|  | u_char                           main[NGX_HTTP_CACHE_KEY_LEN]; | 
|  |  | 
|  | ngx_file_uniq_t                  uniq; | 
|  | time_t                           valid_sec; | 
|  | time_t                           last_modified; | 
|  | time_t                           date; | 
|  |  | 
|  | ngx_str_t                        etag; | 
|  | ngx_str_t                        vary; | 
|  | u_char                           variant[NGX_HTTP_CACHE_KEY_LEN]; | 
|  |  | 
|  | size_t                           header_start; | 
|  | size_t                           body_start; | 
|  | off_t                            length; | 
|  | off_t                            fs_size; | 
|  |  | 
|  | ngx_uint_t                       min_uses; | 
|  | ngx_uint_t                       error; | 
|  | ngx_uint_t                       valid_msec; | 
|  | ngx_uint_t                       vary_tag; | 
|  |  | 
|  | ngx_buf_t                       *buf; | 
|  |  | 
|  | ngx_http_file_cache_t           *file_cache; | 
|  | ngx_http_file_cache_node_t      *node; | 
|  |  | 
|  | #if (NGX_THREADS || NGX_COMPAT) | 
|  | ngx_thread_task_t               *thread_task; | 
|  | #endif | 
|  |  | 
|  | ngx_msec_t                       lock_timeout; | 
|  | ngx_msec_t                       lock_age; | 
|  | ngx_msec_t                       lock_time; | 
|  | ngx_msec_t                       wait_time; | 
|  |  | 
|  | ngx_event_t                      wait_event; | 
|  |  | 
|  | unsigned                         lock:1; | 
|  | unsigned                         waiting:1; | 
|  |  | 
|  | unsigned                         updated:1; | 
|  | unsigned                         updating:1; | 
|  | unsigned                         exists:1; | 
|  | unsigned                         temp_file:1; | 
|  | unsigned                         purged:1; | 
|  | unsigned                         reading:1; | 
|  | unsigned                         secondary:1; | 
|  | }; | 
|  |  | 
|  |  | 
|  | typedef struct { | 
|  | ngx_uint_t                       version; | 
|  | time_t                           valid_sec; | 
|  | time_t                           last_modified; | 
|  | time_t                           date; | 
|  | uint32_t                         crc32; | 
|  | u_short                          valid_msec; | 
|  | u_short                          header_start; | 
|  | u_short                          body_start; | 
|  | u_char                           etag_len; | 
|  | u_char                           etag[NGX_HTTP_CACHE_ETAG_LEN]; | 
|  | u_char                           vary_len; | 
|  | u_char                           vary[NGX_HTTP_CACHE_VARY_LEN]; | 
|  | u_char                           variant[NGX_HTTP_CACHE_KEY_LEN]; | 
|  | } ngx_http_file_cache_header_t; | 
|  |  | 
|  |  | 
|  | typedef struct { | 
|  | ngx_rbtree_t                     rbtree; | 
|  | ngx_rbtree_node_t                sentinel; | 
|  | ngx_queue_t                      queue; | 
|  | ngx_atomic_t                     cold; | 
|  | ngx_atomic_t                     loading; | 
|  | off_t                            size; | 
|  | ngx_uint_t                       count; | 
|  | ngx_uint_t                       watermark; | 
|  | } ngx_http_file_cache_sh_t; | 
|  |  | 
|  |  | 
|  | struct ngx_http_file_cache_s { | 
|  | ngx_http_file_cache_sh_t        *sh; | 
|  | ngx_slab_pool_t                 *shpool; | 
|  |  | 
|  | ngx_path_t                      *path; | 
|  | ngx_path_t                      *temp_path; | 
|  |  | 
|  | off_t                            max_size; | 
|  | size_t                           bsize; | 
|  |  | 
|  | time_t                           inactive; | 
|  |  | 
|  | time_t                           fail_time; | 
|  |  | 
|  | ngx_uint_t                       files; | 
|  | ngx_uint_t                       loader_files; | 
|  | ngx_msec_t                       last; | 
|  | ngx_msec_t                       loader_sleep; | 
|  | ngx_msec_t                       loader_threshold; | 
|  |  | 
|  | ngx_uint_t                       manager_files; | 
|  | ngx_msec_t                       manager_sleep; | 
|  | ngx_msec_t                       manager_threshold; | 
|  |  | 
|  | ngx_shm_zone_t                  *shm_zone; | 
|  | }; | 
|  |  | 
|  |  | 
|  | ngx_int_t ngx_http_file_cache_new(ngx_http_request_t *r); | 
|  | ngx_int_t ngx_http_file_cache_create(ngx_http_request_t *r); | 
|  | void ngx_http_file_cache_create_key(ngx_http_request_t *r); | 
|  | ngx_int_t ngx_http_file_cache_open(ngx_http_request_t *r); | 
|  | ngx_int_t ngx_http_file_cache_set_header(ngx_http_request_t *r, u_char *buf); | 
|  | void ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf); | 
|  | void ngx_http_file_cache_update_header(ngx_http_request_t *r); | 
|  | ngx_int_t ngx_http_cache_send(ngx_http_request_t *); | 
|  | void ngx_http_file_cache_free(ngx_http_cache_t *c, ngx_temp_file_t *tf); | 
|  | time_t ngx_http_file_cache_valid(ngx_array_t *cache_valid, ngx_uint_t status); | 
|  |  | 
|  | char *ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, | 
|  | void *conf); | 
|  | char *ngx_http_file_cache_valid_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, | 
|  | void *conf); | 
|  |  | 
|  |  | 
|  | extern ngx_str_t  ngx_http_cache_status[]; | 
|  |  | 
|  |  | 
|  | #endif /* _NGX_HTTP_CACHE_H_INCLUDED_ */ |