One Level Up
Top Level
src/http/ngx_http_postpone_filter_module.c - nginx-1.7.10
Global variables defined
Functions defined
Source code
- #include <ngx_config.h>
- #include <ngx_core.h>
- #include <ngx_http.h>
- static ngx_int_t ngx_http_postpone_filter_add(ngx_http_request_t *r,
- ngx_chain_t *in);
- static ngx_int_t ngx_http_postpone_filter_init(ngx_conf_t *cf);
- static ngx_http_module_t ngx_http_postpone_filter_module_ctx = {
- NULL,
- ngx_http_postpone_filter_init,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL
- };
- ngx_module_t ngx_http_postpone_filter_module = {
- NGX_MODULE_V1,
- &ngx_http_postpone_filter_module_ctx,
- NULL,
- NGX_HTTP_MODULE,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NGX_MODULE_V1_PADDING
- };
- static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
- static ngx_int_t
- ngx_http_postpone_filter(ngx_http_request_t *r, ngx_chain_t *in)
- {
- ngx_connection_t *c;
- ngx_http_postponed_request_t *pr;
- c = r->connection;
- ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,
- "http postpone filter \"%V?%V\" %p", &r->uri, &r->args, in);
- if (r != c->data) {
- if (in) {
- ngx_http_postpone_filter_add(r, in);
- return NGX_OK;
- }
- #if 0
- #endif
- return NGX_OK;
- }
- if (r->postponed == NULL) {
- if (in || c->buffered) {
- return ngx_http_next_body_filter(r->main, in);
- }
- return NGX_OK;
- }
- if (in) {
- ngx_http_postpone_filter_add(r, in);
- }
- do {
- pr = r->postponed;
- if (pr->request) {
- ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
- "http postpone filter wake \"%V?%V\"",
- &pr->request->uri, &pr->request->args);
- r->postponed = pr->next;
- c->data = pr->request;
- return ngx_http_post_request(pr->request, NULL);
- }
- if (pr->out == NULL) {
- ngx_log_error(NGX_LOG_ALERT, c->log, 0,
- "http postpone filter NULL output");
- } else {
- ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
- "http postpone filter output \"%V?%V\"",
- &r->uri, &r->args);
- if (ngx_http_next_body_filter(r->main, pr->out) == NGX_ERROR) {
- return NGX_ERROR;
- }
- }
- r->postponed = pr->next;
- } while (r->postponed);
- return NGX_OK;
- }
- static ngx_int_t
- ngx_http_postpone_filter_add(ngx_http_request_t *r, ngx_chain_t *in)
- {
- ngx_http_postponed_request_t *pr, **ppr;
- if (r->postponed) {
- for (pr = r->postponed; pr->next; pr = pr->next) { }
- if (pr->request == NULL) {
- goto found;
- }
- ppr = &pr->next;
- } else {
- ppr = &r->postponed;
- }
- pr = ngx_palloc(r->pool, sizeof(ngx_http_postponed_request_t));
- if (pr == NULL) {
- return NGX_ERROR;
- }
- *ppr = pr;
- pr->request = NULL;
- pr->out = NULL;
- pr->next = NULL;
- found:
- if (ngx_chain_add_copy(r->pool, &pr->out, in) == NGX_OK) {
- return NGX_OK;
- }
- return NGX_ERROR;
- }
- static ngx_int_t
- ngx_http_postpone_filter_init(ngx_conf_t *cf)
- {
- ngx_http_next_body_filter = ngx_http_top_body_filter;
- ngx_http_top_body_filter = ngx_http_postpone_filter;
- return NGX_OK;
- }
One Level Up
Top Level