48
static ngx_http_output_body_filter_pt ngx_http_next_filter;
49
static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
52
53
ngx_http_postpone_filter(ngx_http_request_t *r, ngx_chain_t *in)
56
ngx_http_postponed_request_t *pr, **ppr;
58
ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
56
ngx_http_postponed_request_t *pr;
60
ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,
59
61
"http postpone filter \"%V?%V\" %p", &r->uri, &r->args, in);
61
if (r != r->connection->data || (r->postponed && in)) {
64
for (pr = r->postponed; pr->next; pr = pr->next) { /* void */ }
66
ppr = pr->request ? &pr->next : NULL;
70
#if (NGX_SUPPRESS_WARN)
76
pr = ngx_palloc(r->pool, sizeof(ngx_http_postponed_request_t));
88
if (ngx_chain_add_copy(r->pool, &pr->out, in) == NGX_ERROR) {
96
for (cl = pr->out; cl; cl = cl->next) {
98
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
99
"the same buf was used in postponed %p %p",
109
if (r != r->connection->data || r->postponed->request) {
115
out = r->postponed->out;
117
r->postponed = r->postponed->next;
127
|| (r->connection->buffered
128
& (NGX_HTTP_LOWLEVEL_BUFFERED|NGX_LOWLEVEL_BUFFERED)))
130
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
131
"http postpone filter out \"%V?%V\"", &r->uri, &r->args);
133
if (!(out && out->next == NULL && ngx_buf_sync_only(out->buf))) {
135
rc = ngx_http_next_filter(r->main, out);
137
if (rc == NGX_ERROR) {
138
/* NGX_ERROR may be returned by any filter */
139
r->connection->error = 1;
66
ngx_http_postpone_filter_add(r, in);
71
/* TODO: SSI may pass NULL */
72
ngx_log_error(NGX_LOG_ALERT, c->log, 0,
73
"http postpone filter NULL inactive request",
144
80
if (r->postponed == NULL) {
148
rc = ngx_http_postpone_filter_output_postponed_request(r);
150
if (rc == NGX_ERROR) {
151
/* NGX_ERROR may be returned by any filter */
152
r->connection->error = 1;
160
ngx_http_postpone_filter_output_postponed_request(ngx_http_request_t *r)
164
ngx_http_log_ctx_t *ctx;
165
ngx_http_postponed_request_t *pr;
82
if (in || c->buffered) {
83
return ngx_http_next_body_filter(r->main, in);
90
ngx_http_postpone_filter_add(r, in);
168
94
pr = r->postponed;
174
96
if (pr->request) {
176
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
177
"http postpone filter handle \"%V?%V\"",
98
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
99
"http postpone filter wake \"%V?%V\"",
178
100
&pr->request->uri, &pr->request->args);
180
ctx = r->connection->log->data;
181
ctx->current_request = pr->request;
183
if (!pr->request->done) {
184
r->connection->data = pr->request;
188
rc = ngx_http_postpone_filter_output_postponed_request(pr->request);
190
if (rc == NGX_AGAIN || rc == NGX_ERROR) {
194
r->postponed = r->postponed->next;
205
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
206
"http postpone filter out postponed \"%V?%V\"",
102
r->postponed = pr->next;
104
c->data = pr->request;
106
return ngx_http_post_request(pr->request, NULL);
109
if (pr->out == NULL) {
110
ngx_log_error(NGX_LOG_ALERT, c->log, 0,
111
"http postpone filter NULL output",
115
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
116
"http postpone filter output \"%V?%V\"",
207
117
&r->uri, &r->args);
209
if (!(out && out->next == NULL && ngx_buf_sync_only(out->buf))) {
210
if (ngx_http_next_filter(r->main, out) == NGX_ERROR) {
119
if (ngx_http_next_body_filter(r->main, pr->out) == NGX_ERROR) {
216
r->postponed = r->postponed->next;
220
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
221
"http postpone filter out again \"%V?%V\"",
224
r->connection->data = r;
124
r->postponed = pr->next;
126
} while (r->postponed);
133
ngx_http_postpone_filter_add(ngx_http_request_t *r, ngx_chain_t *in)
135
ngx_http_postponed_request_t *pr, **ppr;
138
for (pr = r->postponed; pr->next; pr = pr->next) { /* void */ }
140
if (pr->request == NULL) {
150
pr = ngx_palloc(r->pool, sizeof(ngx_http_postponed_request_t));
163
if (ngx_chain_add_copy(r->pool, &pr->out, in) == NGX_OK) {
233
172
ngx_http_postpone_filter_init(ngx_conf_t *cf)
235
ngx_http_next_filter = ngx_http_top_body_filter;
174
ngx_http_next_body_filter = ngx_http_top_body_filter;
236
175
ngx_http_top_body_filter = ngx_http_postpone_filter;