Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2004-01-27 10:08:39 +0300
committerIgor Sysoev <igor@sysoev.ru>2004-01-27 10:08:39 +0300
commitba90f581f447fde1786d8bc17d91f137b154febc (patch)
tree77b1b45f0fc8a862e42dad66e8321a66f1750b73 /src/http/modules/ngx_http_ssi_filter.c
parentf0d7ac8a2c60aaaa1ddcd06f0d4c598937096177 (diff)
nginx-0.0.1-2004-01-27-10:08:39 import
Diffstat (limited to 'src/http/modules/ngx_http_ssi_filter.c')
-rw-r--r--src/http/modules/ngx_http_ssi_filter.c190
1 files changed, 127 insertions, 63 deletions
diff --git a/src/http/modules/ngx_http_ssi_filter.c b/src/http/modules/ngx_http_ssi_filter.c
index 13c11f0ce..0972523d6 100644
--- a/src/http/modules/ngx_http_ssi_filter.c
+++ b/src/http/modules/ngx_http_ssi_filter.c
@@ -16,6 +16,7 @@
typedef struct {
int enable;
+ ssize_t value_len;
} ngx_http_ssi_conf_t;
@@ -26,23 +27,43 @@ typedef struct {
char *last;
char *pos;
- ngx_table_elt_t *param;
ngx_str_t command;
ngx_array_t params;
- int state;
+ ngx_table_elt_t *param;
ngx_chain_t *in;
- ngx_chain_t *current;
ngx_chain_t *out;
ngx_chain_t **last_out;
ngx_chain_t *busy;
- size_t prev;
-
- u_int value_len;
+ int state;
+ size_t saved;
+ ngx_int_t err;
} ngx_http_ssi_ctx_t;
+typedef enum {
+ ssi_start_state = 0,
+ ssi_tag_state,
+ ssi_comment0_state,
+ ssi_comment1_state,
+ ssi_sharp_state,
+ ssi_precommand_state,
+ ssi_command_state,
+ ssi_preparam_state,
+ ssi_param_state,
+ ssi_preequal_state,
+ ssi_prevalue_state,
+ ssi_double_quoted_value_state,
+ ssi_double_quoted_value_quote_state,
+ ssi_quoted_value_state,
+ ssi_quoted_value_quote_state,
+ ssi_error_state,
+ ssi_comment_end0_state,
+ ssi_comment_end1_state
+} ngx_http_ssi_state_e;
+
+
static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
ngx_http_ssi_ctx_t *ctx);
static void *ngx_http_ssi_create_conf(ngx_conf_t *cf);
@@ -94,7 +115,7 @@ static int (*ngx_http_next_body_filter) (ngx_http_request_t *r, ngx_chain_t *in)
-static char comment_string[] = "<!--";
+static char ssi_string[] = "<!--#";
static char error_string[] = "[an error occurred while processing "
"the directive]";
@@ -114,7 +135,6 @@ static int ngx_http_ssi_header_filter(ngx_http_request_t *r)
sizeof(ngx_http_ssi_ctx_t), NGX_ERROR);
ctx->last_out = &ctx->out;
- /* STUB: conf */ ctx->value_len = 200;
r->headers_out.content_length_n = -1;
if (r->headers_out.content_length) {
@@ -136,6 +156,7 @@ static int ngx_http_ssi_header_filter(ngx_http_request_t *r)
static int ngx_http_ssi_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
{
+ size_t len;
ngx_int_t rc;
ngx_hunk_t *hunk;
ngx_chain_t *cl, *tl;
@@ -153,45 +174,71 @@ static int ngx_http_ssi_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
if (ngx_chain_add_copy(r->pool, &ctx->in, in) == NGX_ERROR) {
return NGX_ERROR;
}
-
- if (ctx->current == NULL) {
- ctx->current = ctx->in;
- }
}
- while (ctx->current) {
+ while (ctx->in) {
if (ctx->buf == NULL) {
- ctx->buf = ctx->current->hunk;
- ctx->current = ctx->current->next;
+ ctx->buf = ctx->in->hunk;
+ ctx->in = ctx->in->next;
ctx->start = ctx->buf->pos;
ctx->pos = ctx->buf->pos;
ctx->last = ctx->buf->pos;
+
+ if (ctx->saved) {
+ len = ctx->buf->last - ctx->buf->pos;
+ if (len > 5 - ctx->saved) {
+ len = 5 - ctx->saved;
+ }
+
+ if (ngx_strncmp(ctx->buf->pos, &ssi_string[ctx->saved], len)
+ == 0)
+ {
+ if (len < 5 - ctx->saved) {
+ ctx->buf = NULL;
+ continue;
+
+ } else {
+ ctx->saved = 0;
+ ctx->pos += len;
+ ctx->state = ssi_precommand_state;
+ }
+ }
+ }
}
while (ctx->pos < ctx->buf->last) {
+
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "saved: %d", ctx->saved);
+
rc = ngx_http_ssi_parse(r, ctx);
if (rc == NGX_ERROR) {
return rc;
} else if (rc == NGX_HTTP_SSI_COPY) {
- if (ctx->prev) {
+
+ ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "saved: %d copy: %d",
+ ctx->saved, ctx->last - ctx->start);
+
+ if (ctx->saved) {
if (!(hunk = ngx_calloc_hunk(r->pool))) {
return NGX_ERROR;
}
hunk->type = NGX_HUNK_IN_MEMORY|NGX_HUNK_TEMP;
- hunk->pos = comment_string;
- hunk->last = comment_string + ctx->prev;
+ hunk->pos = ssi_string;
+ hunk->last = ssi_string + ctx->saved;
ngx_alloc_link_and_set_hunk(cl, hunk, r->pool, NGX_ERROR);
*ctx->last_out = cl;
ctx->last_out = &cl->next;
- ctx->prev = 0;
+ ctx->saved = 0;
}
if (!(hunk = ngx_calloc_hunk(r->pool))) {
@@ -209,7 +256,7 @@ static int ngx_http_ssi_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
ctx->last_out = &cl->next;
if (ctx->pos == ctx->buf->last) {
- ctx->prev = ctx->buf->last - ctx->last;
+ ctx->saved = ctx->pos - ctx->last;
}
continue;
@@ -343,33 +390,16 @@ static int ngx_http_ssi_copy_opcode(ngx_http_request_t *r,
static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
ngx_http_ssi_ctx_t *ctx)
{
- char *p, *last, *end, ch;
-
- enum {
- ssi_start_state = 0,
- ssi_tag_state,
- ssi_comment0_state,
- ssi_comment1_state,
- ssi_sharp_state,
- ssi_precommand_state,
- ssi_command_state,
- ssi_preparam_state,
- ssi_param_state,
- ssi_preequal_state,
- ssi_prevalue_state,
- ssi_double_quoted_value_state,
- ssi_double_quoted_value_quote_state,
- ssi_quoted_value_state,
- ssi_quoted_value_quote_state,
- ssi_comment_end0_state,
- ssi_comment_end1_state
- } state;
+ char *p, *last, *end, ch;
+ ngx_http_ssi_conf_t *conf;
+ ngx_http_ssi_state_e state;
+ conf = ngx_http_get_module_loc_conf(r, ngx_http_ssi_filter_module);
state = ctx->state;
- last = ctx->last;
p = ctx->pos;
end = ctx->buf->last;
+ last = NULL;
while (p < end) {
ch = *p++;
@@ -378,21 +408,20 @@ static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
case ssi_start_state:
- last = NULL;
-
/* a tight loop */
+
for ( ;; ) {
if (ch == '<') {
- state = ssi_tag_state;
last = p - 1;
+ state = ssi_tag_state;
break;
}
if (p == end) {
- ctx->state = ssi_start_state;
ctx->last = p;
ctx->pos = p;
+ ctx->state = ssi_start_state;
return NGX_HTTP_SSI_COPY;
}
@@ -458,9 +487,9 @@ static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
case ssi_sharp_state:
switch (ch) {
case '#':
- ctx->state = ssi_precommand_state;
ctx->last = last;
ctx->pos = p;
+ ctx->state = ssi_precommand_state;
return NGX_HTTP_SSI_COPY;
@@ -493,6 +522,7 @@ static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
ctx->command.data[0] = ch;
ctx->command.len = 1;
+ ctx->err = NGX_OK;
state = ssi_command_state;
break;
}
@@ -516,7 +546,9 @@ static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
default:
if (ctx->command.len >= NGX_HTTP_SSI_COMMAND_LEN) {
- return NGX_HTTP_SSI_INVALID_COMMAND;
+ ctx->err = NGX_HTTP_SSI_INVALID_COMMAND;
+ state = ssi_error_state;
+ break;
}
ctx->command.data[ctx->command.len++] = ch;
@@ -550,7 +582,7 @@ static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
ctx->param->key.len = 1;
ctx->param->value.data =
- ngx_palloc(r->pool, ctx->value_len + 1);
+ ngx_palloc(r->pool, conf->value_len + 1);
if (ctx->param->value.data == NULL) {
return NGX_ERROR;
}
@@ -579,7 +611,9 @@ static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
default:
if (ctx->param->key.len >= NGX_HTTP_SSI_PARAM_LEN) {
- return NGX_HTTP_SSI_INVALID_PARAM;
+ ctx->err = NGX_HTTP_SSI_INVALID_PARAM;
+ state = ssi_error_state;
+ break;
}
ctx->param->key.data[ctx->param->key.len++] = ch;
@@ -600,7 +634,9 @@ static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
break;
default:
- return NGX_HTTP_SSI_INVALID_PARAM;
+ ctx->err = NGX_HTTP_SSI_INVALID_PARAM;
+ state = ssi_error_state;
+ break;
}
break;
@@ -622,7 +658,9 @@ static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
break;
default:
- return NGX_HTTP_SSI_INVALID_VALUE;
+ ctx->err = NGX_HTTP_SSI_INVALID_VALUE;
+ state = ssi_error_state;
+ break;
}
break;
@@ -638,8 +676,10 @@ static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
break;
default:
- if (ctx->param->value.len >= ctx->value_len) {
- return NGX_HTTP_SSI_LONG_VALUE;
+ if ((ssize_t) ctx->param->value.len >= conf->value_len) {
+ ctx->err = NGX_HTTP_SSI_LONG_VALUE;
+ state = ssi_error_state;
+ break;
}
ctx->param->value.data[ctx->param->value.len++] = ch;
@@ -648,8 +688,10 @@ static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
break;
case ssi_double_quoted_value_quote_state:
- if (ctx->param->value.len >= ctx->value_len) {
- return NGX_HTTP_SSI_LONG_VALUE;
+ if ((ssize_t) ctx->param->value.len >= conf->value_len) {
+ ctx->err = NGX_HTTP_SSI_LONG_VALUE;
+ state = ssi_error_state;
+ break;
}
ctx->param->value.data[ctx->param->value.len++] = ch;
@@ -668,8 +710,10 @@ static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
break;
default:
- if (ctx->param->value.len >= ctx->value_len) {
- return NGX_HTTP_SSI_LONG_VALUE;
+ if ((ssize_t) ctx->param->value.len >= conf->value_len) {
+ ctx->err = NGX_HTTP_SSI_LONG_VALUE;
+ state = ssi_error_state;
+ break;
}
ctx->param->value.data[ctx->param->value.len++] = ch;
@@ -678,8 +722,10 @@ static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
break;
case ssi_quoted_value_quote_state:
- if (ctx->param->value.len >= ctx->value_len) {
- return NGX_HTTP_SSI_LONG_VALUE;
+ if ((ssize_t) ctx->param->value.len >= conf->value_len) {
+ ctx->err = NGX_HTTP_SSI_LONG_VALUE;
+ state = ssi_error_state;
+ break;
}
ctx->param->value.data[ctx->param->value.len++] = ch;
@@ -687,6 +733,18 @@ static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
state = ssi_quoted_value_state;
break;
+ case ssi_error_state:
+ switch (ch) {
+ case '-':
+ state = ssi_comment_end1_state;
+ break;
+
+ default:
+ break;
+ }
+
+ break;
+
case ssi_comment_end0_state:
switch (ch) {
case '-':
@@ -694,7 +752,9 @@ static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
break;
default:
- return NGX_HTTP_SSI_INVALID_COMMAND;
+ ctx->err = NGX_HTTP_SSI_INVALID_COMMAND;
+ state = ssi_error_state;
+ break;
}
break;
@@ -705,10 +765,12 @@ static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
ctx->state = ssi_start_state;
ctx->start = p;
ctx->pos = p;
- return NGX_OK;
+ return ctx->err;
default:
- return NGX_HTTP_SSI_INVALID_COMMAND;
+ ctx->err = NGX_HTTP_SSI_INVALID_COMMAND;
+ state = ssi_error_state;
+ break;
}
break;
@@ -732,6 +794,7 @@ static void *ngx_http_ssi_create_conf(ngx_conf_t *cf)
}
conf->enable = NGX_CONF_UNSET;
+ conf->value_len = NGX_CONF_UNSET;
return conf;
}
@@ -744,6 +807,7 @@ static char *ngx_http_ssi_merge_conf(ngx_conf_t *cf,
ngx_http_ssi_conf_t *conf = child;
ngx_conf_merge_value(conf->enable, prev->enable, 0);
+ ngx_conf_merge_size_value(conf->value_len, prev->value_len, 256);
return NGX_CONF_OK;
}