changeset 125:885ffb8cc32a

nginx-0.0.1-2003-08-06-09:30:51 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 06 Aug 2003 05:30:51 +0000
parents 842a78cebbb7
children fcc79370b9a8
files src/http/modules/ngx_http_ssi_filter.c
diffstat 1 files changed, 45 insertions(+), 272 deletions(-) [+]
line wrap: on
line diff
--- a/src/http/modules/ngx_http_ssi_filter.c
+++ b/src/http/modules/ngx_http_ssi_filter.c
@@ -1,306 +1,79 @@
 
 #include <ngx_config.h>
 #include <ngx_core.h>
-#include <ngx_hunk.h>
-#include <ngx_event_write.h>
 #include <ngx_http.h>
-#include <ngx_http_config.h>
+
+
+typedef struct {
+} ngx_http_ssi_filter_ctx_t;
 
 
-static ngx_command_t ngx_http_ssi_filter_commands[];
+static int ngx_http_ssi_filter_init(ngx_cycle_t *cycle);
 
-static void *ngx_http_ssi_filter_create_conf(ngx_pool_t *pool);
+    
+static ngx_http_module_t  ngx_http_ssi_filter_module_ctx = {
+    NULL,                                  /* create main configuration */
+    NULL,                                  /* init main configuration */
 
-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 */
-    NULL,                                  /* init module */
-    NULL                                   /* init output body filter */
-};
+    NULL,                                  /* create server configuration */
+    NULL,                                  /* merge server configuration */
+
+    NULL,                                  /* create location configuration */
+    NULL,                                  /* merge location configuration */
+};  
 
 
-static ngx_command_t ngx_http_ssi_filter_commands[] = {
-
-    {"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}
-
+ngx_module_t  ngx_http_ssi_filter_module = {
+    NGX_MODULE,
+    &ngx_http_ssi_filter_module_ctx,       /* module context */
+    NULL,                                  /* module directives */
+    NGX_HTTP_MODULE,                       /* module type */
+    ngx_http_ssi_filter_init,              /* init module */
+    NULL                                   /* init child */
 };
 
 
-int ngx_http_ssi_filter(ngx_http_request_t *r, ngx_chain_t *in)
-{
-    ngx_chain_t  *ch, **prev, *chain;
-    ngx_http_ssi_filter_ctx_t  *ctx;
-    ngx_http_ssi_filter_conf_t *conf;
-
-    if (in == NULL)
-        return next_filter;
-
-    ctx = (ngx_http_ssi_filter_ctx_t *)
-                             ngx_get_module_ctx(r, ngx_http_ssi_filter_module);
-    if (ctx == NULL) {
-        ngx_http_create_ctx(r, ctx,
-                            ngx_http_ssi_filter_module,
-                            sizeof(ngx_http_ssi_filter_ctx_t));
-
-        ctx->state = &ssi_start;
-        ctx->handler = ngx_http_ssi_find_start;
-    }
-
-    ch = in;
-    ctx->start = ctx->pos = ch->hunk->pos.mem; 
-
-    for ( ;; ) {
-        if (ctx->handler(r, ctx, ch) == NGX_ERROR)
-            return NGX_ERROR;
-
-        if (ctx->pos + ctx->length == ch->hunk->last.mem) {
-            ch = ch->next;
-            if (ch == NULL)
-                break;
-
-            ctx->start = ctx->pos = ch->hunk->pos.mem; 
-        }
-    }
-}
-
+static int (*next_header_filter) (ngx_http_request_t *r);
+static int (*next_body_filter) (ngx_http_request_t *r, ngx_chain_t *ch);
 
 
-static int ngx_http_ssi_find_start(ngx_http_request_t *r,
-                                   ngx_http_ssi_filter_ctx_t *ctx,
-                                   ngx_chain_t *ch)
+static int ngx_http_ssi_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
 {
-    ngx_http_ssi_parse(r, ctx, ch->hunk);
-
-    if (ctx->state == ssi_command_state
-        || (ctx->length > 0 && ch->next == NULL)
-        || ctx->hunk_with_ssi)
-    {
-        ngx_test_null(h, ngx_palloc(r->pool, sizeof(ngx_hunk_t)), NGX_ERROR);
-#if !(HAVE_OFFSET_EQUAL_PTR)
-        h->pos.file = h->last.file = 0;
-#endif
-        h->pre_start = h->start = h->pos.mem = ctx->start;
-        h->post_end = h->end = h->last.mem = ctx->pos;
-        h->type = NGX_HUNK_TEMP;
-        h->tag = 0;
-        h->file = NULL;
 
-        ngx_add_hunk_to_chain(ctx->last, h, r->pool, NGX_ERROR);
-
-        ngx_test_null(ssi_hunk, ngx_push_array(ctx->ssi_hunks), NGX_ERROR);
-        ssi_hunk->ssi_hunk = h;
-        ssi_hunk->hunk = ch->hunk;
-        ssi_hunk->pos = NULL;
-    }
-
-    if (ctx->state == ssi_command_state)
-        ctx->handler = ngx_http_ssi_find_command;
-    }
-
-    return NGX_OK;
-}
-
-
-static int ngx_http_ssi_find_command(ngx_http_request_t *r,
-                                      ngx_http_ssi_filter_ctx_t *ctx,
-                                       ngx_chain_t *ch)
-{
-    ngx_http_ssi_parse_command(r, ctx, ch->hunk);
 }
 
 
-static char ssi_start[] = "<!--#";
-
-static char ssi_include[] = "include";
-
-static ssi_parser_t ssi_pre_command_state[] = {
-    { 1, (char *) ' ', ssi_pre_command_state, NULL },
-
-    { 7, "include", ssi_command_state, ssi_include_state },
-
-    { 4, "random", ssi_command_state, NULL },
-    { 0, NULL, ssi_error_state }
-};
-
-static ssi_parser_t ssi_include_state[] = {
-    { 1, (char *) ' ', ssi_include_state, NULL },
-    { 7, "virtual", ssi_equal_state, offsetof(ssi_include_t, virtual) },
-    { 0, NULL, ssi_error_state }
-};
-
-static ssi_parser_t ssi_equal_state[] = {
-    { 1, (char *) ' ', ssi_equal_state, NULL },
-    { 1, (char *) '=', ssi_param_state, NULL },
-};
-
-static char ssi_echo[] = "echo";
-
-static void ngx_http_ssi_parse(ngx_http_request_t *r,
-                               ngx_http_ssi_filter_ctx_t *ctx,
-                               ngx_hunk_t *hunk)
-
-
-    for ( ;; ) {
-
-        for (/* void */ ; p < ch->hunk->last.mem; p++) {
-
-            switch (state) {
-
-            case ssi_start_state:
-
-                /* tight loop */
-                while (p < ch->hunk->last.mem) {
-                    if (*p++ == '<') {
-                        state = ssi_comment_state;
-                        length = 1;
-                        break;
-                    }
-                }
-
-                /* fall through */
-
-            case ssi_comment_state:
-
-                if (*p == ssi_start[length]) {
-                    length++;
-
-                } else {
-                    length = 0;
-                    flush = 1;
-                    state = ssi_start_state;
-                }
-
-                if (length < 6)
-                    continue;
-
-                state = ssi_space_before_command_state;
+static void ngx_http_ssi_parse()
+{
+    for ( ) {
+        switch (state) {
+        case ssi_start_state:
 
-                /* fall through */
-
-            case ssi_space_before_command_state:
-
-                if (*p == ' ' || *p == '\t' || *p == CR || *p == LF)
-                     continue;
-
-                state = ssi_command_state;
-
-                /* fall through */
-
-            case ssi_choose_command_state:
-
-                for (i = 0; ctx->name[i].len; i++) {
-                    if (*p == ctx->name[i].name[0]) {
-                        state = choos[i].state;
-                    }
+            /* tight loop */
+            while (p < h->last) {
+                if (*p++ == '<') {
+                    state = ssi_comment_state;
+                    length = 1;
+                    break;
                 }
-
-            case ssi_command_state:
-                if (*p == ssi_include[n];
-                    n++;
-
-                break;
-
             }
-        }
-
-            if (length == 6
-                || (length > 0 && ch->next == NULL)
-                || hunk_with_ssi) {
 
-                if (ctx->saved > 0 && flush) {
-                    add saved
-                    ctx->saved = 0;
-                }
-
-                for (c = ctx->in; c != hunk; c = c->next) {
-                    ngx_add_hunk_to_chain(ctx->last, c->hunk,
-                                          r->pool, NGX_ERROR);
-                }
-
-                add duped;
-                push duped_hunk, hunk, NULL;
+            /* fall through */
 
-                n = length - (hunk->last.mem - pos);
-                for (c = hunk; c; c->next) {
-                    if (n > c->hunk->last.mem - c->hunk->pos.mem) {
-                        n -= c->hunk->last.mem - c->hunk->pos.mem;
-                        push NULL, c->hunk, NULL;
-                    }
-                }
-
-                ctx->in = c;
-            }
-        }
-
-    } else {
-
-        for (/* void */ ; p < ch->hunk->last.mem; p++) {
-            if (*p == ' ' || *p == '\t' || *p == CR || *P == LF)
-                continue;
-
-            ctx->state = ssi_command_state;
+        case ssi_comment_state:
             break;
-        }
-
-        if (
 
     }
 }
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+static int ngx_http_ssi_filter_init(ngx_cycle_t *cycle)
+{
+    next_header_filter = ngx_http_top_header_filter;
+    ngx_http_top_header_filter = ngx_http_ssi_header_filter;
 
-
-
-
-
-
-
-
-
-
-
-
+    next_body_filter = ngx_http_top_body_filter;
+    ngx_http_top_body_filter = ngx_http_ssi_body_filter;
 
-static void *ngx_http_ssi_filter_create_conf(ngx_pool_t *pool)
-{
-    ngx_http_ssi_filter_conf_t *conf;
-
-    ngx_test_null(conf,
-                  ngx_palloc(pool, sizeof(ngx_http_ssi_filter_conf_t)),
-                  NULL);
-
-    conf->buffer_output = NGX_CONF_UNSET;
-
-    return conf;
+    return NGX_OK;
 }