mirror of
https://github.com/nginx/nginx.git
synced 2024-12-03 04:39:00 +08:00
Copy regex unnamed captures to cloned subrequests.
Previously, unnamed regex captures matched in the parent request, were not available in a cloned subrequest. Now 3 fields related to unnamed captures are copied to a cloned subrequest: r->ncaptures, r->captures and r->captures_data. Since r->captures cannot be changed by either request after creating a clone, a new flag r->realloc_captures is introduced to force reallocation of r->captures. The issue was reported as a proxy_cache_background_update misbehavior in http://mailman.nginx.org/pipermail/nginx/2018-December/057251.html.
This commit is contained in:
parent
7b7f7c1458
commit
746fba0d79
@ -2386,6 +2386,14 @@ ngx_http_subrequest(ngx_http_request_t *r,
|
|||||||
sr->phase_handler = r->phase_handler;
|
sr->phase_handler = r->phase_handler;
|
||||||
sr->write_event_handler = ngx_http_core_run_phases;
|
sr->write_event_handler = ngx_http_core_run_phases;
|
||||||
|
|
||||||
|
#if (NGX_PCRE)
|
||||||
|
sr->ncaptures = r->ncaptures;
|
||||||
|
sr->captures = r->captures;
|
||||||
|
sr->captures_data = r->captures_data;
|
||||||
|
sr->realloc_captures = 1;
|
||||||
|
r->realloc_captures = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
ngx_http_update_location_config(sr);
|
ngx_http_update_location_config(sr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -499,6 +499,10 @@ struct ngx_http_request_s {
|
|||||||
unsigned gzip_vary:1;
|
unsigned gzip_vary:1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if (NGX_PCRE)
|
||||||
|
unsigned realloc_captures:1;
|
||||||
|
#endif
|
||||||
|
|
||||||
unsigned proxy:1;
|
unsigned proxy:1;
|
||||||
unsigned bypass_cache:1;
|
unsigned bypass_cache:1;
|
||||||
unsigned no_cache:1;
|
unsigned no_cache:1;
|
||||||
|
@ -2504,7 +2504,9 @@ ngx_http_regex_exec(ngx_http_request_t *r, ngx_http_regex_t *re, ngx_str_t *s)
|
|||||||
if (re->ncaptures) {
|
if (re->ncaptures) {
|
||||||
len = cmcf->ncaptures;
|
len = cmcf->ncaptures;
|
||||||
|
|
||||||
if (r->captures == NULL) {
|
if (r->captures == NULL || r->realloc_captures) {
|
||||||
|
r->realloc_captures = 0;
|
||||||
|
|
||||||
r->captures = ngx_palloc(r->pool, len * sizeof(int));
|
r->captures = ngx_palloc(r->pool, len * sizeof(int));
|
||||||
if (r->captures == NULL) {
|
if (r->captures == NULL) {
|
||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
|
Loading…
Reference in New Issue
Block a user