# HG changeset patch # User Igor Sysoev # Date 1032366742 0 # Node ID cbb38b60495cc025eb55f5e772e27733b46c06b4 # Parent f8a0d0f31a24eeeecbc6f83a6cab2e6b38d8aecc nginx-0.0.1-2002-09-18-20:32:22 import 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 @@ -14,8 +14,8 @@ static void *ngx_http_ssi_filter_create_ ngx_http_module_t ngx_http_ssi_filter_module = { NGX_HTTP_MODULE, NULL, /* create server config */ - ngx_http_ssi_filter_create_conf, /* create location config */ - ngx_http_ssi_filter_commands, /* module directives */ + ngx_http_ssi_filter_create_conf, /* create location config */ + ngx_http_ssi_filter_commands, /* module directives */ NULL, /* init module */ NULL /* init output body filter */ }; @@ -23,10 +23,10 @@ ngx_http_module_t ngx_http_ssi_filter_m static ngx_command_t ngx_http_ssi_filter_commands[] = { - {"ssi", ngx_conf_set_size_slot, - offsetof(ngx_http_write_filter_conf_t, buffer_output), - NGX_HTTP_LOC_CONF, NGX_CONF_TAKE1, - "set write filter size to buffer output"}, + {"ssi", ngx_conf_set_flag_slot, + offsetof(ngx_http_ssi_filter_conf_t, on), + NGX_HTTP_LOC_CONF, NGX_CONF_FLAG, + "enable ssi filter"}, {NULL} @@ -35,8 +35,6 @@ static ngx_command_t ngx_http_ssi_filter int ngx_http_ssi_filter(ngx_http_request_t *r, ngx_chain_t *in) { - int last; - off_t size, flush; ngx_chain_t *ch, **prev, *chain; ngx_http_ssi_filter_ctx_t *ctx; ngx_http_ssi_filter_conf_t *conf; @@ -53,89 +51,122 @@ int ngx_http_ssi_filter(ngx_http_request } state = ctx->state; + length = ctx->length; ch = in; p = ch->hunk->pos.mem; + rc = ngx_http_ssi_parse(r, ctx, in); + if (rc == NGX_SSI_FOUND) { + } + +} + + +static int ngx_http_ssi_parse(ngx_http_request_t *r, + ngx_http_ssi_filter_ctx_t *ctx, ngx_chain_t *in) +{ + state = ctx->state; + length = ctx->length; + for ( ;; ) { if (state == ssi_start_state) { for (/* void */ ; p < ch->hunk->last.mem; p++) { if (*p == '<') { state = ssi_exclam_state; - saved_pos = p; - saved_chain = ch; + length = 1; break; } } } for (/* void */ ; - p < ch->hunk->last.mem && state > ssi_start_state; + p < ch->hunk->last.mem + && (state > ssi_start_state && state < ssi_command_state) p++) { - - if (*p == '<') { - state = ssi_exclam_state; - saved_pos = p; - saved_chain = ch; - continue; - } - switch (state) { case ssi_exclam_state: - if (*p == '!') { + switch (*p) { + + case '!': state = ssi_dash1_state; + length = 2; + break; - else { - state = ssi_ssi_state; - saved_pos = NULL; - saved_chain = NULL; + case '<': + state = ssi_exclam_state; + length = 1; + break; + + default: + state = ssi_start_state; + length = 0; + break; } break; case ssi_dash1_state: - if (*p == '-') { + switch (*p) { + + case '-': state = ssi_dash2_state; + length = 3; + break; - else { - state = ssi_ssi_state; - saved_pos = NULL; - saved_chain = NULL; + case '<': + state = ssi_exclam_state; + length = 1; + break; + + default: + state = ssi_start_state; + length = 0; + break; } break; case ssi_dash2_state: - if (*p == '-') { + switch (*p) { + + case '-': state = ssi_sharp_state; + length = 4; + break; - else { - state = ssi_ssi_state; - saved_pos = NULL; - saved_chain = NULL; + case '<': + state = ssi_exclam_state; + length = 1; + break; + + default: + state = ssi_start_state; + length = 0; + break; } break; case ssi_sharp_state: switch (*p) { - case '#': - state = ssi_command_state; - break; - case ' ': - case '\t': - case CR: - case LF: + case '#': + ctx->state = ssi_command_state; + ctx->length = 5; + return NGX_SSI_FOUND; + + case '<': + state = ssi_exclam_state; + length = 1; break; default: - state = ssi_ssi_state; - saved_pos = NULL; - saved_chain = NULL; + state = ssi_start_state; + length = 0; break; } @@ -143,6 +174,10 @@ int ngx_http_ssi_filter(ngx_http_request } } + if (state > ssi_start_state) { + ngx_add_hunk_to_chain(ch->hunk); + } + ch = ch->next; if (ch == NULL) { ctx->state = state; @@ -152,48 +187,24 @@ int ngx_http_ssi_filter(ngx_http_request p = ch->hunk->pos.mem; } - for (p = saved_pos, ch = saved_chain; - ch; - ch = ch->next, p = ch->hunk->pos.mem) - { - ngx_memcpy(saved_line, p, ch->hunk->last.mem - p); - saved_size += ch->hunk->last.mem - p; - if (ch->next == NULL) - break; - } + if (state > ssi_start_state) + if (ngx_http_ssi_dup_hunk(r, ch->hunk) == NGX_ERROR) + return NGX_ERROR; - - - - - - - - - +} - - - for (/* void */; in; in = in->next) { - - for (p = in->hunk->pos.mem; - in->hunk->pos.mem < in->hunk->last.mem; - p++) - { - switch (state) { +static ngx_http_ssi_dup_hunk(ngx_http_request_t *r, ngx_hunk_t *hunk); +{ + new dup_hunk + set dup_hunk + ngx_add_hunk_to_chain dup_hunk - case ssi_start_state: - if (*p == '<') { - state = ssi_exclam_state; - save_line = p; - } - break; - - case ssi_exclam_state: - } - } - } + ngx_test_null(ssi_hunk, ngx_push_array); + ssi_hunk->ssi_hunk = dup_hunk; + ssi_hunk->hunk = hunk; + ssi_hunk->pos = NULL; +} @@ -213,64 +224,14 @@ int ngx_http_ssi_filter(ngx_http_request - size = flush = 0; - last = 0; - prev = &ctx->out; - /* find size, flush point and last link of saved chain */ - for (ch = ctx->out; ch; ch = ch->next) { - prev = &ch->next; - size += ch->hunk->last.file - ch->hunk->pos.file; - ngx_log_debug(r->connection->log, "old chunk: %x " QX_FMT " " QD_FMT _ - ch->hunk->type _ ch->hunk->pos.file _ - ch->hunk->last.file - ch->hunk->pos.file); - if (ch->hunk->type & NGX_HUNK_FLUSH|NGX_HUNK_RECYCLED) - flush = size; - - if (ch->hunk->type & NGX_HUNK_LAST) - last = 1; - } - - /* add new chain to existent one */ - for (/* void */; in; in = in->next) { - ngx_test_null(ch, ngx_palloc(r->pool, sizeof(ngx_chain_t)), NGX_ERROR); - ch->hunk = in->hunk; - ch->next = NULL; - *prev = ch; - prev = &ch->next; - size += ch->hunk->last.file - ch->hunk->pos.file; - ngx_log_debug(r->connection->log, "new chunk: %x " QX_FMT " " QD_FMT _ - ch->hunk->type _ ch->hunk->pos.file _ - ch->hunk->last.file - ch->hunk->pos.file); - - if (ch->hunk->type & NGX_HUNK_FLUSH|NGX_HUNK_RECYCLED) - flush = size; - - if (ch->hunk->type & NGX_HUNK_LAST) - last = 1; - } - conf = (ngx_http_write_filter_conf_t *) - ngx_get_module_loc_conf(r->main ? r->main : r, - ngx_http_write_filter_module); - - if (!last && flush == 0 && size < conf->buffer_output) - return NGX_OK; - chain = ngx_event_write(r->connection, ctx->out, flush); - if (chain == (ngx_chain_t *) -1) - return NGX_ERROR; - ctx->out = chain; - - ngx_log_debug(r->connection->log, "write filter %x" _ chain); - - return (chain ? NGX_AGAIN : NGX_OK); -} static void *ngx_http_ssi_filter_create_conf(ngx_pool_t *pool)