~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Nginx/http/ngx_http_copy_filter_module.c

Version: ~ [ nginx-0.6.26 ] ~ [ nginx-0.5.35 ] ~ [ nginx-0.5.20 ] ~ [ nginx-0.5.19 ] ~

  1 
  2 /*
  3  * Copyright (C) Igor Sysoev
  4  */
  5 
  6 
  7 #include <ngx_config.h>
  8 #include <ngx_core.h>
  9 #include <ngx_http.h>
 10 
 11 
 12 typedef struct {
 13     ngx_bufs_t  bufs;
 14 } ngx_http_copy_filter_conf_t;
 15 
 16 
 17 static void *ngx_http_copy_filter_create_conf(ngx_conf_t *cf);
 18 static char *ngx_http_copy_filter_merge_conf(ngx_conf_t *cf,
 19     void *parent, void *child);
 20 static ngx_int_t ngx_http_copy_filter_init(ngx_conf_t *cf);
 21 
 22 
 23 static ngx_command_t  ngx_http_copy_filter_commands[] = {
 24 
 25     { ngx_string("output_buffers"),
 26       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
 27       ngx_conf_set_bufs_slot,
 28       NGX_HTTP_LOC_CONF_OFFSET,
 29       offsetof(ngx_http_copy_filter_conf_t, bufs),
 30       NULL },
 31 
 32       ngx_null_command
 33 };
 34 
 35 
 36 static ngx_http_module_t  ngx_http_copy_filter_module_ctx = {
 37     NULL,                                  /* preconfiguration */
 38     ngx_http_copy_filter_init,             /* postconfiguration */
 39 
 40     NULL,                                  /* create main configuration */
 41     NULL,                                  /* init main configuration */
 42 
 43     NULL,                                  /* create server configuration */
 44     NULL,                                  /* merge server configuration */
 45 
 46     ngx_http_copy_filter_create_conf,      /* create location configuration */
 47     ngx_http_copy_filter_merge_conf        /* merge location configuration */
 48 };
 49 
 50 
 51 ngx_module_t  ngx_http_copy_filter_module = {
 52     NGX_MODULE_V1,
 53     &ngx_http_copy_filter_module_ctx,      /* module context */
 54     ngx_http_copy_filter_commands,         /* module directives */
 55     NGX_HTTP_MODULE,                       /* module type */
 56     NULL,                                  /* init master */
 57     NULL,                                  /* init module */
 58     NULL,                                  /* init process */
 59     NULL,                                  /* init thread */
 60     NULL,                                  /* exit thread */
 61     NULL,                                  /* exit process */
 62     NULL,                                  /* exit master */
 63     NGX_MODULE_V1_PADDING
 64 };
 65 
 66 
 67 static ngx_http_output_body_filter_pt    ngx_http_next_filter;
 68 
 69 
 70 static ngx_int_t
 71 ngx_http_copy_filter(ngx_http_request_t *r, ngx_chain_t *in)
 72 {
 73     ngx_int_t                     rc;
 74     ngx_connection_t             *c;
 75     ngx_output_chain_ctx_t       *ctx;
 76     ngx_http_copy_filter_conf_t  *conf;
 77 
 78     c = r->connection;
 79 
 80     ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
 81                    "copy filter: \"%V?%V\"", &r->uri, &r->args);
 82 
 83     ctx = ngx_http_get_module_ctx(r, ngx_http_copy_filter_module);
 84 
 85     if (ctx == NULL) {
 86         conf = ngx_http_get_module_loc_conf(r, ngx_http_copy_filter_module);
 87 
 88         ctx = ngx_pcalloc(r->pool, sizeof(ngx_output_chain_ctx_t));
 89         if (ctx == NULL) {
 90             return NGX_ERROR;
 91         }
 92 
 93         ngx_http_set_ctx(r, ctx, ngx_http_copy_filter_module);
 94 
 95         ctx->sendfile = c->sendfile;
 96         ctx->need_in_memory = r->main_filter_need_in_memory
 97                               || r->filter_need_in_memory;
 98         ctx->need_in_temp = r->filter_need_temporary;
 99 
100         ctx->pool = r->pool;
101         ctx->bufs = conf->bufs;
102         ctx->tag = (ngx_buf_tag_t) &ngx_http_copy_filter_module;
103 
104         ctx->output_filter = (ngx_output_chain_filter_pt) ngx_http_next_filter;
105         ctx->filter_ctx = r;
106 
107         r->request_output = 1;
108     }
109 
110     rc = ngx_output_chain(ctx, in);
111 
112     if (!c->destroyed) {
113 
114         if (ctx->in == NULL) {
115             r->buffered &= ~NGX_HTTP_COPY_BUFFERED;
116         } else {
117             r->buffered |= NGX_HTTP_COPY_BUFFERED;
118         }
119 
120         if (r != r->main) {
121             r->out = ctx->in;
122         }
123 
124         ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
125                        "copy filter: %i \"%V?%V\"", rc, &r->uri, &r->args);
126     }
127 
128     return rc;
129 }
130 
131 
132 static void *
133 ngx_http_copy_filter_create_conf(ngx_conf_t *cf)
134 {
135     ngx_http_copy_filter_conf_t *conf;
136 
137     conf = ngx_palloc(cf->pool, sizeof(ngx_http_copy_filter_conf_t));
138     if (conf == NULL) {
139         return NULL;
140     }
141 
142     conf->bufs.num = 0;
143 
144     return conf;
145 }
146 
147 
148 static char *
149 ngx_http_copy_filter_merge_conf(ngx_conf_t *cf, void *parent, void *child)
150 {
151     ngx_http_copy_filter_conf_t *prev = parent;
152     ngx_http_copy_filter_conf_t *conf = child;
153 
154     ngx_conf_merge_bufs_value(conf->bufs, prev->bufs, 1, 32768);
155 
156     return NULL;
157 }
158 
159 
160 static ngx_int_t
161 ngx_http_copy_filter_init(ngx_conf_t *cf)
162 {
163     ngx_http_next_filter = ngx_http_top_body_filter;
164     ngx_http_top_body_filter = ngx_http_copy_filter;
165 
166     return NGX_OK;
167 }
168 
169 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.