*) ngx_http_ephemeral *) use preallocated terminal_posted_request
diff --git a/src/http/ngx_http.h b/src/http/ngx_http.h index 9444b11..5519a5b 100644 --- a/src/http/ngx_http.h +++ b/src/http/ngx_http.h
@@ -84,13 +84,17 @@ void ngx_http_update_location_config(ngx_http_request_t *r); void ngx_http_handler(ngx_http_request_t *r); void ngx_http_run_posted_requests(ngx_connection_t *c); -ngx_int_t ngx_http_post_request(ngx_http_request_t *r); +ngx_int_t ngx_http_post_request(ngx_http_request_t *r, + ngx_http_posted_request_t *pr); void ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc); void ngx_http_empty_handler(ngx_event_t *wev); void ngx_http_request_empty_handler(ngx_http_request_t *r); +#define ngx_http_ephemeral(r) (ngx_http_ephemeral_t *) (&r->uri_start) + + #define NGX_HTTP_LAST 1 #define NGX_HTTP_FLUSH 2
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c index b9eb060..cd2d774 100644 --- a/src/http/ngx_http_core_module.c +++ b/src/http/ngx_http_core_module.c
@@ -2139,7 +2139,7 @@ *psr = sr; - return ngx_http_post_request(sr); + return ngx_http_post_request(sr, NULL); }
diff --git a/src/http/ngx_http_postpone_filter_module.c b/src/http/ngx_http_postpone_filter_module.c index 3b1d780..156401b 100644 --- a/src/http/ngx_http_postpone_filter_module.c +++ b/src/http/ngx_http_postpone_filter_module.c
@@ -102,7 +102,7 @@ c->data = pr->request; - return ngx_http_post_request(pr->request); + return ngx_http_post_request(pr->request, NULL); } if (pr->out == NULL) {
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c index 187310b..c897649 100644 --- a/src/http/ngx_http_request.c +++ b/src/http/ngx_http_request.c
@@ -1810,13 +1810,15 @@ ngx_int_t -ngx_http_post_request(ngx_http_request_t *r) +ngx_http_post_request(ngx_http_request_t *r, ngx_http_posted_request_t *pr) { - ngx_http_posted_request_t *pr, **p; + ngx_http_posted_request_t **p; - pr = ngx_palloc(r->pool, sizeof(ngx_http_posted_request_t)); if (pr == NULL) { - return NGX_ERROR; + pr = ngx_palloc(r->pool, sizeof(ngx_http_posted_request_t)); + if (pr == NULL) { + return NGX_ERROR; + } } pr->request = r; @@ -1965,7 +1967,7 @@ } } - if (ngx_http_post_request(pr) != NGX_OK) { + if (ngx_http_post_request(pr, NULL) != NGX_OK) { r->main->count++; ngx_http_terminate_request(r, 0); return; @@ -2025,8 +2027,9 @@ static void ngx_http_terminate_request(ngx_http_request_t *r, ngx_int_t rc) { - ngx_http_cleanup_t *cln; - ngx_http_request_t *mr; + ngx_http_cleanup_t *cln; + ngx_http_request_t *mr; + ngx_http_ephemeral_t *e; mr = r->main; @@ -2054,9 +2057,10 @@ return; } + e = ngx_http_ephemeral(mr); mr->posted_requests = NULL; mr->write_event_handler = ngx_http_terminate_handler; - (void) ngx_http_post_request(mr); + (void) ngx_http_post_request(mr, &e->terminal_posted_request); return; }
diff --git a/src/http/ngx_http_request.h b/src/http/ngx_http_request.h index 52ac90c..425737a 100644 --- a/src/http/ngx_http_request.h +++ b/src/http/ngx_http_request.h
@@ -510,6 +510,21 @@ /* used to parse HTTP headers */ ngx_uint_t state; + + ngx_uint_t header_hash; + ngx_uint_t lowcase_index; + u_char lowcase_header[NGX_HTTP_LC_HEADER_LEN]; + + u_char *header_name_start; + u_char *header_name_end; + u_char *header_start; + u_char *header_end; + + /* + * a memory that can be reused after parsing a request line + * via ngx_http_ephemeral_t + */ + u_char *uri_start; u_char *uri_end; u_char *uri_ext; @@ -523,20 +538,17 @@ u_char *host_end; u_char *port_start; u_char *port_end; - u_char *header_name_start; - u_char *header_name_end; - u_char *header_start; - u_char *header_end; unsigned http_minor:16; unsigned http_major:16; - - ngx_uint_t header_hash; - ngx_uint_t lowcase_index; - u_char lowcase_header[NGX_HTTP_LC_HEADER_LEN]; }; +typedef struct { + ngx_http_posted_request_t terminal_posted_request; +} ngx_http_ephemeral_t; + + extern ngx_http_header_t ngx_http_headers_in[]; extern ngx_http_header_out_t ngx_http_headers_out[];