Annotation of embedaddon/nginx/src/http/ngx_http_postpone_filter_module.c, revision 1.1
1.1 ! misho 1:
! 2: /*
! 3: * Copyright (C) Igor Sysoev
! 4: * Copyright (C) Nginx, Inc.
! 5: */
! 6:
! 7:
! 8: #include <ngx_config.h>
! 9: #include <ngx_core.h>
! 10: #include <ngx_http.h>
! 11:
! 12:
! 13: static ngx_int_t ngx_http_postpone_filter_add(ngx_http_request_t *r,
! 14: ngx_chain_t *in);
! 15: static ngx_int_t ngx_http_postpone_filter_init(ngx_conf_t *cf);
! 16:
! 17:
! 18: static ngx_http_module_t ngx_http_postpone_filter_module_ctx = {
! 19: NULL, /* preconfiguration */
! 20: ngx_http_postpone_filter_init, /* postconfiguration */
! 21:
! 22: NULL, /* create main configuration */
! 23: NULL, /* init main configuration */
! 24:
! 25: NULL, /* create server configuration */
! 26: NULL, /* merge server configuration */
! 27:
! 28: NULL, /* create location configuration */
! 29: NULL /* merge location configuration */
! 30: };
! 31:
! 32:
! 33: ngx_module_t ngx_http_postpone_filter_module = {
! 34: NGX_MODULE_V1,
! 35: &ngx_http_postpone_filter_module_ctx, /* module context */
! 36: NULL, /* module directives */
! 37: NGX_HTTP_MODULE, /* module type */
! 38: NULL, /* init master */
! 39: NULL, /* init module */
! 40: NULL, /* init process */
! 41: NULL, /* init thread */
! 42: NULL, /* exit thread */
! 43: NULL, /* exit process */
! 44: NULL, /* exit master */
! 45: NGX_MODULE_V1_PADDING
! 46: };
! 47:
! 48:
! 49: static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
! 50:
! 51:
! 52: static ngx_int_t
! 53: ngx_http_postpone_filter(ngx_http_request_t *r, ngx_chain_t *in)
! 54: {
! 55: ngx_connection_t *c;
! 56: ngx_http_postponed_request_t *pr;
! 57:
! 58: c = r->connection;
! 59:
! 60: ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,
! 61: "http postpone filter \"%V?%V\" %p", &r->uri, &r->args, in);
! 62:
! 63: if (r != c->data) {
! 64:
! 65: if (in) {
! 66: ngx_http_postpone_filter_add(r, in);
! 67: return NGX_OK;
! 68: }
! 69:
! 70: #if 0
! 71: /* TODO: SSI may pass NULL */
! 72: ngx_log_error(NGX_LOG_ALERT, c->log, 0,
! 73: "http postpone filter NULL inactive request",
! 74: &r->uri, &r->args);
! 75: #endif
! 76:
! 77: return NGX_OK;
! 78: }
! 79:
! 80: if (r->postponed == NULL) {
! 81:
! 82: if (in || c->buffered) {
! 83: return ngx_http_next_body_filter(r->main, in);
! 84: }
! 85:
! 86: return NGX_OK;
! 87: }
! 88:
! 89: if (in) {
! 90: ngx_http_postpone_filter_add(r, in);
! 91: }
! 92:
! 93: do {
! 94: pr = r->postponed;
! 95:
! 96: if (pr->request) {
! 97:
! 98: ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
! 99: "http postpone filter wake \"%V?%V\"",
! 100: &pr->request->uri, &pr->request->args);
! 101:
! 102: r->postponed = pr->next;
! 103:
! 104: c->data = pr->request;
! 105:
! 106: return ngx_http_post_request(pr->request, NULL);
! 107: }
! 108:
! 109: if (pr->out == NULL) {
! 110: ngx_log_error(NGX_LOG_ALERT, c->log, 0,
! 111: "http postpone filter NULL output",
! 112: &r->uri, &r->args);
! 113:
! 114: } else {
! 115: ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
! 116: "http postpone filter output \"%V?%V\"",
! 117: &r->uri, &r->args);
! 118:
! 119: if (ngx_http_next_body_filter(r->main, pr->out) == NGX_ERROR) {
! 120: return NGX_ERROR;
! 121: }
! 122: }
! 123:
! 124: r->postponed = pr->next;
! 125:
! 126: } while (r->postponed);
! 127:
! 128: return NGX_OK;
! 129: }
! 130:
! 131:
! 132: static ngx_int_t
! 133: ngx_http_postpone_filter_add(ngx_http_request_t *r, ngx_chain_t *in)
! 134: {
! 135: ngx_http_postponed_request_t *pr, **ppr;
! 136:
! 137: if (r->postponed) {
! 138: for (pr = r->postponed; pr->next; pr = pr->next) { /* void */ }
! 139:
! 140: if (pr->request == NULL) {
! 141: goto found;
! 142: }
! 143:
! 144: ppr = &pr->next;
! 145:
! 146: } else {
! 147: ppr = &r->postponed;
! 148: }
! 149:
! 150: pr = ngx_palloc(r->pool, sizeof(ngx_http_postponed_request_t));
! 151: if (pr == NULL) {
! 152: return NGX_ERROR;
! 153: }
! 154:
! 155: *ppr = pr;
! 156:
! 157: pr->request = NULL;
! 158: pr->out = NULL;
! 159: pr->next = NULL;
! 160:
! 161: found:
! 162:
! 163: if (ngx_chain_add_copy(r->pool, &pr->out, in) == NGX_OK) {
! 164: return NGX_OK;
! 165: }
! 166:
! 167: return NGX_ERROR;
! 168: }
! 169:
! 170:
! 171: static ngx_int_t
! 172: ngx_http_postpone_filter_init(ngx_conf_t *cf)
! 173: {
! 174: ngx_http_next_body_filter = ngx_http_top_body_filter;
! 175: ngx_http_top_body_filter = ngx_http_postpone_filter;
! 176:
! 177: return NGX_OK;
! 178: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>