# HG changeset patch # User Igor Sysoev # Date 1033059029 0 # Node ID 6ce4755737b4ad174efadd9dd58363dadae550a6 # Parent cbb38b60495cc025eb55f5e772e27733b46c06b4 nginx-0.0.1-2002-09-26-20:50:29 import diff --git a/src/core/ngx_hunk.c b/src/core/ngx_hunk.c --- a/src/core/ngx_hunk.c +++ b/src/core/ngx_hunk.c @@ -5,13 +5,15 @@ ngx_hunk_t *ngx_create_temp_hunk(ngx_pool_t *pool, int size, int before, int after) { - ngx_hunk_t *h = ngx_palloc(pool, sizeof(ngx_hunk_t)); + ngx_hunk_t *h; + + ngx_test_null(h, ngx_palloc(pool, sizeof(ngx_hunk_t)), NULL); #if !(HAVE_OFFSET_EQUAL_PTR) h->pos.file = h->last.file = 0; #endif - h->pre_start = ngx_palloc(pool, size + before + after); + ngx_test_null(h->pre_start, ngx_palloc(pool, size + before + after), NULL); h->start = h->pos.mem = h->last.mem = h->pre_start + before; h->end = h->last.mem + size; h->post_end = h->end + after; @@ -25,7 +27,9 @@ ngx_hunk_t *ngx_create_temp_hunk(ngx_poo ngx_hunk_t *ngx_create_hunk_before(ngx_pool_t *pool, ngx_hunk_t *hunk, int size) { - ngx_hunk_t *h = ngx_palloc(pool, sizeof(ngx_hunk_t)); + ngx_hunk_t *h; + + ngx_test_null(h, ngx_palloc(pool, sizeof(ngx_hunk_t)), NULL); #if !(HAVE_OFFSET_EQUAL_PTR) h->pos.file = h->last.file = 0; @@ -42,8 +46,8 @@ ngx_hunk_t *ngx_create_hunk_before(ngx_p h->file = NULL; } else { - h->pre_start = h->start = h->pos.mem = h->last.mem - = ngx_palloc(pool, size); + ngx_test_null(h->pre_start, ngx_palloc(pool, size), NULL); + h->start = h->pos.mem = h->last.mem = h->pre_start; h->end = h->post_end = h->start + size; h->type = NGX_HUNK_TEMP; @@ -56,7 +60,9 @@ ngx_hunk_t *ngx_create_hunk_before(ngx_p ngx_hunk_t *ngx_create_hunk_after(ngx_pool_t *pool, ngx_hunk_t *hunk, int size) { - ngx_hunk_t *h = ngx_palloc(pool, sizeof(ngx_hunk_t)); + ngx_hunk_t *h; + + ngx_test_null(h, ngx_palloc(pool, sizeof(ngx_hunk_t)), NULL); #if !(HAVE_OFFSET_EQUAL_PTR) h->pos.file = h->last.file = 0; @@ -74,8 +80,8 @@ ngx_hunk_t *ngx_create_hunk_after(ngx_po h->file = NULL; } else { - h->pre_start = h->start = h->pos.mem = h->last.mem = - ngx_palloc(pool, size); + ngx_test_null(h->pre_start, ngx_palloc(pool, size), NULL); + h->start = h->pos.mem = h->last.mem = h->pre_start; h->end = h->post_end = h->start + size; h->type = NGX_HUNK_TEMP; diff --git a/src/http/modules/ngx_http_ssi_filter.c b/src/http/modules/ngx_http_ssi_filter.c --- a/src/http/modules/ngx_http_ssi_filter.c +++ b/src/http/modules/ngx_http_ssi_filter.c @@ -39,172 +39,230 @@ int ngx_http_ssi_filter(ngx_http_request ngx_http_ssi_filter_ctx_t *ctx; ngx_http_ssi_filter_conf_t *conf; + if (in == NULL) + return next_filter; + ctx = (ngx_http_ssi_filter_ctx_t *) - ngx_get_module_ctx(r->main ? r->main : r, - ngx_http_ssi_filter_module); + ngx_get_module_ctx(r, ngx_http_ssi_filter_module); if (ctx == NULL) { ngx_http_create_ctx(r, ctx, ngx_http_ssi_filter_module, sizeof(ngx_http_ssi_filter_ctx_t)); ctx->state = &ssi_start; + ctx->handler = ngx_http_ssi_find_start; } - state = ctx->state; - length = ctx->length; - ch = in; - p = ch->hunk->pos.mem; + ctx->start = ctx->pos = ch->hunk->pos.mem; + + for ( ;; ) { + if (ctx->handler(r, ctx, ch) == NGX_ERROR) + return NGX_ERROR; - rc = ngx_http_ssi_parse(r, ctx, in); - if (rc == NGX_SSI_FOUND) { + if (ctx->pos + ctx->length == ch->hunk->last.mem) { + ch = ch->next; + if (ch == NULL) + break; + + ctx->start = ctx->pos = ch->hunk->pos.mem; + } } - } -static int ngx_http_ssi_parse(ngx_http_request_t *r, - ngx_http_ssi_filter_ctx_t *ctx, ngx_chain_t *in) + +static int ngx_http_ssi_find_start(ngx_http_request_t *r, + ngx_http_ssi_filter_ctx_t *ctx, + ngx_chain_t *ch) { - state = ctx->state; - length = ctx->length; + ngx_http_ssi_parse(r, ctx, ch->hunk); + + if (ctx->state == ssi_command_state + || (ctx->length > 0 && ch->next == NULL) + || ctx->hunk_with_ssi) + { + ngx_test_null(h, ngx_palloc(r->pool, sizeof(ngx_hunk_t)), NGX_ERROR); +#if !(HAVE_OFFSET_EQUAL_PTR) + h->pos.file = h->last.file = 0; +#endif + h->pre_start = h->start = h->pos.mem = ctx->start; + h->post_end = h->end = h->last.mem = ctx->pos; + h->type = NGX_HUNK_TEMP; + h->tag = 0; + h->file = NULL; + + ngx_add_hunk_to_chain(ctx->last, h, r->pool, NGX_ERROR); + + ngx_test_null(ssi_hunk, ngx_push_array(ctx->ssi_hunks), NGX_ERROR); + ssi_hunk->ssi_hunk = h; + ssi_hunk->hunk = ch->hunk; + ssi_hunk->pos = NULL; + } + + if (ctx->state == ssi_command_state) + ctx->handler = ngx_http_ssi_find_command; + } + + return NGX_OK; +} + + +static int ngx_http_ssi_find_command(ngx_http_request_t *r, + ngx_http_ssi_filter_ctx_t *ctx, + ngx_chain_t *ch) +{ + ngx_http_ssi_parse_command(r, ctx, ch->hunk); +} + + +static char ssi_start[] = "