diff options
Diffstat (limited to '')
| -rw-r--r-- | src/core/ngx_modules.c (renamed from src/http/ngx_http_modules.c) | 0 | ||||
| -rw-r--r-- | src/http/ngx_http.h | 26 | ||||
| -rw-r--r-- | src/http/ngx_http_output_filter.c | 143 | ||||
| -rw-r--r-- | src/http/ngx_http_output_filter.h | 8 |
4 files changed, 85 insertions, 92 deletions
diff --git a/src/http/ngx_http_modules.c b/src/core/ngx_modules.c index 5b814baf9..5b814baf9 100644 --- a/src/http/ngx_http_modules.c +++ b/src/core/ngx_modules.c diff --git a/src/http/ngx_http.h b/src/http/ngx_http.h index c3e0620d2..61ac548a8 100644 --- a/src/http/ngx_http.h +++ b/src/http/ngx_http.h @@ -180,23 +180,32 @@ typedef struct { } ngx_http_log_ctx_t; +typedef int (*ngx_http_output_header_filter_p)(ngx_http_request_t *r); + +typedef int (*ngx_http_output_body_filter_p) + (ngx_http_request_t *r, ngx_chain_t *chain); + + + typedef struct { int index; void *(*create_srv_conf)(ngx_pool_t *p); void *(*create_loc_conf)(ngx_pool_t *p); - ngx_command_t *commands; - - int (*init_module)(ngx_pool_t *p); int (*translate_handler)(ngx_http_request_t *r); int (*output_header_filter) (ngx_http_request_t *r); int (*next_output_header_filter) (ngx_http_request_t *r); + ngx_http_output_body_filter_p output_body_filter; + ngx_http_output_body_filter_p next_output_body_filter; + +#if 0 int (*output_body_filter)(); int (*next_output_body_filter) (ngx_http_request_t *r, ngx_chain_t *ch); +#endif #if 0 int (*next_output_body_filter)(int (**next_filter) @@ -205,10 +214,19 @@ typedef struct { } ngx_http_module_t; -#define NGX_HTTP_MODULE 0 +#define NGX_HTTP_MODULE 0x80000000 + +#define NGX_HTTP_MODULE_TYPE 0x50545448 /* "HTTP" */ + +/* STUB */ #define ngx_get_module_loc_conf(r, module) r->loc_conf[module.index] #define ngx_get_module_ctx(r, module) r->ctx[module.index] +/**/ + +#define ngx_http_get_module_srv_conf(r, module) r->srv_conf[module.index] +#define ngx_http_get_module_loc_conf(r, module) r->loc_conf[module.index] +#define ngx_http_get_module_ctx(r, module) r->ctx[module.index] #define ngx_http_create_ctx(r, cx, module, size) \ do { \ diff --git a/src/http/ngx_http_output_filter.c b/src/http/ngx_http_output_filter.c index 8c374cb3e..5a33d5364 100644 --- a/src/http/ngx_http_output_filter.c +++ b/src/http/ngx_http_output_filter.c @@ -10,51 +10,48 @@ #include <ngx_http_output_filter.h> -int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk); +static int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk); static int ngx_http_output_filter_copy_hunk(ngx_hunk_t *dst, ngx_hunk_t *src); -#if 0 -static int ngx_http_output_filter_init( - int (**next_filter)(ngx_http_request_t *r, ngx_chain_t *ch)); -#endif static void *ngx_http_output_filter_create_conf(ngx_pool_t *pool); -static ngx_command_t ngx_http_output_filter_commands[] = { +static ngx_command_t ngx_http_output_filter_commands[] = { - {"output_buffer", ngx_conf_set_size_slot, + {ngx_string("output_buffer"), + ngx_conf_set_size_slot, offsetof(ngx_http_output_filter_conf_t, hunk_size), - NGX_HTTP_LOC_CONF, NGX_CONF_TAKE1, - "set output filter buffer size"}, - - {NULL} + NGX_HTTP_LOC_CONF, + NGX_CONF_TAKE1}, + {ngx_string(""), NULL, 0, 0, 0} }; -ngx_http_module_t ngx_http_output_filter_module = { +static ngx_http_module_t ngx_http_output_filter_module_ctx = { NGX_HTTP_MODULE, NULL, /* create server config */ ngx_http_output_filter_create_conf, /* create location config */ - ngx_http_output_filter_commands, /* module directives */ - NULL, /* init module */ NULL, /* translate handler */ NULL, /* output header filter */ NULL, /* next output header filter */ - ngx_http_output_filter, /* output body filter */ + (ngx_http_output_body_filter_p) ngx_http_output_filter, + /* output body filter */ NULL /* next output body filter */ }; -#if 0 -static int (*ngx_http_output_next_filter)(ngx_http_request_t *r, - ngx_chain_t *ch); -#endif +ngx_module_t ngx_http_output_filter_module = { + &ngx_http_output_filter_module_ctx, /* module context */ + ngx_http_output_filter_commands, /* module directives */ + NGX_HTTP_MODULE_TYPE, /* module type */ + NULL /* init module */ +}; -int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk) +static int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk) { int rc, once; size_t size; @@ -64,21 +61,18 @@ int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk) ngx_http_output_filter_conf_t *conf; ctx = (ngx_http_output_filter_ctx_t *) - ngx_get_module_ctx(r->main ? r->main : r, - ngx_http_output_filter_module); + ngx_http_get_module_ctx(r->main ? r->main : r, + ngx_http_output_filter_module_ctx); if (ctx == NULL) { ngx_http_create_ctx(r, ctx, - ngx_http_output_filter_module, + ngx_http_output_filter_module_ctx, sizeof(ngx_http_output_filter_ctx_t)); - -#if 0 - ctx->next_filter = ngx_http_output_next_filter; -#endif } - if (hunk && (hunk->type & NGX_HUNK_LAST)) + if (hunk && (hunk->type & NGX_HUNK_LAST)) { ctx->last = 1; + } for (once = 1; once || ctx->in; once = 0) { @@ -87,19 +81,17 @@ int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk) /* add hunk to input chain */ if (once && hunk) { - for (ce = ctx->in; ce->next; ce = ce->next) + for (ce = ctx->in; ce->next; ce = ce->next) { /* void */ ; + } ngx_add_hunk_to_chain(ce->next, hunk, r->pool, NGX_ERROR); } /* our hunk is still busy */ if (ctx->hunk->pos.mem < ctx->hunk->last.mem) { - rc = ngx_http_output_filter_module. + rc = ngx_http_output_filter_module_ctx. next_output_body_filter(r, NULL); -#if 0 - rc = ctx->next_filter(r, NULL); -#endif /* our hunk is free */ } else { @@ -107,11 +99,13 @@ int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk) rc = ngx_http_output_filter_copy_hunk(ctx->hunk, ctx->in->hunk); #if (NGX_FILE_AIO_READ) - if (rc == NGX_AGAIN) + if (rc == NGX_AGAIN) { return rc; + } #endif - if (rc == NGX_ERROR) + if (rc == NGX_ERROR) { return rc; + } /* whole hunk is copied so we send to next filter chain part up to next hunk that need to be copied */ @@ -119,12 +113,15 @@ int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk) ctx->out.next = ctx->in->next; for (ce = ctx->in->next; ce; ce = ce->next) { - if (ce->hunk->type & NGX_HUNK_FILE) + if (ce->hunk->type & NGX_HUNK_FILE) { break; + } if ((ce->hunk->type & (NGX_HUNK_MEMORY|NGX_HUNK_MMAP)) && (r->filter & NGX_HTTP_FILTER_NEED_TEMP)) + { break; + } } ctx->out.next = ce; @@ -133,33 +130,29 @@ int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk) ctx->out.next = NULL; } - rc = ngx_http_output_filter_module. + rc = ngx_http_output_filter_module_ctx. next_output_body_filter(r, &ctx->out); -#if 0 - rc = ctx->next_filter(r, &ctx->out); -#endif; } /* delete completed hunks from input chain */ for (ce = ctx->in; ce; ce = ce->next) { - if (ce->hunk->pos.file == ce->hunk->last.file) + if (ce->hunk->pos.file == ce->hunk->last.file) { ctx->in = ce->next; + } } - if (rc == NGX_OK && ctx->hunk) + if (rc == NGX_OK && ctx->hunk) { ctx->hunk->pos.mem = ctx->hunk->last.mem = ctx->hunk->start; - else + } else { return rc; + } /* input chain is empty */ } else { if (hunk == NULL) { - rc = ngx_http_output_filter_module. + rc = ngx_http_output_filter_module_ctx. next_output_body_filter(r, NULL); -#if 0 - rc = ctx->next_filter(r, NULL); -#endif; } else { @@ -175,11 +168,8 @@ int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk) ngx_add_hunk_to_chain(ctx->in, hunk, r->pool, NGX_ERROR); - rc = ngx_http_output_filter_module. + rc = ngx_http_output_filter_module_ctx. next_output_body_filter(r, NULL); -#if 0 - rc = ctx->next_filter(r, NULL); -#endif } else { if (ctx->hunk == NULL) { @@ -187,12 +177,14 @@ int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk) if (hunk->type & NGX_HUNK_LAST) { conf = (ngx_http_output_filter_conf_t *) - ngx_get_module_loc_conf(r->main ? r->main : r, - ngx_http_output_filter_module); + ngx_http_get_module_loc_conf( + r->main ? r->main : r, + ngx_http_output_filter_module_ctx); size = hunk->last.mem - hunk->pos.mem; - if (size > conf->hunk_size) + if (size > conf->hunk_size) { size = conf->hunk_size; + } } else { size = conf->hunk_size; @@ -215,21 +207,20 @@ int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk) return rc; } #endif - if (rc == NGX_ERROR) + if (rc == NGX_ERROR) { return rc; + } - if (hunk->pos.mem < hunk->last.mem) + if (hunk->pos.mem < hunk->last.mem) { ngx_add_hunk_to_chain(ctx->in, hunk, r->pool, NGX_ERROR); + } ctx->out.hunk = ctx->hunk; ctx->out.next = NULL; - rc = ngx_http_output_filter_module. + rc = ngx_http_output_filter_module_ctx. next_output_body_filter(r, &ctx->out); -#if 0 - rc = ctx->next_filter(r, &ctx->out); -#endif } } @@ -237,11 +228,8 @@ int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk) ctx->out.hunk = hunk; ctx->out.next = NULL; - rc = ngx_http_output_filter_module. + rc = ngx_http_output_filter_module_ctx. next_output_body_filter(r, &ctx->out); -#if 0 - rc = ctx->next_filter(r, &ctx->out); -#endif } } } @@ -250,13 +238,15 @@ int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk) ctx->hunk->pos.mem = ctx->hunk->last.mem = ctx->hunk->start; } - if (rc == NGX_OK && ctx->last) + if (rc == NGX_OK && ctx->last) { return NGX_OK; + } if (rc == NGX_OK) { - if (ctx->hunk) + if (ctx->hunk) { ctx->hunk->pos.mem = ctx->hunk->last.mem = ctx->hunk->start; -#if level_event + } +#if (!NGX_ONESHOT_EVENT) ngx_del_event(r->connection->write, NGX_WRITE_EVENT); #endif } @@ -271,8 +261,9 @@ static int ngx_http_output_filter_copy_hunk(ngx_hunk_t *dst, ngx_hunk_t *src) ssize_t n; size = src->last.mem - src->pos.mem; - if (size > dst->end - dst->pos.mem) + if (size > dst->end - dst->pos.mem) { size = dst->end - dst->pos.mem; + } if (src->type & NGX_HUNK_FILE) { n = ngx_read_file(src->file, dst->pos.mem, size, src->pos.file); @@ -301,10 +292,9 @@ static int ngx_http_output_filter_copy_hunk(ngx_hunk_t *dst, ngx_hunk_t *src) dst->last.mem += size; } -#if 1 - if (src->type & NGX_HUNK_LAST) + if (src->type & NGX_HUNK_LAST) { dst->type |= NGX_HUNK_LAST; -#endif + } return NGX_OK; } @@ -322,14 +312,3 @@ static void *ngx_http_output_filter_create_conf(ngx_pool_t *pool) return conf; } - -#if 0 -static int ngx_http_output_filter_init( - int (**next_filter)(ngx_http_request_t *r, ngx_chain_t *ch)) -{ - ngx_http_output_next_filter = *next_filter; - *next_filter = NULL; - - return NGX_OK; -} -#endif diff --git a/src/http/ngx_http_output_filter.h b/src/http/ngx_http_output_filter.h index 32af6fe67..63807d19d 100644 --- a/src/http/ngx_http_output_filter.h +++ b/src/http/ngx_http_output_filter.h @@ -14,10 +14,8 @@ typedef struct { size_t hunk_size; } ngx_http_output_filter_conf_t; + typedef struct { -#if 0 - int (*next_filter)(ngx_http_request_t *r, ngx_chain_t *ch); -#endif ngx_hunk_t *hunk; ngx_chain_t *in; ngx_chain_t out; @@ -25,9 +23,7 @@ typedef struct { } ngx_http_output_filter_ctx_t; -int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk); - -extern ngx_http_module_t ngx_http_output_filter_module; +extern ngx_module_t ngx_http_output_filter_module; #endif /* _NGX_HTTP_OUTPUT_FILTER_H_INCLUDED_ */ |
