annotate src/http/ngx_http_postpone_filter_module.c @ 4248:2fad4d19ea4b stable-1.0

Merging r4151, r4152, r4177: HTTP cache related fixes: *) Cache: fix for sending of empty responses. Revert wrong fix for empty responses introduced in 0.8.31 and apply new one, rewritten to match things done by static module as close as possible. *) Cache: fix for sending of stale responses. For normal cached responses ngx_http_cache_send() sends last buffer and then request finalized via ngx_http_finalize_request() call, i.e. everything is ok. But for stale responses (i.e. when upstream died, but we have something in cache) the same ngx_http_cache_send() sends last buffer, but then in ngx_http_upstream_finalize_request() another last buffer is send. This causes duplicate final chunk to appear if chunked encoding is used (and resulting problems with keepalive connections and so on). Fix this by not sending in ngx_http_upstream_finalize_request() another last buffer if we know response was from cache. *) Fixed cache bypass caching of non-cacheable replies (ticket #21). If cache was bypassed with proxy_cache_bypass, cache-controlling headers (Cache-Control, Expires) wasn't considered and response was cached even if it was actually non-cacheable. Patch by John Ferlito.
author Igor Sysoev <igor@sysoev.ru>
date Tue, 01 Nov 2011 13:49:31 +0000
parents 23e6f26fb4bd
children d620f497c50f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4 */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
12 static ngx_int_t ngx_http_postpone_filter_add(ngx_http_request_t *r,
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
13 ngx_chain_t *in);
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
14 static ngx_int_t ngx_http_postpone_filter_init(ngx_conf_t *cf);
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17 static ngx_http_module_t ngx_http_postpone_filter_module_ctx = {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18 NULL, /* preconfiguration */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
19 ngx_http_postpone_filter_init, /* postconfiguration */
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21 NULL, /* create main configuration */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 NULL, /* init main configuration */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 NULL, /* create server configuration */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 NULL, /* merge server configuration */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27 NULL, /* create location configuration */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 NULL /* merge location configuration */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 };
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 ngx_module_t ngx_http_postpone_filter_module = {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 NGX_MODULE_V1,
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 &ngx_http_postpone_filter_module_ctx, /* module context */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 NULL, /* module directives */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 NGX_HTTP_MODULE, /* module type */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
37 NULL, /* init master */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
38 NULL, /* init module */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
39 NULL, /* init process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
40 NULL, /* init thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
41 NULL, /* exit thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
42 NULL, /* exit process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
43 NULL, /* exit master */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
44 NGX_MODULE_V1_PADDING
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 };
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 static ngx_http_output_body_filter_pt ngx_http_next_filter;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51 static ngx_int_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 ngx_http_postpone_filter(ngx_http_request_t *r, ngx_chain_t *in)
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 {
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
54 ngx_connection_t *c;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
55 ngx_http_postponed_request_t *pr;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
57 c = r->connection;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
58
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
59 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
60 "http postpone filter \"%V?%V\" %p", &r->uri, &r->args, in);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 519
diff changeset
61
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
62 if (r != c->data) {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
64 if (in) {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
65 ngx_http_postpone_filter_add(r, in);
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
66 return NGX_OK;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
69 #if 0
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
70 /* TODO: SSI may pass NULL */
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
71 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
72 "http postpone filter NULL inactive request",
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
73 &r->uri, &r->args);
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
74 #endif
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
75
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
76 return NGX_OK;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
77 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
78
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
79 if (r->postponed == NULL) {
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
80
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
81 if (in || c->buffered) {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
82 return ngx_http_next_filter(r->main, in);
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
83 }
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
84
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
85 return NGX_OK;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
86 }
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
87
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
88 if (in) {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
89 ngx_http_postpone_filter_add(r, in);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
90 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
91
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
92 do {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
93 pr = r->postponed;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
94
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
95 if (pr->request) {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
96
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
97 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
98 "http postpone filter wake \"%V?%V\"",
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
99 &pr->request->uri, &pr->request->args);
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
100
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
101 r->postponed = pr->next;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
102
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
103 c->data = pr->request;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
104
3064
23e6f26fb4bd *) ngx_http_ephemeral
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
105 return ngx_http_post_request(pr->request, NULL);
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
106 }
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
107
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
108 if (pr->out == NULL) {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
109 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
110 "http postpone filter NULL output",
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
111 &r->uri, &r->args);
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
112
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
113 } else {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
114 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
115 "http postpone filter output \"%V?%V\"",
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
116 &r->uri, &r->args);
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
118 if (ngx_http_next_filter(r->main, pr->out) == NGX_ERROR) {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
119 return NGX_ERROR;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
120 }
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
121 }
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
122
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
123 r->postponed = pr->next;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
124
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
125 } while (r->postponed);
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
126
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
127 return NGX_OK;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 static ngx_int_t
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
132 ngx_http_postpone_filter_add(ngx_http_request_t *r, ngx_chain_t *in)
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
133 {
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
134 ngx_http_postponed_request_t *pr, **ppr;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
135
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
136 if (r->postponed) {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
137 for (pr = r->postponed; pr->next; pr = pr->next) { /* void */ }
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
138
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
139 if (pr->request == NULL) {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
140 goto found;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
141 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
142
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
143 ppr = &pr->next;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
144
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
145 } else {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
146 ppr = &r->postponed;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
147 }
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
148
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
149 pr = ngx_palloc(r->pool, sizeof(ngx_http_postponed_request_t));
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
150 if (pr == NULL) {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
151 return NGX_ERROR;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
152 }
2066
2bb4441a8c28 fix bug when inactive subrequest is truncated,
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
153
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
154 *ppr = pr;
2066
2bb4441a8c28 fix bug when inactive subrequest is truncated,
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
155
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
156 pr->request = NULL;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
157 pr->out = NULL;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
158 pr->next = NULL;
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
159
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
160 found:
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
161
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
162 if (ngx_chain_add_copy(r->pool, &pr->out, in) == NGX_OK) {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
163 return NGX_OK;
2066
2bb4441a8c28 fix bug when inactive subrequest is truncated,
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
164 }
2bb4441a8c28 fix bug when inactive subrequest is truncated,
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
165
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2295
diff changeset
166 return NGX_ERROR;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
167 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
168
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
169
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 569
diff changeset
170 static ngx_int_t
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
171 ngx_http_postpone_filter_init(ngx_conf_t *cf)
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 {
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 ngx_http_next_filter = ngx_http_top_body_filter;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 ngx_http_top_body_filter = ngx_http_postpone_filter;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177 }