mirror of
https://github.com/nginx/nginx.git
synced 2024-11-21 16:28:40 +00:00
nginx-0.0.1-2002-09-18-20:32:22 import
This commit is contained in:
parent
d4324e62a7
commit
4879b85235
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user