nginx-0.0.1-2002-09-18-20:32:22 import

This commit is contained in:
Igor Sysoev 2002-09-18 16:32:22 +00:00
parent d4324e62a7
commit 4879b85235

View File

@ -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 == '!') {
state = ssi_dash1_state;
switch (*p) {
else {
state = ssi_ssi_state;
saved_pos = NULL;
saved_chain = NULL;
case '!':
state = ssi_dash1_state;
length = 2;
break;
case '<':
state = ssi_exclam_state;
length = 1;
break;
default:
state = ssi_start_state;
length = 0;
break;
}
break;
case ssi_dash1_state:
if (*p == '-') {
state = ssi_dash2_state;
switch (*p) {
else {
state = ssi_ssi_state;
saved_pos = NULL;
saved_chain = NULL;
case '-':
state = ssi_dash2_state;
length = 3;
break;
case '<':
state = ssi_exclam_state;
length = 1;
break;
default:
state = ssi_start_state;
length = 0;
break;
}
break;
case ssi_dash2_state:
if (*p == '-') {
state = ssi_sharp_state;
switch (*p) {
else {
state = ssi_ssi_state;
saved_pos = NULL;
saved_chain = NULL;
case '-':
state = ssi_sharp_state;
length = 4;
break;
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_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,125 +187,51 @@ 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;
}
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) {
case ssi_start_state:
if (*p == '<') {
state = ssi_exclam_state;
save_line = p;
}
break;
case ssi_exclam_state:
}
}
}
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 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;
}
static void *ngx_http_ssi_filter_create_conf(ngx_pool_t *pool)