1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#ifndef _NGX_HTTP_SSI_FILTER_H_INCLUDED_
9e18a033bSKonstantin Ananyev#define _NGX_HTTP_SSI_FILTER_H_INCLUDED_
10e18a033bSKonstantin Ananyev
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyev#include <ngx_config.h>
13e18a033bSKonstantin Ananyev#include <ngx_core.h>
14e18a033bSKonstantin Ananyev#include <ngx_http.h>
15e18a033bSKonstantin Ananyev
16e18a033bSKonstantin Ananyev
17e18a033bSKonstantin Ananyev#define NGX_HTTP_SSI_MAX_PARAMS       16
18e18a033bSKonstantin Ananyev
19e18a033bSKonstantin Ananyev#define NGX_HTTP_SSI_COMMAND_LEN      32
20e18a033bSKonstantin Ananyev#define NGX_HTTP_SSI_PARAM_LEN        32
21e18a033bSKonstantin Ananyev#define NGX_HTTP_SSI_PARAMS_N         4
22e18a033bSKonstantin Ananyev
23e18a033bSKonstantin Ananyev
24e18a033bSKonstantin Ananyev#define NGX_HTTP_SSI_COND_IF          1
25e18a033bSKonstantin Ananyev#define NGX_HTTP_SSI_COND_ELSE        2
26e18a033bSKonstantin Ananyev
27e18a033bSKonstantin Ananyev
28e18a033bSKonstantin Ananyev#define NGX_HTTP_SSI_NO_ENCODING      0
29e18a033bSKonstantin Ananyev#define NGX_HTTP_SSI_URL_ENCODING     1
30e18a033bSKonstantin Ananyev#define NGX_HTTP_SSI_ENTITY_ENCODING  2
31e18a033bSKonstantin Ananyev
32e18a033bSKonstantin Ananyev
33e18a033bSKonstantin Ananyevtypedef struct {
34e18a033bSKonstantin Ananyev    ngx_hash_t                hash;
35e18a033bSKonstantin Ananyev    ngx_hash_keys_arrays_t    commands;
36e18a033bSKonstantin Ananyev} ngx_http_ssi_main_conf_t;
37e18a033bSKonstantin Ananyev
38e18a033bSKonstantin Ananyev
39e18a033bSKonstantin Ananyevtypedef struct {
40e18a033bSKonstantin Ananyev    ngx_buf_t                *buf;
41e18a033bSKonstantin Ananyev
42e18a033bSKonstantin Ananyev    u_char                   *pos;
43e18a033bSKonstantin Ananyev    u_char                   *copy_start;
44e18a033bSKonstantin Ananyev    u_char                   *copy_end;
45e18a033bSKonstantin Ananyev
46e18a033bSKonstantin Ananyev    ngx_uint_t                key;
47e18a033bSKonstantin Ananyev    ngx_str_t                 command;
48e18a033bSKonstantin Ananyev    ngx_array_t               params;
49e18a033bSKonstantin Ananyev    ngx_table_elt_t          *param;
50e18a033bSKonstantin Ananyev    ngx_table_elt_t           params_array[NGX_HTTP_SSI_PARAMS_N];
51e18a033bSKonstantin Ananyev
52e18a033bSKonstantin Ananyev    ngx_chain_t              *in;
53e18a033bSKonstantin Ananyev    ngx_chain_t              *out;
54e18a033bSKonstantin Ananyev    ngx_chain_t             **last_out;
55e18a033bSKonstantin Ananyev    ngx_chain_t              *busy;
56e18a033bSKonstantin Ananyev    ngx_chain_t              *free;
57e18a033bSKonstantin Ananyev
58e18a033bSKonstantin Ananyev    ngx_uint_t                state;
59e18a033bSKonstantin Ananyev    ngx_uint_t                saved_state;
60e18a033bSKonstantin Ananyev    size_t                    saved;
61e18a033bSKonstantin Ananyev    size_t                    looked;
62e18a033bSKonstantin Ananyev
63e18a033bSKonstantin Ananyev    size_t                    value_len;
64e18a033bSKonstantin Ananyev
65e18a033bSKonstantin Ananyev    ngx_list_t               *variables;
66e18a033bSKonstantin Ananyev    ngx_array_t              *blocks;
67e18a033bSKonstantin Ananyev
68e18a033bSKonstantin Ananyev#if (NGX_PCRE)
69e18a033bSKonstantin Ananyev    ngx_uint_t                ncaptures;
70e18a033bSKonstantin Ananyev    int                      *captures;
71e18a033bSKonstantin Ananyev    u_char                   *captures_data;
72e18a033bSKonstantin Ananyev#endif
73e18a033bSKonstantin Ananyev
74e18a033bSKonstantin Ananyev    unsigned                  conditional:2;
75e18a033bSKonstantin Ananyev    unsigned                  encoding:2;
76e18a033bSKonstantin Ananyev    unsigned                  block:1;
77e18a033bSKonstantin Ananyev    unsigned                  output:1;
78e18a033bSKonstantin Ananyev    unsigned                  output_chosen:1;
79e18a033bSKonstantin Ananyev
80e18a033bSKonstantin Ananyev    ngx_http_request_t       *wait;
81e18a033bSKonstantin Ananyev    void                     *value_buf;
82e18a033bSKonstantin Ananyev    ngx_str_t                 timefmt;
83e18a033bSKonstantin Ananyev    ngx_str_t                 errmsg;
84e18a033bSKonstantin Ananyev} ngx_http_ssi_ctx_t;
85e18a033bSKonstantin Ananyev
86e18a033bSKonstantin Ananyev
87e18a033bSKonstantin Ananyevtypedef ngx_int_t (*ngx_http_ssi_command_pt) (ngx_http_request_t *r,
88e18a033bSKonstantin Ananyev    ngx_http_ssi_ctx_t *ctx, ngx_str_t **);
89e18a033bSKonstantin Ananyev
90e18a033bSKonstantin Ananyev
91e18a033bSKonstantin Ananyevtypedef struct {
92e18a033bSKonstantin Ananyev    ngx_str_t                 name;
93e18a033bSKonstantin Ananyev    ngx_uint_t                index;
94e18a033bSKonstantin Ananyev
95e18a033bSKonstantin Ananyev    unsigned                  mandatory:1;
96e18a033bSKonstantin Ananyev    unsigned                  multiple:1;
97e18a033bSKonstantin Ananyev} ngx_http_ssi_param_t;
98e18a033bSKonstantin Ananyev
99e18a033bSKonstantin Ananyev
100e18a033bSKonstantin Ananyevtypedef struct {
101e18a033bSKonstantin Ananyev    ngx_str_t                 name;
102e18a033bSKonstantin Ananyev    ngx_http_ssi_command_pt   handler;
103e18a033bSKonstantin Ananyev    ngx_http_ssi_param_t     *params;
104e18a033bSKonstantin Ananyev
105e18a033bSKonstantin Ananyev    unsigned                  conditional:2;
106e18a033bSKonstantin Ananyev    unsigned                  block:1;
107e18a033bSKonstantin Ananyev    unsigned                  flush:1;
108e18a033bSKonstantin Ananyev} ngx_http_ssi_command_t;
109e18a033bSKonstantin Ananyev
110e18a033bSKonstantin Ananyev
111e18a033bSKonstantin Ananyevextern ngx_module_t  ngx_http_ssi_filter_module;
112e18a033bSKonstantin Ananyev
113e18a033bSKonstantin Ananyev
114e18a033bSKonstantin Ananyev#endif /* _NGX_HTTP_SSI_FILTER_H_INCLUDED_ */
115