aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/http/modules/ngx_http_ssi_filter.c225
1 files changed, 93 insertions, 132 deletions
diff --git a/src/http/modules/ngx_http_ssi_filter.c b/src/http/modules/ngx_http_ssi_filter.c
index 98706a7c9..4a94a2367 100644
--- 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_conf(ngx_pool_t *pool);
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_module = {
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_commands[] = {
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_t *r, ngx_chain_t *in)
}
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;
+
+ case '<':
+ state = ssi_exclam_state;
+ length = 1;
+ break;
- else {
- state = ssi_ssi_state;
- saved_pos = NULL;
- saved_chain = NULL;
+ 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;
+
+ case '<':
+ state = ssi_exclam_state;
+ length = 1;
+ break;
- else {
- state = ssi_ssi_state;
- saved_pos = NULL;
- saved_chain = NULL;
+ 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;
+ ctx->state = ssi_command_state;
+ ctx->length = 5;
+ return NGX_SSI_FOUND;
- case ' ':
- case '\t':
- case CR:
- case LF:
+ 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_t *r, ngx_chain_t *in)
}
}
+ if (state > ssi_start_state) {
+ ngx_add_hunk_to_chain(ch->hunk);
+ }
+
ch = ch->next;
if (ch == NULL) {
ctx->state = state;
@@ -152,55 +187,24 @@ int ngx_http_ssi_filter(ngx_http_request_t *r, ngx_chain_t *in)
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;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- for (/* void */; in; in = in->next) {
-
- for (p = in->hunk->pos.mem;
- in->hunk->pos.mem < in->hunk->last.mem;
- p++)
- {
- switch (state) {
-
- case ssi_start_state:
- if (*p == '<') {
- state = ssi_exclam_state;
- save_line = p;
- }
- break;
-
- case ssi_exclam_state:
- }
- }
- }
-
-
-
-
+ if (state > ssi_start_state)
+ if (ngx_http_ssi_dup_hunk(r, ch->hunk) == NGX_ERROR)
+ return NGX_ERROR;
+}
+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
+
+ ngx_test_null(ssi_hunk, ngx_push_array);
+ ssi_hunk->ssi_hunk = dup_hunk;
+ ssi_hunk->hunk = hunk;
+ ssi_hunk->pos = NULL;
+}
@@ -213,64 +217,21 @@ int ngx_http_ssi_filter(ngx_http_request_t *r, ngx_chain_t *in)
- 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)