Back to home page

Nginx displayed by LXR

Source navigation ]
Diff markup ]
Identifier search ]
general search ]
 
 
Version: nginx-1.13.12 ]​[ nginx-1.12.2 ]​

0001 
0002 /*
0003  * Copyright (C) Igor Sysoev
0004  * Copyright (C) Nginx, Inc.
0005  */
0006 
0007 
0008 #ifndef _NGX_HTTP_CORE_H_INCLUDED_
0009 #define _NGX_HTTP_CORE_H_INCLUDED_
0010 
0011 
0012 #include <ngx_config.h>
0013 #include <ngx_core.h>
0014 #include <ngx_http.h>
0015 
0016 #if (NGX_THREADS)
0017 #include <ngx_thread_pool.h>
0018 #elif (NGX_COMPAT)
0019 typedef struct ngx_thread_pool_s  ngx_thread_pool_t;
0020 #endif
0021 
0022 
0023 #define NGX_HTTP_GZIP_PROXIED_OFF       0x0002
0024 #define NGX_HTTP_GZIP_PROXIED_EXPIRED   0x0004
0025 #define NGX_HTTP_GZIP_PROXIED_NO_CACHE  0x0008
0026 #define NGX_HTTP_GZIP_PROXIED_NO_STORE  0x0010
0027 #define NGX_HTTP_GZIP_PROXIED_PRIVATE   0x0020
0028 #define NGX_HTTP_GZIP_PROXIED_NO_LM     0x0040
0029 #define NGX_HTTP_GZIP_PROXIED_NO_ETAG   0x0080
0030 #define NGX_HTTP_GZIP_PROXIED_AUTH      0x0100
0031 #define NGX_HTTP_GZIP_PROXIED_ANY       0x0200
0032 
0033 
0034 #define NGX_HTTP_AIO_OFF                0
0035 #define NGX_HTTP_AIO_ON                 1
0036 #define NGX_HTTP_AIO_THREADS            2
0037 
0038 
0039 #define NGX_HTTP_SATISFY_ALL            0
0040 #define NGX_HTTP_SATISFY_ANY            1
0041 
0042 
0043 #define NGX_HTTP_LINGERING_OFF          0
0044 #define NGX_HTTP_LINGERING_ON           1
0045 #define NGX_HTTP_LINGERING_ALWAYS       2
0046 
0047 
0048 #define NGX_HTTP_IMS_OFF                0
0049 #define NGX_HTTP_IMS_EXACT              1
0050 #define NGX_HTTP_IMS_BEFORE             2
0051 
0052 
0053 #define NGX_HTTP_KEEPALIVE_DISABLE_NONE    0x0002
0054 #define NGX_HTTP_KEEPALIVE_DISABLE_MSIE6   0x0004
0055 #define NGX_HTTP_KEEPALIVE_DISABLE_SAFARI  0x0008
0056 
0057 
0058 #define NGX_HTTP_SERVER_TOKENS_OFF      0
0059 #define NGX_HTTP_SERVER_TOKENS_ON       1
0060 #define NGX_HTTP_SERVER_TOKENS_BUILD    2
0061 
0062 
0063 typedef struct ngx_http_location_tree_node_s  ngx_http_location_tree_node_t;
0064 typedef struct ngx_http_core_loc_conf_s  ngx_http_core_loc_conf_t;
0065 
0066 
0067 typedef struct {
0068     ngx_sockaddr_t             sockaddr;
0069     socklen_t                  socklen;
0070 
0071     unsigned                   set:1;
0072     unsigned                   default_server:1;
0073     unsigned                   bind:1;
0074     unsigned                   wildcard:1;
0075     unsigned                   ssl:1;
0076     unsigned                   http2:1;
0077 #if (NGX_HAVE_INET6)
0078     unsigned                   ipv6only:1;
0079 #endif
0080     unsigned                   deferred_accept:1;
0081     unsigned                   reuseport:1;
0082     unsigned                   so_keepalive:2;
0083     unsigned                   proxy_protocol:1;
0084 
0085     int                        backlog;
0086     int                        rcvbuf;
0087     int                        sndbuf;
0088 #if (NGX_HAVE_SETFIB)
0089     int                        setfib;
0090 #endif
0091 #if (NGX_HAVE_TCP_FASTOPEN)
0092     int                        fastopen;
0093 #endif
0094 #if (NGX_HAVE_KEEPALIVE_TUNABLE)
0095     int                        tcp_keepidle;
0096     int                        tcp_keepintvl;
0097     int                        tcp_keepcnt;
0098 #endif
0099 
0100 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
0101     char                      *accept_filter;
0102 #endif
0103 
0104     u_char                     addr[NGX_SOCKADDR_STRLEN + 1];
0105 } ngx_http_listen_opt_t;
0106 
0107 
0108 typedef enum {
0109     NGX_HTTP_POST_READ_PHASE = 0,
0110 
0111     NGX_HTTP_SERVER_REWRITE_PHASE,
0112 
0113     NGX_HTTP_FIND_CONFIG_PHASE,
0114     NGX_HTTP_REWRITE_PHASE,
0115     NGX_HTTP_POST_REWRITE_PHASE,
0116 
0117     NGX_HTTP_PREACCESS_PHASE,
0118 
0119     NGX_HTTP_ACCESS_PHASE,
0120     NGX_HTTP_POST_ACCESS_PHASE,
0121 
0122     NGX_HTTP_TRY_FILES_PHASE,
0123     NGX_HTTP_CONTENT_PHASE,
0124 
0125     NGX_HTTP_LOG_PHASE
0126 } ngx_http_phases;
0127 
0128 typedef struct ngx_http_phase_handler_s  ngx_http_phase_handler_t;
0129 
0130 typedef ngx_int_t (*ngx_http_phase_handler_pt)(ngx_http_request_t *r,
0131     ngx_http_phase_handler_t *ph);
0132 
0133 struct ngx_http_phase_handler_s {
0134     ngx_http_phase_handler_pt  checker;
0135     ngx_http_handler_pt        handler;
0136     ngx_uint_t                 next;
0137 };
0138 
0139 
0140 typedef struct {
0141     ngx_http_phase_handler_t  *handlers;
0142     ngx_uint_t                 server_rewrite_index;
0143     ngx_uint_t                 location_rewrite_index;
0144 } ngx_http_phase_engine_t;
0145 
0146 
0147 typedef struct {
0148     ngx_array_t                handlers;
0149 } ngx_http_phase_t;
0150 
0151 
0152 typedef struct {
0153     ngx_array_t                servers;         /* ngx_http_core_srv_conf_t */
0154 
0155     ngx_http_phase_engine_t    phase_engine;
0156 
0157     ngx_hash_t                 headers_in_hash;
0158 
0159     ngx_hash_t                 variables_hash;
0160 
0161     ngx_array_t                variables;         /* ngx_http_variable_t */
0162     ngx_array_t                prefix_variables;  /* ngx_http_variable_t */
0163     ngx_uint_t                 ncaptures;
0164 
0165     ngx_uint_t                 server_names_hash_max_size;
0166     ngx_uint_t                 server_names_hash_bucket_size;
0167 
0168     ngx_uint_t                 variables_hash_max_size;
0169     ngx_uint_t                 variables_hash_bucket_size;
0170 
0171     ngx_hash_keys_arrays_t    *variables_keys;
0172 
0173     ngx_array_t               *ports;
0174 
0175     ngx_uint_t                 try_files;       /* unsigned  try_files:1 */
0176 
0177     ngx_http_phase_t           phases[NGX_HTTP_LOG_PHASE + 1];
0178 } ngx_http_core_main_conf_t;
0179 
0180 
0181 typedef struct {
0182     /* array of the ngx_http_server_name_t, "server_name" directive */
0183     ngx_array_t                 server_names;
0184 
0185     /* server ctx */
0186     ngx_http_conf_ctx_t        *ctx;
0187 
0188     ngx_str_t                   server_name;
0189 
0190     size_t                      connection_pool_size;
0191     size_t                      request_pool_size;
0192     size_t                      client_header_buffer_size;
0193 
0194     ngx_bufs_t                  large_client_header_buffers;
0195 
0196     ngx_msec_t                  client_header_timeout;
0197 
0198     ngx_flag_t                  ignore_invalid_headers;
0199     ngx_flag_t                  merge_slashes;
0200     ngx_flag_t                  underscores_in_headers;
0201 
0202     unsigned                    listen:1;
0203 #if (NGX_PCRE)
0204     unsigned                    captures:1;
0205 #endif
0206 
0207     ngx_http_core_loc_conf_t  **named_locations;
0208 } ngx_http_core_srv_conf_t;
0209 
0210 
0211 /* list of structures to find core_srv_conf quickly at run time */
0212 
0213 
0214 typedef struct {
0215 #if (NGX_PCRE)
0216     ngx_http_regex_t          *regex;
0217 #endif
0218     ngx_http_core_srv_conf_t  *server;   /* virtual name server conf */
0219     ngx_str_t                  name;
0220 } ngx_http_server_name_t;
0221 
0222 
0223 typedef struct {
0224     ngx_hash_combined_t        names;
0225 
0226     ngx_uint_t                 nregex;
0227     ngx_http_server_name_t    *regex;
0228 } ngx_http_virtual_names_t;
0229 
0230 
0231 struct ngx_http_addr_conf_s {
0232     /* the default server configuration for this address:port */
0233     ngx_http_core_srv_conf_t  *default_server;
0234 
0235     ngx_http_virtual_names_t  *virtual_names;
0236 
0237     unsigned                   ssl:1;
0238     unsigned                   http2:1;
0239     unsigned                   proxy_protocol:1;
0240 };
0241 
0242 
0243 typedef struct {
0244     in_addr_t                  addr;
0245     ngx_http_addr_conf_t       conf;
0246 } ngx_http_in_addr_t;
0247 
0248 
0249 #if (NGX_HAVE_INET6)
0250 
0251 typedef struct {
0252     struct in6_addr            addr6;
0253     ngx_http_addr_conf_t       conf;
0254 } ngx_http_in6_addr_t;
0255 
0256 #endif
0257 
0258 
0259 typedef struct {
0260     /* ngx_http_in_addr_t or ngx_http_in6_addr_t */
0261     void                      *addrs;
0262     ngx_uint_t                 naddrs;
0263 } ngx_http_port_t;
0264 
0265 
0266 typedef struct {
0267     ngx_int_t                  family;
0268     in_port_t                  port;
0269     ngx_array_t                addrs;     /* array of ngx_http_conf_addr_t */
0270 } ngx_http_conf_port_t;
0271 
0272 
0273 typedef struct {
0274     ngx_http_listen_opt_t      opt;
0275 
0276     ngx_hash_t                 hash;
0277     ngx_hash_wildcard_t       *wc_head;
0278     ngx_hash_wildcard_t       *wc_tail;
0279 
0280 #if (NGX_PCRE)
0281     ngx_uint_t                 nregex;
0282     ngx_http_server_name_t    *regex;
0283 #endif
0284 
0285     /* the default server configuration for this address:port */
0286     ngx_http_core_srv_conf_t  *default_server;
0287     ngx_array_t                servers;  /* array of ngx_http_core_srv_conf_t */
0288 } ngx_http_conf_addr_t;
0289 
0290 
0291 typedef struct {
0292     ngx_int_t                  status;
0293     ngx_int_t                  overwrite;
0294     ngx_http_complex_value_t   value;
0295     ngx_str_t                  args;
0296 } ngx_http_err_page_t;
0297 
0298 
0299 typedef struct {
0300     ngx_array_t               *lengths;
0301     ngx_array_t               *values;
0302     ngx_str_t                  name;
0303 
0304     unsigned                   code:10;
0305     unsigned                   test_dir:1;
0306 } ngx_http_try_file_t;
0307 
0308 
0309 struct ngx_http_core_loc_conf_s {
0310     ngx_str_t     name;          /* location name */
0311 
0312 #if (NGX_PCRE)
0313     ngx_http_regex_t  *regex;
0314 #endif
0315 
0316     unsigned      noname:1;   /* "if () {}" block or limit_except */
0317     unsigned      lmt_excpt:1;
0318     unsigned      named:1;
0319 
0320     unsigned      exact_match:1;
0321     unsigned      noregex:1;
0322 
0323     unsigned      auto_redirect:1;
0324 #if (NGX_HTTP_GZIP)
0325     unsigned      gzip_disable_msie6:2;
0326     unsigned      gzip_disable_degradation:2;
0327 #endif
0328 
0329     ngx_http_location_tree_node_t   *static_locations;
0330 #if (NGX_PCRE)
0331     ngx_http_core_loc_conf_t       **regex_locations;
0332 #endif
0333 
0334     /* pointer to the modules' loc_conf */
0335     void        **loc_conf;
0336 
0337     uint32_t      limit_except;
0338     void        **limit_except_loc_conf;
0339 
0340     ngx_http_handler_pt  handler;
0341 
0342     /* location name length for inclusive location with inherited alias */
0343     size_t        alias;
0344     ngx_str_t     root;                    /* root, alias */
0345     ngx_str_t     post_action;
0346 
0347     ngx_array_t  *root_lengths;
0348     ngx_array_t  *root_values;
0349 
0350     ngx_array_t  *types;
0351     ngx_hash_t    types_hash;
0352     ngx_str_t     default_type;
0353 
0354     off_t         client_max_body_size;    /* client_max_body_size */
0355     off_t         directio;                /* directio */
0356     off_t         directio_alignment;      /* directio_alignment */
0357 
0358     size_t        client_body_buffer_size; /* client_body_buffer_size */
0359     size_t        send_lowat;              /* send_lowat */
0360     size_t        postpone_output;         /* postpone_output */
0361     size_t        limit_rate;              /* limit_rate */
0362     size_t        limit_rate_after;        /* limit_rate_after */
0363     size_t        sendfile_max_chunk;      /* sendfile_max_chunk */
0364     size_t        read_ahead;              /* read_ahead */
0365 
0366     ngx_msec_t    client_body_timeout;     /* client_body_timeout */
0367     ngx_msec_t    send_timeout;            /* send_timeout */
0368     ngx_msec_t    keepalive_timeout;       /* keepalive_timeout */
0369     ngx_msec_t    lingering_time;          /* lingering_time */
0370     ngx_msec_t    lingering_timeout;       /* lingering_timeout */
0371     ngx_msec_t    resolver_timeout;        /* resolver_timeout */
0372 
0373     ngx_resolver_t  *resolver;             /* resolver */
0374 
0375     time_t        keepalive_header;        /* keepalive_timeout */
0376 
0377     ngx_uint_t    keepalive_requests;      /* keepalive_requests */
0378     ngx_uint_t    keepalive_disable;       /* keepalive_disable */
0379     ngx_uint_t    satisfy;                 /* satisfy */
0380     ngx_uint_t    lingering_close;         /* lingering_close */
0381     ngx_uint_t    if_modified_since;       /* if_modified_since */
0382     ngx_uint_t    max_ranges;              /* max_ranges */
0383     ngx_uint_t    client_body_in_file_only; /* client_body_in_file_only */
0384 
0385     ngx_flag_t    client_body_in_single_buffer;
0386                                            /* client_body_in_singe_buffer */
0387     ngx_flag_t    internal;                /* internal */
0388     ngx_flag_t    sendfile;                /* sendfile */
0389     ngx_flag_t    aio;                     /* aio */
0390     ngx_flag_t    aio_write;               /* aio_write */
0391     ngx_flag_t    tcp_nopush;              /* tcp_nopush */
0392     ngx_flag_t    tcp_nodelay;             /* tcp_nodelay */
0393     ngx_flag_t    reset_timedout_connection; /* reset_timedout_connection */
0394     ngx_flag_t    absolute_redirect;       /* absolute_redirect */
0395     ngx_flag_t    server_name_in_redirect; /* server_name_in_redirect */
0396     ngx_flag_t    port_in_redirect;        /* port_in_redirect */
0397     ngx_flag_t    msie_padding;            /* msie_padding */
0398     ngx_flag_t    msie_refresh;            /* msie_refresh */
0399     ngx_flag_t    log_not_found;           /* log_not_found */
0400     ngx_flag_t    log_subrequest;          /* log_subrequest */
0401     ngx_flag_t    recursive_error_pages;   /* recursive_error_pages */
0402     ngx_uint_t    server_tokens;           /* server_tokens */
0403     ngx_flag_t    chunked_transfer_encoding; /* chunked_transfer_encoding */
0404     ngx_flag_t    etag;                    /* etag */
0405 
0406 #if (NGX_HTTP_GZIP)
0407     ngx_flag_t    gzip_vary;               /* gzip_vary */
0408 
0409     ngx_uint_t    gzip_http_version;       /* gzip_http_version */
0410     ngx_uint_t    gzip_proxied;            /* gzip_proxied */
0411 
0412 #if (NGX_PCRE)
0413     ngx_array_t  *gzip_disable;            /* gzip_disable */
0414 #endif
0415 #endif
0416 
0417 #if (NGX_THREADS || NGX_COMPAT)
0418     ngx_thread_pool_t         *thread_pool;
0419     ngx_http_complex_value_t  *thread_pool_value;
0420 #endif
0421 
0422 #if (NGX_HAVE_OPENAT)
0423     ngx_uint_t    disable_symlinks;        /* disable_symlinks */
0424     ngx_http_complex_value_t  *disable_symlinks_from;
0425 #endif
0426 
0427     ngx_array_t  *error_pages;             /* error_page */
0428     ngx_http_try_file_t    *try_files;     /* try_files */
0429 
0430     ngx_path_t   *client_body_temp_path;   /* client_body_temp_path */
0431 
0432     ngx_open_file_cache_t  *open_file_cache;
0433     time_t        open_file_cache_valid;
0434     ngx_uint_t    open_file_cache_min_uses;
0435     ngx_flag_t    open_file_cache_errors;
0436     ngx_flag_t    open_file_cache_events;
0437 
0438     ngx_log_t    *error_log;
0439 
0440     ngx_uint_t    types_hash_max_size;
0441     ngx_uint_t    types_hash_bucket_size;
0442 
0443     ngx_queue_t  *locations;
0444 
0445 #if 0
0446     ngx_http_core_loc_conf_t  *prev_location;
0447 #endif
0448 };
0449 
0450 
0451 typedef struct {
0452     ngx_queue_t                      queue;
0453     ngx_http_core_loc_conf_t        *exact;
0454     ngx_http_core_loc_conf_t        *inclusive;
0455     ngx_str_t                       *name;
0456     u_char                          *file_name;
0457     ngx_uint_t                       line;
0458     ngx_queue_t                      list;
0459 } ngx_http_location_queue_t;
0460 
0461 
0462 struct ngx_http_location_tree_node_s {
0463     ngx_http_location_tree_node_t   *left;
0464     ngx_http_location_tree_node_t   *right;
0465     ngx_http_location_tree_node_t   *tree;
0466 
0467     ngx_http_core_loc_conf_t        *exact;
0468     ngx_http_core_loc_conf_t        *inclusive;
0469 
0470     u_char                           auto_redirect;
0471     u_char                           len;
0472     u_char                           name[1];
0473 };
0474 
0475 
0476 void ngx_http_core_run_phases(ngx_http_request_t *r);
0477 ngx_int_t ngx_http_core_generic_phase(ngx_http_request_t *r,
0478     ngx_http_phase_handler_t *ph);
0479 ngx_int_t ngx_http_core_rewrite_phase(ngx_http_request_t *r,
0480     ngx_http_phase_handler_t *ph);
0481 ngx_int_t ngx_http_core_find_config_phase(ngx_http_request_t *r,
0482     ngx_http_phase_handler_t *ph);
0483 ngx_int_t ngx_http_core_post_rewrite_phase(ngx_http_request_t *r,
0484     ngx_http_phase_handler_t *ph);
0485 ngx_int_t ngx_http_core_access_phase(ngx_http_request_t *r,
0486     ngx_http_phase_handler_t *ph);
0487 ngx_int_t ngx_http_core_post_access_phase(ngx_http_request_t *r,
0488     ngx_http_phase_handler_t *ph);
0489 ngx_int_t ngx_http_core_try_files_phase(ngx_http_request_t *r,
0490     ngx_http_phase_handler_t *ph);
0491 ngx_int_t ngx_http_core_content_phase(ngx_http_request_t *r,
0492     ngx_http_phase_handler_t *ph);
0493 
0494 
0495 void *ngx_http_test_content_type(ngx_http_request_t *r, ngx_hash_t *types_hash);
0496 ngx_int_t ngx_http_set_content_type(ngx_http_request_t *r);
0497 void ngx_http_set_exten(ngx_http_request_t *r);
0498 ngx_int_t ngx_http_set_etag(ngx_http_request_t *r);
0499 void ngx_http_weak_etag(ngx_http_request_t *r);
0500 ngx_int_t ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,
0501     ngx_str_t *ct, ngx_http_complex_value_t *cv);
0502 u_char *ngx_http_map_uri_to_path(ngx_http_request_t *r, ngx_str_t *name,
0503     size_t *root_length, size_t reserved);
0504 ngx_int_t ngx_http_auth_basic_user(ngx_http_request_t *r);
0505 #if (NGX_HTTP_GZIP)
0506 ngx_int_t ngx_http_gzip_ok(ngx_http_request_t *r);
0507 #endif
0508 
0509 
0510 ngx_int_t ngx_http_subrequest(ngx_http_request_t *r,
0511     ngx_str_t *uri, ngx_str_t *args, ngx_http_request_t **sr,
0512     ngx_http_post_subrequest_t *psr, ngx_uint_t flags);
0513 ngx_int_t ngx_http_internal_redirect(ngx_http_request_t *r,
0514     ngx_str_t *uri, ngx_str_t *args);
0515 ngx_int_t ngx_http_named_location(ngx_http_request_t *r, ngx_str_t *name);
0516 
0517 
0518 ngx_http_cleanup_t *ngx_http_cleanup_add(ngx_http_request_t *r, size_t size);
0519 
0520 
0521 typedef ngx_int_t (*ngx_http_output_header_filter_pt)(ngx_http_request_t *r);
0522 typedef ngx_int_t (*ngx_http_output_body_filter_pt)
0523     (ngx_http_request_t *r, ngx_chain_t *chain);
0524 typedef ngx_int_t (*ngx_http_request_body_filter_pt)
0525     (ngx_http_request_t *r, ngx_chain_t *chain);
0526 
0527 
0528 ngx_int_t ngx_http_output_filter(ngx_http_request_t *r, ngx_chain_t *chain);
0529 ngx_int_t ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *chain);
0530 ngx_int_t ngx_http_request_body_save_filter(ngx_http_request_t *r,
0531     ngx_chain_t *chain);
0532 
0533 
0534 ngx_int_t ngx_http_set_disable_symlinks(ngx_http_request_t *r,
0535     ngx_http_core_loc_conf_t *clcf, ngx_str_t *path, ngx_open_file_info_t *of);
0536 
0537 ngx_int_t ngx_http_get_forwarded_addr(ngx_http_request_t *r, ngx_addr_t *addr,
0538     ngx_array_t *headers, ngx_str_t *value, ngx_array_t *proxies,
0539     int recursive);
0540 
0541 
0542 extern ngx_module_t  ngx_http_core_module;
0543 
0544 extern ngx_uint_t ngx_http_max_module;
0545 
0546 extern ngx_str_t  ngx_http_core_get_method;
0547 
0548 
0549 #define ngx_http_clear_content_length(r)                                      \
0550                                                                               \
0551     r->headers_out.content_length_n = -1;                                     \
0552     if (r->headers_out.content_length) {                                      \
0553         r->headers_out.content_length->hash = 0;                              \
0554         r->headers_out.content_length = NULL;                                 \
0555     }
0556 
0557 #define ngx_http_clear_accept_ranges(r)                                       \
0558                                                                               \
0559     r->allow_ranges = 0;                                                      \
0560     if (r->headers_out.accept_ranges) {                                       \
0561         r->headers_out.accept_ranges->hash = 0;                               \
0562         r->headers_out.accept_ranges = NULL;                                  \
0563     }
0564 
0565 #define ngx_http_clear_last_modified(r)                                       \
0566                                                                               \
0567     r->headers_out.last_modified_time = -1;                                   \
0568     if (r->headers_out.last_modified) {                                       \
0569         r->headers_out.last_modified->hash = 0;                               \
0570         r->headers_out.last_modified = NULL;                                  \
0571     }
0572 
0573 #define ngx_http_clear_location(r)                                            \
0574                                                                               \
0575     if (r->headers_out.location) {                                            \
0576         r->headers_out.location->hash = 0;                                    \
0577         r->headers_out.location = NULL;                                       \
0578     }
0579 
0580 #define ngx_http_clear_etag(r)                                                \
0581                                                                               \
0582     if (r->headers_out.etag) {                                                \
0583         r->headers_out.etag->hash = 0;                                        \
0584         r->headers_out.etag = NULL;                                           \
0585     }
0586 
0587 
0588 #endif /* _NGX_HTTP_CORE_H_INCLUDED_ */