mirror of
https://github.com/nginx/nginx.git
synced 2025-06-07 17:52:38 +08: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_t ngx_http_ssi_filter_module = {
|
||||||
NGX_HTTP_MODULE,
|
NGX_HTTP_MODULE,
|
||||||
NULL, /* create server config */
|
NULL, /* create server config */
|
||||||
ngx_http_ssi_filter_create_conf, /* create location config */
|
ngx_http_ssi_filter_create_conf, /* create location config */
|
||||||
ngx_http_ssi_filter_commands, /* module directives */
|
ngx_http_ssi_filter_commands, /* module directives */
|
||||||
NULL, /* init module */
|
NULL, /* init module */
|
||||||
NULL /* init output body filter */
|
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[] = {
|
static ngx_command_t ngx_http_ssi_filter_commands[] = {
|
||||||
|
|
||||||
{"ssi", ngx_conf_set_size_slot,
|
{"ssi", ngx_conf_set_flag_slot,
|
||||||
offsetof(ngx_http_write_filter_conf_t, buffer_output),
|
offsetof(ngx_http_ssi_filter_conf_t, on),
|
||||||
NGX_HTTP_LOC_CONF, NGX_CONF_TAKE1,
|
NGX_HTTP_LOC_CONF, NGX_CONF_FLAG,
|
||||||
"set write filter size to buffer output"},
|
"enable ssi filter"},
|
||||||
|
|
||||||
{NULL}
|
{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 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_chain_t *ch, **prev, *chain;
|
||||||
ngx_http_ssi_filter_ctx_t *ctx;
|
ngx_http_ssi_filter_ctx_t *ctx;
|
||||||
ngx_http_ssi_filter_conf_t *conf;
|
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;
|
state = ctx->state;
|
||||||
|
length = ctx->length;
|
||||||
|
|
||||||
ch = in;
|
ch = in;
|
||||||
p = ch->hunk->pos.mem;
|
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 ( ;; ) {
|
for ( ;; ) {
|
||||||
|
|
||||||
if (state == ssi_start_state) {
|
if (state == ssi_start_state) {
|
||||||
for (/* void */ ; p < ch->hunk->last.mem; p++) {
|
for (/* void */ ; p < ch->hunk->last.mem; p++) {
|
||||||
if (*p == '<') {
|
if (*p == '<') {
|
||||||
state = ssi_exclam_state;
|
state = ssi_exclam_state;
|
||||||
saved_pos = p;
|
length = 1;
|
||||||
saved_chain = ch;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (/* void */ ;
|
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++)
|
p++)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (*p == '<') {
|
|
||||||
state = ssi_exclam_state;
|
|
||||||
saved_pos = p;
|
|
||||||
saved_chain = ch;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
|
|
||||||
case ssi_exclam_state:
|
case ssi_exclam_state:
|
||||||
if (*p == '!') {
|
switch (*p) {
|
||||||
state = ssi_dash1_state;
|
|
||||||
|
|
||||||
else {
|
case '!':
|
||||||
state = ssi_ssi_state;
|
state = ssi_dash1_state;
|
||||||
saved_pos = NULL;
|
length = 2;
|
||||||
saved_chain = NULL;
|
break;
|
||||||
|
|
||||||
|
case '<':
|
||||||
|
state = ssi_exclam_state;
|
||||||
|
length = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
state = ssi_start_state;
|
||||||
|
length = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ssi_dash1_state:
|
case ssi_dash1_state:
|
||||||
if (*p == '-') {
|
switch (*p) {
|
||||||
state = ssi_dash2_state;
|
|
||||||
|
|
||||||
else {
|
case '-':
|
||||||
state = ssi_ssi_state;
|
state = ssi_dash2_state;
|
||||||
saved_pos = NULL;
|
length = 3;
|
||||||
saved_chain = NULL;
|
break;
|
||||||
|
|
||||||
|
case '<':
|
||||||
|
state = ssi_exclam_state;
|
||||||
|
length = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
state = ssi_start_state;
|
||||||
|
length = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ssi_dash2_state:
|
case ssi_dash2_state:
|
||||||
if (*p == '-') {
|
switch (*p) {
|
||||||
state = ssi_sharp_state;
|
|
||||||
|
|
||||||
else {
|
case '-':
|
||||||
state = ssi_ssi_state;
|
state = ssi_sharp_state;
|
||||||
saved_pos = NULL;
|
length = 4;
|
||||||
saved_chain = NULL;
|
break;
|
||||||
|
|
||||||
|
case '<':
|
||||||
|
state = ssi_exclam_state;
|
||||||
|
length = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
state = ssi_start_state;
|
||||||
|
length = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ssi_sharp_state:
|
case ssi_sharp_state:
|
||||||
switch (*p) {
|
switch (*p) {
|
||||||
case '#':
|
|
||||||
state = ssi_command_state;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ' ':
|
case '#':
|
||||||
case '\t':
|
ctx->state = ssi_command_state;
|
||||||
case CR:
|
ctx->length = 5;
|
||||||
case LF:
|
return NGX_SSI_FOUND;
|
||||||
|
|
||||||
|
case '<':
|
||||||
|
state = ssi_exclam_state;
|
||||||
|
length = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
state = ssi_ssi_state;
|
state = ssi_start_state;
|
||||||
saved_pos = NULL;
|
length = 0;
|
||||||
saved_chain = NULL;
|
|
||||||
break;
|
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;
|
ch = ch->next;
|
||||||
if (ch == NULL) {
|
if (ch == NULL) {
|
||||||
ctx->state = state;
|
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;
|
p = ch->hunk->pos.mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (p = saved_pos, ch = saved_chain;
|
if (state > ssi_start_state)
|
||||||
ch;
|
if (ngx_http_ssi_dup_hunk(r, ch->hunk) == NGX_ERROR)
|
||||||
ch = ch->next, p = ch->hunk->pos.mem)
|
return NGX_ERROR;
|
||||||
{
|
|
||||||
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:
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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)
|
static void *ngx_http_ssi_filter_create_conf(ngx_pool_t *pool)
|
||||||
|
Loading…
Reference in New Issue
Block a user