Mercurial > hg > nginx
view src/stream/ngx_stream_script.h @ 7702:7015f26aef90
Cache: ignore stale-if-error for 4xx and 5xx codes.
Previously the stale-if-error extension of the Cache-Control upstream header
triggered the return of a stale response for all error conditions that can be
specified in the proxy_cache_use_stale directive. The list of these errors
includes both network/timeout/format errors, as well as some HTTP codes like
503, 504, 403, 429 etc. The latter prevented a cache entry from being updated
by a response with any of these HTTP codes during the stale-if-error period.
Now stale-if-error only works for network/timeout/format errors and ignores
the upstream HTTP code. The return of a stale response for certain HTTP codes
is still possible using the proxy_cache_use_stale directive.
This change also applies to the stale-while-revalidate extension of the
Cache-Control header, which triggers stale-if-error if it is missing.
Reported at
http://mailman.nginx.org/pipermail/nginx/2020-July/059723.html.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Wed, 29 Jul 2020 13:28:04 +0300 |
parents | b82162b8496a |
children | 3ab8e1e2f0f7 |
line wrap: on
line source
/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #ifndef _NGX_STREAM_SCRIPT_H_INCLUDED_ #define _NGX_STREAM_SCRIPT_H_INCLUDED_ #include <ngx_config.h> #include <ngx_core.h> #include <ngx_stream.h> typedef struct { u_char *ip; u_char *pos; ngx_stream_variable_value_t *sp; ngx_str_t buf; ngx_str_t line; unsigned flushed:1; unsigned skip:1; ngx_stream_session_t *session; } ngx_stream_script_engine_t; typedef struct { ngx_conf_t *cf; ngx_str_t *source; ngx_array_t **flushes; ngx_array_t **lengths; ngx_array_t **values; ngx_uint_t variables; ngx_uint_t ncaptures; ngx_uint_t size; void *main; unsigned complete_lengths:1; unsigned complete_values:1; unsigned zero:1; unsigned conf_prefix:1; unsigned root_prefix:1; } ngx_stream_script_compile_t; typedef struct { ngx_str_t value; ngx_uint_t *flushes; void *lengths; void *values; union { size_t size; } u; } ngx_stream_complex_value_t; typedef struct { ngx_conf_t *cf; ngx_str_t *value; ngx_stream_complex_value_t *complex_value; unsigned zero:1; unsigned conf_prefix:1; unsigned root_prefix:1; } ngx_stream_compile_complex_value_t; typedef void (*ngx_stream_script_code_pt) (ngx_stream_script_engine_t *e); typedef size_t (*ngx_stream_script_len_code_pt) (ngx_stream_script_engine_t *e); typedef struct { ngx_stream_script_code_pt code; uintptr_t len; } ngx_stream_script_copy_code_t; typedef struct { ngx_stream_script_code_pt code; uintptr_t index; } ngx_stream_script_var_code_t; typedef struct { ngx_stream_script_code_pt code; uintptr_t n; } ngx_stream_script_copy_capture_code_t; typedef struct { ngx_stream_script_code_pt code; uintptr_t conf_prefix; } ngx_stream_script_full_name_code_t; void ngx_stream_script_flush_complex_value(ngx_stream_session_t *s, ngx_stream_complex_value_t *val); ngx_int_t ngx_stream_complex_value(ngx_stream_session_t *s, ngx_stream_complex_value_t *val, ngx_str_t *value); size_t ngx_stream_complex_value_size(ngx_stream_session_t *s, ngx_stream_complex_value_t *val, size_t default_value); ngx_int_t ngx_stream_compile_complex_value( ngx_stream_compile_complex_value_t *ccv); char *ngx_stream_set_complex_value_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); char *ngx_stream_set_complex_value_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); ngx_uint_t ngx_stream_script_variables_count(ngx_str_t *value); ngx_int_t ngx_stream_script_compile(ngx_stream_script_compile_t *sc); u_char *ngx_stream_script_run(ngx_stream_session_t *s, ngx_str_t *value, void *code_lengths, size_t reserved, void *code_values); void ngx_stream_script_flush_no_cacheable_variables(ngx_stream_session_t *s, ngx_array_t *indices); void *ngx_stream_script_add_code(ngx_array_t *codes, size_t size, void *code); size_t ngx_stream_script_copy_len_code(ngx_stream_script_engine_t *e); void ngx_stream_script_copy_code(ngx_stream_script_engine_t *e); size_t ngx_stream_script_copy_var_len_code(ngx_stream_script_engine_t *e); void ngx_stream_script_copy_var_code(ngx_stream_script_engine_t *e); size_t ngx_stream_script_copy_capture_len_code(ngx_stream_script_engine_t *e); void ngx_stream_script_copy_capture_code(ngx_stream_script_engine_t *e); #endif /* _NGX_STREAM_SCRIPT_H_INCLUDED_ */