mirror of
https://github.com/nginx/nginx.git
synced 2025-01-22 14:23:18 -06:00
nginx-0.0.1-2004-01-27-10:08:39 import
This commit is contained in:
parent
f0d7ac8a2c
commit
ba90f581f4
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user