annotate src/http/modules/ngx_http_ssi_filter_module.c @ 50:72eb30262aac NGINX_0_1_25

nginx 0.1.25 *) Bugfix: nginx did run on Linux parisc. *) Feature: nginx now does not start under FreeBSD if the sysctl kern.ipc.somaxconn value is too big. *) Bugfix: if a request was internally redirected by the ngx_http_index_module module to the ngx_http_proxy_module or ngx_http_fastcgi_module modules, then the index file was not closed after request completion. *) Feature: the "proxy_pass" can be used in location with regular expression. *) Feature: the ngx_http_rewrite_filter_module module supports the condition like "if ($HTTP_USER_AGENT ~ MSIE)". *) Bugfix: nginx started too slow if the large number of addresses and text values were used in the "geo" directive. *) Change: a variable name must be declared as "$name" in the "geo" directive. The previous variant without "$" is still supported, but will be removed soon. *) Feature: the "%{VARIABLE}v" logging parameter. *) Feature: the "set $name value" directive. *) Bugfix: gcc 4.0 compatibility. *) Feature: the --with-openssl-opt=OPTIONS autoconfiguration directive.
author Igor Sysoev <http://sysoev.ru>
date Sat, 19 Mar 2005 00:00:00 +0300
parents src/http/modules/ngx_http_ssi_filter.c@6cfc63e68377
children b55cbf18157e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11 #define NGX_HTTP_SSI_MAX_PARAMS 16
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13 #define NGX_HTTP_SSI_COMMAND_LEN 31
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
14 #define NGX_HTTP_SSI_PARAM_LEN 31
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 #define NGX_HTTP_SSI_PARAMS_N 4
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17 #define NGX_HTTP_SSI_ERROR 1
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20 typedef struct {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21 ngx_flag_t enable;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22 ngx_flag_t silent_errors;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24 size_t min_file_chunk;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25 size_t value_len;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26 } ngx_http_ssi_conf_t;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29 typedef struct {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30 ngx_buf_t *buf;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
31
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32 u_char *pos;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
33 u_char *copy_start;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34 u_char *copy_end;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 ngx_str_t command;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37 ngx_array_t params;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38 ngx_table_elt_t *param;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39 ngx_table_elt_t params_array[NGX_HTTP_SSI_PARAMS_N];
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41 ngx_chain_t *in;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42 ngx_chain_t *out;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43 ngx_chain_t **last_out;
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
44 ngx_chain_t *busy;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
45 ngx_chain_t *free;
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47 ngx_uint_t state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
48 ngx_uint_t saved_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
49 size_t saved;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50 size_t looked;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52 size_t value_len;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53 } ngx_http_ssi_ctx_t;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
54
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56 typedef ngx_int_t (*ngx_http_ssi_command_pt) (ngx_http_request_t *r,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57 ngx_http_ssi_ctx_t *ctx, ngx_str_t **);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60 typedef struct {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61 ngx_str_t name;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62 ngx_uint_t index;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64 ngx_uint_t mandatory;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
65 } ngx_http_ssi_param_t;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
68 typedef struct {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
69 ngx_str_t name;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70 ngx_http_ssi_command_pt handler;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 ngx_http_ssi_param_t *params;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73 ngx_uint_t flush; /* unsigned flush:1; */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74 } ngx_http_ssi_command_t;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77 typedef enum {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78 ssi_start_state = 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79 ssi_tag_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
80 ssi_comment0_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81 ssi_comment1_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
82 ssi_sharp_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83 ssi_precommand_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84 ssi_command_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85 ssi_preparam_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86 ssi_param_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87 ssi_preequal_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88 ssi_prevalue_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89 ssi_double_quoted_value_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90 ssi_quoted_value_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
91 ssi_quoted_symbol_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
92 ssi_postparam_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
93 ssi_comment_end0_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94 ssi_comment_end1_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95 ssi_error_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
96 ssi_error_end0_state,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
97 ssi_error_end1_state
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
98 } ngx_http_ssi_state_e;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101 static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102 ngx_http_ssi_ctx_t *ctx);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104 static ngx_int_t ngx_http_ssi_echo(ngx_http_request_t *r,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105 ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107 static void *ngx_http_ssi_create_conf(ngx_conf_t *cf);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108 static char *ngx_http_ssi_merge_conf(ngx_conf_t *cf,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
109 void *parent, void *child);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110 static ngx_int_t ngx_http_ssi_filter_init(ngx_cycle_t *cycle);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113 static ngx_command_t ngx_http_ssi_filter_commands[] = {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115 { ngx_string("ssi"),
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117 ngx_conf_set_flag_slot,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
118 NGX_HTTP_LOC_CONF_OFFSET,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119 offsetof(ngx_http_ssi_conf_t, enable),
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120 NULL },
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
121
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
122 { ngx_string("ssi_silent_errors"),
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
124 ngx_conf_set_flag_slot,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125 NGX_HTTP_LOC_CONF_OFFSET,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126 offsetof(ngx_http_ssi_conf_t, silent_errors),
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127 NULL },
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129 { ngx_string("ssi_min_file_chunk"),
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
130 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
131 ngx_conf_set_size_slot,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
132 NGX_HTTP_LOC_CONF_OFFSET,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133 offsetof(ngx_http_ssi_conf_t, min_file_chunk),
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
134 NULL },
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
135
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
136 ngx_null_command
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
137 };
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
138
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
139
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
140
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
141 static ngx_http_module_t ngx_http_ssi_filter_module_ctx = {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
142 NULL, /* pre conf */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
143
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
144 NULL, /* create main configuration */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
145 NULL, /* init main configuration */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
146
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147 NULL, /* create server configuration */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
148 NULL, /* merge server configuration */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
149
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
150 ngx_http_ssi_create_conf, /* create location configuration */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
151 ngx_http_ssi_merge_conf /* merge location configuration */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
152 };
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
153
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
154
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
155 ngx_module_t ngx_http_ssi_filter_module = {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
156 NGX_MODULE,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
157 &ngx_http_ssi_filter_module_ctx, /* module context */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158 ngx_http_ssi_filter_commands, /* module directives */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159 NGX_HTTP_MODULE, /* module type */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
160 ngx_http_ssi_filter_init, /* init module */
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
161 NULL /* init process */
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
162 };
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
163
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
164
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
165 static ngx_int_t (*ngx_http_next_header_filter) (ngx_http_request_t *r);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
166 static ngx_int_t (*ngx_http_next_body_filter) (ngx_http_request_t *r,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
167 ngx_chain_t *in);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
168
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
169
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
170 static u_char ngx_http_ssi_string[] = "<!--";
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171 static u_char ngx_http_ssi_error_string[] =
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172 "[an error occurred while processing the directive]";
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
173
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174 static ngx_str_t ngx_http_ssi_none = ngx_string("(none)");
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
176
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
177 #define NGX_HTTP_SSI_ECHO_VAR 0
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178 #define NGX_HTTP_SSI_ECHO_DEFAULT 1
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180 static ngx_http_ssi_param_t ngx_http_ssi_echo_params[] = {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181 { ngx_string("var"), NGX_HTTP_SSI_ECHO_VAR, 1 },
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182 { ngx_string("default"), NGX_HTTP_SSI_ECHO_DEFAULT, 0 },
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
183 { ngx_null_string, 0, 0 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184 };
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
185
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187 static ngx_http_ssi_command_t ngx_http_ssi_commands[] = {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188 { ngx_string("echo"), ngx_http_ssi_echo, ngx_http_ssi_echo_params, 0 },
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189 { ngx_null_string, NULL, NULL, 0 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190 };
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193 static ngx_int_t
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194 ngx_http_ssi_header_filter(ngx_http_request_t *r)
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
195 {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
196 ngx_http_ssi_ctx_t *ctx;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
197 ngx_http_ssi_conf_t *conf;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199 conf = ngx_http_get_module_loc_conf(r, ngx_http_ssi_filter_module);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
200
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201 if (!conf->enable) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
202 return ngx_http_next_header_filter(r);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
205 /* TODO: "text/html" -> custom types */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
206
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
207 if (r->headers_out.content_type
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
208 && ngx_strncasecmp(r->headers_out.content_type->value.data,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209 "text/html", 5) != 0)
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210 {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211 return ngx_http_next_header_filter(r);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
212 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
213
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
214
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
215 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_ssi_ctx_t));
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
216 if (ctx == NULL) {
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217 return NGX_ERROR;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
218 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
219
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
220 ngx_http_set_ctx(r, ctx, ngx_http_ssi_filter_module);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
221
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
223 ctx->value_len = conf->value_len;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
224 ctx->last_out = &ctx->out;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
225
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
226 ctx->params.elts = ctx->params_array;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
227 ctx->params.size = sizeof(ngx_table_elt_t);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
228 ctx->params.nalloc = NGX_HTTP_SSI_PARAMS_N;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
229 ctx->params.pool = r->pool;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
230
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
231 r->headers_out.content_length_n = -1;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
232 if (r->headers_out.content_length) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233 r->headers_out.content_length->key.len = 0;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
234 r->headers_out.content_length = NULL;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
235 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
236
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
237 r->headers_out.last_modified_time = -1;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
238 if (r->headers_out.last_modified) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
239 r->headers_out.last_modified->key.len = 0;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240 r->headers_out.last_modified = NULL;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
241 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
242
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243 r->filter_need_in_memory = 1;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244 r->filter_ssi_need_in_memory = 1;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246 return ngx_http_next_header_filter(r);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250 static ngx_int_t
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 ngx_http_ssi_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252 {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253 ngx_int_t rc;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254 ngx_uint_t i;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255 ngx_buf_t *b;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256 ngx_chain_t *cl;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257 ngx_table_elt_t *param;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258 ngx_http_ssi_ctx_t *ctx;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
259 ngx_http_ssi_conf_t *conf;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
260 ngx_http_ssi_param_t *prm;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261 ngx_http_ssi_command_t *cmd;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
262 ngx_str_t *params[NGX_HTTP_SSI_MAX_PARAMS];
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
263
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
264 ctx = ngx_http_get_module_ctx(r, ngx_http_ssi_filter_module);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
265
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
266 if (ctx == NULL || (in == NULL && ctx->in == NULL && ctx->busy == NULL)) {
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267 return ngx_http_next_body_filter(r, in);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
269
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
270 /* add the incoming chain to the chain ctx->in */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
271
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
272 if (in) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
273 if (ngx_chain_add_copy(r->pool, &ctx->in, in) == NGX_ERROR) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
274 return NGX_ERROR;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
275 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
276 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
277
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
278 conf = ngx_http_get_module_loc_conf(r, ngx_http_ssi_filter_module);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
279
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
280 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
281 "http ssi filter");
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
282
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
283 while (ctx->in || ctx->buf) {
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
284
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
285 if (ctx->buf == NULL ){
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
286 ctx->buf = ctx->in->buf;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
287 ctx->in = ctx->in->next;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
288 ctx->pos = ctx->buf->pos;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
289 }
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
290
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
291 if (ctx->state == ssi_start_state) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
292 ctx->copy_start = ctx->pos;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
293 ctx->copy_end = ctx->pos;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
294 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
295
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
296 b = NULL;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
297
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
298 while (ctx->pos < ctx->buf->last) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
299
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
300 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
301 "saved: %d state: %d", ctx->saved, ctx->state);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
302
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
303 rc = ngx_http_ssi_parse(r, ctx);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
304
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
305 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
306 "parse: %d, looked: %d %p-%p",
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
307 rc, ctx->looked, ctx->copy_start, ctx->copy_end);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
308
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
309 if (rc == NGX_ERROR) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
310 return rc;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
311 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
312
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
313 if (ctx->copy_start != ctx->copy_end) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
314
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
315 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
316 "saved: %d", ctx->saved);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
317
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
318 if (ctx->saved) {
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
319
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
320 if (ctx->free) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
321 cl = ctx->free;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
322 ctx->free = ctx->free->next;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
323 b = cl->buf;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
324 ngx_memzero(b, sizeof(ngx_buf_t));
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
325
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
326 } else {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
327 b = ngx_calloc_buf(r->pool);
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
328 if (b == NULL) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
329 return NGX_ERROR;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
330 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
331
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
332 cl = ngx_alloc_chain_link(r->pool);
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
333 if (cl == NULL) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
334 return NGX_ERROR;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
335 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
336
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
337 cl->buf = b;
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
338 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
339
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
340 b->memory = 1;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
341 b->pos = ngx_http_ssi_string;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
342 b->last = ngx_http_ssi_string + ctx->saved;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
343
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
344 *ctx->last_out = cl;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
345 ctx->last_out = &cl->next;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
346
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
347 ctx->saved = 0;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
348 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
349
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
350 if (ctx->free) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
351 cl = ctx->free;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
352 ctx->free = ctx->free->next;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
353 b = cl->buf;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
354
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
355 } else {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
356 b = ngx_alloc_buf(r->pool);
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
357 if (b == NULL) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
358 return NGX_ERROR;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
359 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
360
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
361 cl = ngx_alloc_chain_link(r->pool);
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
362 if (cl == NULL) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
363 return NGX_ERROR;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
364 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
365
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
366 cl->buf = b;
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
367 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
368
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
369 ngx_memcpy(b, ctx->buf, sizeof(ngx_buf_t));
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
370
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
371 b->last_buf = 0;
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
372 b->recycled = 0;
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
373 b->pos = ctx->copy_start;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
374 b->last = ctx->copy_end;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
375
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
376 if (b->in_file) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
377
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
378 if (conf->min_file_chunk < (size_t) (b->last - b->pos)) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
379 b->file_last = b->file_pos + (b->last - b->start);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
380 b->file_pos += b->pos - b->start;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
381
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
382 } else {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
383 b->in_file = 0;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
384 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
385 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
386
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
387 cl->next = NULL;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
388 *ctx->last_out = cl;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
389 ctx->last_out = &cl->next;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
390 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
391
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
392 if (ctx->state == ssi_start_state) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
393 ctx->copy_start = ctx->pos;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
394 ctx->copy_end = ctx->pos;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
395
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
396 } else {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
397 ctx->copy_start = NULL;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
398 ctx->copy_end = NULL;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
399 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
400
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
401 if (rc == NGX_AGAIN) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
402 continue;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
403 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
404
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
405
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
406 if (rc == NGX_OK) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
407
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
408 for (cmd = ngx_http_ssi_commands; cmd->handler; cmd++) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
409 if (cmd->name.len == 0) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
410 cmd = (ngx_http_ssi_command_t *) cmd->handler;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
411 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
412
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
413 if (cmd->name.len != ctx->command.len
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
414 || ngx_strncmp(cmd->name.data, ctx->command.data,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
415 ctx->command.len) != 0)
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
416 {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
417 continue;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
418 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
419
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
420 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
421 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
422
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
423 if (cmd->name.len == 0) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
424 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
425 "invalid SSI command: \"%V\"", &ctx->command);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
426 goto ssi_error;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
427 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
428
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
429 ngx_memzero(params,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
430 NGX_HTTP_SSI_MAX_PARAMS * sizeof(ngx_str_t *));
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
431
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
432 param = ctx->params.elts;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
433
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
434
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
435 for (i = 0; i < ctx->params.nelts; i++) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
436
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
437 for (prm = cmd->params; prm->name.len; prm++) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
438
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
439 if (param[i].key.len != prm->name.len
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
440 || ngx_strncmp(param[i].key.data, prm->name.data,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
441 prm->name.len) != 0)
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
442 {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
443 continue;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
444 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
445
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
446 if (params[prm->index]) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
447 ngx_log_error(NGX_LOG_ERR,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
448 r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
449 "duplicate \"%V\" parameter "
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
450 "in \"%V\" SSI command",
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
451 &param[i].key, &ctx->command);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
452
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
453 goto ssi_error;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
454 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
455
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
456 params[prm->index] = &param[i].value;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
457
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
458 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
459 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
460
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
461 if (prm->name.len == 0) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
462 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
463 "invalid parameter name: \"%V\" "
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
464 "in \"%V\" SSI command",
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
465 &param[i].key, &ctx->command);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
466
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
467 goto ssi_error;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
468 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
469 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
470
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
471 for (prm = cmd->params; prm->name.len; prm++) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
472 if (prm->mandatory && params[prm->index] == 0) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
473 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
474 "mandatory \"%V\" parameter is absent "
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
475 "in \"%V\" SSI command",
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
476 &prm->name, &ctx->command);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
477
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
478 goto ssi_error;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
479 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
480 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
481
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
482 if (cmd->handler(r, ctx, params) == NGX_OK) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
483 continue;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
484 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
485 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
486
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
487
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
488 /* rc == NGX_HTTP_SSI_ERROR */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
489
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
490 ssi_error:
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
491
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
492 if (conf->silent_errors) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
493 continue;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
494 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
495
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
496 if (ctx->free) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
497 cl = ctx->free;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
498 ctx->free = ctx->free->next;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
499 b = cl->buf;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
500 ngx_memzero(b, sizeof(ngx_buf_t));
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
501
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
502 } else {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
503 b = ngx_calloc_buf(r->pool);
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
504 if (b == NULL) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
505 return NGX_ERROR;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
506 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
507
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
508 cl = ngx_alloc_chain_link(r->pool);
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
509 if (cl == NULL) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
510 return NGX_ERROR;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
511 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
512
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
513 cl->buf = b;
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
514 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
515
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
516 b->memory = 1;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
517 b->pos = ngx_http_ssi_error_string;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
518 b->last = ngx_http_ssi_error_string
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
519 + sizeof(ngx_http_ssi_error_string) - 1;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
520
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
521 cl->next = NULL;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
522 *ctx->last_out = cl;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
523 ctx->last_out = &cl->next;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
524
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
525 continue;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
526 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
527
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
528 if (ctx->buf->recycled || ctx->buf->last_buf) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
529 if (b == NULL) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
530
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
531 if (ctx->free) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
532 cl = ctx->free;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
533 ctx->free = ctx->free->next;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
534 b = cl->buf;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
535 ngx_memzero(b, sizeof(ngx_buf_t));
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
536
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
537 } else {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
538 b = ngx_calloc_buf(r->pool);
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
539 if (b == NULL) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
540 return NGX_ERROR;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
541 }
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
542
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
543 cl = ngx_alloc_chain_link(r->pool);
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
544 if (cl == NULL) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
545 return NGX_ERROR;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
546 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
547
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
548 cl->buf = b;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
549 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
550
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
551 cl->next = NULL;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
552 *ctx->last_out = cl;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
553 ctx->last_out = &cl->next;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
554 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
555
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
556 b->last_buf = ctx->buf->last_buf;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
557 b->flush = ctx->buf->recycled;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
558 b->shadow = ctx->buf;
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
559 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
560
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
561 ctx->buf = NULL;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
562
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
563 ctx->saved = ctx->looked;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
564 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
565
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
566 if (ctx->out == NULL && ctx->busy == NULL) {
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
567 return NGX_OK;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
568 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
569
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
570 rc = ngx_http_next_body_filter(r, ctx->out);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
571
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
572 if (ctx->busy == NULL) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
573 ctx->busy = ctx->out;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
574
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
575 } else {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
576 for (cl = ctx->busy; cl->next; cl = cl->next) { /* void */ }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
577 cl->next = ctx->out;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
578 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
579
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
580 ctx->out = NULL;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
581 ctx->last_out = &ctx->out;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
582
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
583 while (ctx->busy) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
584
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
585 b = ctx->busy->buf;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
586
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
587 if (ngx_buf_size(b) != 0) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
588 break;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
589 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
590
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
591 #if (NGX_HAVE_WRITE_ZEROCOPY)
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
592 if (b->zerocopy_busy) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
593 break;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
594 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
595 #endif
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
596
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
597 if (b->shadow) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
598 b->shadow->pos = b->shadow->last;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
599 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
600
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
601 cl = ctx->busy;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
602 ctx->busy = cl->next;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
603 cl->next = ctx->free;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
604 ctx->free = cl;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
605 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
606
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
607 return rc;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
608 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
609
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
610
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
611 static ngx_int_t
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
612 ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx)
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
613 {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
614 u_char *p, *last, *copy_end, ch;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
615 size_t looked;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
616 ngx_http_ssi_state_e state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
617
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
618 state = ctx->state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
619 looked = ctx->looked;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
620 last = ctx->buf->last;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
621 copy_end = ctx->copy_end;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
622
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
623 for (p = ctx->pos; p < last; p++) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
624
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
625 ch = *p;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
626
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
627 if (state == ssi_start_state) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
628
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
629 /* the tight loop */
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
630
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
631 for ( ;; ) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
632 if (ch == '<') {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
633 copy_end = p;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
634 looked = 1;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
635 state = ssi_tag_state;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
636
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
637 goto tag_started;
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
638 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
639
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
640 if (++p == last) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
641 break;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
642 }
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
643
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
644 ch = *p;
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
645 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
646
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
647 ctx->pos = p;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
648 ctx->looked = looked;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
649 ctx->copy_end = p;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
650
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
651 if (ctx->copy_start == NULL) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
652 ctx->copy_start = ctx->buf->pos;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
653 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
654
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
655 return NGX_AGAIN;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
656
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
657 tag_started:
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
658
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
659 continue;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
660 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
661
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
662 switch (state) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
663
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
664 case ssi_start_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
665 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
666
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
667 case ssi_tag_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
668 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
669 case '!':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
670 looked = 2;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
671 state = ssi_comment0_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
672 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
673
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
674 case '<':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
675 copy_end = p;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
676 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
677
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
678 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
679 copy_end = p;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
680 looked = 0;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
681 state = ssi_start_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
682 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
683 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
684
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
685 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
686
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
687 case ssi_comment0_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
688 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
689 case '-':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
690 looked = 3;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
691 state = ssi_comment1_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
692 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
693
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
694 case '<':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
695 copy_end = p;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
696 looked = 1;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
697 state = ssi_tag_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
698 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
699
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
700 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
701 copy_end = p;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
702 looked = 0;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
703 state = ssi_start_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
704 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
705 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
706
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
707 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
708
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
709 case ssi_comment1_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
710 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
711 case '-':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
712 looked = 4;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
713 state = ssi_sharp_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
714 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
715
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
716 case '<':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
717 copy_end = p;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
718 looked = 1;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
719 state = ssi_tag_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
720 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
721
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
722 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
723 copy_end = p;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
724 looked = 0;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
725 state = ssi_start_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
726 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
727 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
728
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
729 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
730
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
731 case ssi_sharp_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
732 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
733 case '#':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
734 if (ctx->copy_start) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
735 ctx->saved = 0;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
736 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
737 looked = 0;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
738 state = ssi_precommand_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
739 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
740
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
741 case '<':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
742 copy_end = p;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
743 looked = 1;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
744 state = ssi_tag_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
745 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
746
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
747 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
748 copy_end = p;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
749 looked = 0;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
750 state = ssi_start_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
751 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
752 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
753
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
754 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
755
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
756 case ssi_precommand_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
757 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
758 case ' ':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
759 case CR:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
760 case LF:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
761 case '\t':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
762 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
763
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
764 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
765 ctx->command.len = 1;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
766 ctx->command.data = ngx_palloc(r->pool,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
767 NGX_HTTP_SSI_COMMAND_LEN + 1);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
768 if (ctx->command.data == NULL) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
769 return NGX_ERROR;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
770 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
771
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
772 ctx->command.data[0] = ch;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
773 ctx->params.nelts = 0;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
774 state = ssi_command_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
775 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
776 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
777
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
778 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
779
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
780 case ssi_command_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
781 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
782 case ' ':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
783 case CR:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
784 case LF:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
785 case '\t':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
786 state = ssi_preparam_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
787 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
788
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
789 case '-':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
790 state = ssi_comment_end0_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
791 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
792
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
793 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
794 ctx->command.data[ctx->command.len++] = ch;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
795
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
796 if (ctx->command.len == NGX_HTTP_SSI_COMMAND_LEN) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
797 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
798 "the \"%V\" SSI command is too long",
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
799 &ctx->command);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
800
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
801 state = ssi_error_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
802 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
803 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
804 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
805
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
806 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
807
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
808 case ssi_preparam_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
809 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
810 case ' ':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
811 case CR:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
812 case LF:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
813 case '\t':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
814 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
815
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
816 case '-':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
817 state = ssi_comment_end0_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
818 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
819
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
820 default:
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
821 ctx->param = ngx_array_push(&ctx->params);
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
822 if (ctx->param == NULL) {
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
823 return NGX_ERROR;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
824 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
825
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
826 ctx->param->key.len = 1;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
827 ctx->param->key.data = ngx_palloc(r->pool,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
828 NGX_HTTP_SSI_PARAM_LEN + 1);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
829 if (ctx->param->key.data == NULL) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
830 return NGX_ERROR;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
831 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
832
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
833 ctx->param->key.data[0] = ch;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
834
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
835 ctx->param->value.len = 0;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
836 ctx->param->value.data = ngx_palloc(r->pool,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
837 ctx->value_len + 1);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
838 if (ctx->param->value.data == NULL) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
839 return NGX_ERROR;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
840 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
841
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
842 state = ssi_param_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
843 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
844 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
845
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
846 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
847
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
848 case ssi_param_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
849 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
850 case ' ':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
851 case CR:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
852 case LF:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
853 case '\t':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
854 state = ssi_preequal_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
855 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
856
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
857 case '=':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
858 state = ssi_prevalue_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
859 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
860
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
861 case '-':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
862 state = ssi_error_end0_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
863
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
864 ctx->param->key.data[ctx->param->key.len++] = ch;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
865 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
866 "invalid \"%V\" parameter in \"%V\" SSI command",
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
867 &ctx->param->key, &ctx->command);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
868 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
869
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
870 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
871 ctx->param->key.data[ctx->param->key.len++] = ch;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
872
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
873 if (ctx->param->key.len == NGX_HTTP_SSI_PARAM_LEN) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
874 state = ssi_error_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
875 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
876 "too long \"%V\" parameter in "
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
877 "\"%V\" SSI command",
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
878 &ctx->param->key, &ctx->command);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
879 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
880 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
881 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
882
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
883 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
884
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
885 case ssi_preequal_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
886 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
887 case ' ':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
888 case CR:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
889 case LF:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
890 case '\t':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
891 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
892
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
893 case '=':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
894 state = ssi_prevalue_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
895 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
896
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
897 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
898 if (ch == '-') {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
899 state = ssi_error_end0_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
900 } else {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
901 state = ssi_error_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
902 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
903
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
904 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
905 "unexpected \"%c\" symbol after \"%V\" "
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
906 "parameter in \"%V\" SSI command",
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
907 ch, &ctx->param->key, &ctx->command);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
908 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
909 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
910
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
911 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
912
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
913 case ssi_prevalue_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
914 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
915 case ' ':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
916 case CR:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
917 case LF:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
918 case '\t':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
919 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
920
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
921 case '"':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
922 state = ssi_double_quoted_value_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
923 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
924
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
925 case '\'':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
926 state = ssi_quoted_value_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
927 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
928
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
929 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
930 if (ch == '-') {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
931 state = ssi_error_end0_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
932 } else {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
933 state = ssi_error_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
934 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
935
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
936 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
937 "unexpected \"%c\" symbol before value of "
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
938 "\"%V\" parameter in \"%V\" SSI command",
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
939 ch, &ctx->param->key, &ctx->command);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
940 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
941 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
942
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
943 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
944
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
945 case ssi_double_quoted_value_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
946 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
947 case '\\':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
948 ctx->saved_state = ssi_double_quoted_value_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
949 state = ssi_quoted_symbol_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
950 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
951
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
952 case '"':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
953 state = ssi_postparam_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
954 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
955
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
956 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
957 ctx->param->value.data[ctx->param->value.len++] = ch;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
958
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
959 if (ctx->param->value.len == ctx->value_len) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
960 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
961 "too long \"%V\" value of \"%V\" parameter "
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
962 "in \"%V\" SSI command",
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
963 &ctx->param->value, &ctx->param->key,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
964 &ctx->command);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
965 state = ssi_error_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
966 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
967 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
968 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
969
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
970 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
971
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
972 case ssi_quoted_value_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
973 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
974 case '\\':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
975 ctx->saved_state = ssi_quoted_value_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
976 state = ssi_quoted_symbol_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
977 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
978
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
979 case '\'':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
980 state = ssi_postparam_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
981 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
982
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
983 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
984 ctx->param->value.data[ctx->param->value.len++] = ch;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
985
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
986 if (ctx->param->value.len == ctx->value_len) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
987 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
988 "too long \"%V\" value of \"%V\" parameter "
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
989 "in \"%V\" SSI command",
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
990 &ctx->param->value, &ctx->param->key,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
991 &ctx->command);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
992 state = ssi_error_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
993 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
994 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
995 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
996
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
997 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
998
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
999 case ssi_quoted_symbol_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1000 ctx->param->value.data[ctx->param->value.len++] = ch;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1001
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1002 if (ctx->param->value.len == ctx->value_len) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1003 if (ctx->param->value.len == ctx->value_len) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1004 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1005 "too long \"%V\" value of \"%V\" parameter "
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1006 "in \"%V\" SSI command",
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1007 &ctx->param->value, &ctx->param->key,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1008 &ctx->command);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1009 state = ssi_error_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1010 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1011 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1012 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1013
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1014 state = ctx->saved_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1015 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1016
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1017 case ssi_postparam_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1018 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1019 case ' ':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1020 case CR:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1021 case LF:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1022 case '\t':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1023 state = ssi_preparam_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1024 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1025
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1026 case '-':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1027 state = ssi_comment_end0_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1028 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1029
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1030 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1031 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1032 "unexpected \"%c\" symbol after \"%V\" value "
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1033 "of \"%V\" parameter in \"%V\" SSI command",
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1034 ch, &ctx->param->value, &ctx->param->key,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1035 &ctx->command);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1036 state = ssi_error_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1037 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1038 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1039
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1040 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1041
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1042 case ssi_comment_end0_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1043 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1044 case '-':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1045 state = ssi_comment_end1_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1046 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1047
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1048 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1049 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1050 "unexpected \"%c\" symbol in \"%V\" SSI command",
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1051 ch, &ctx->command);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1052 state = ssi_error_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1053 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1054 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1055
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1056 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1057
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1058 case ssi_comment_end1_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1059 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1060 case '>':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1061 ctx->state = ssi_start_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1062 ctx->pos = p + 1;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1063 ctx->looked = looked;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1064 ctx->copy_end = copy_end;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1065
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1066 if (ctx->copy_start == NULL && copy_end) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1067 ctx->copy_start = ctx->buf->pos;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1068 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1069
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1070 return NGX_OK;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1071
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1072 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1073 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1074 "unexpected \"%c\" symbol in \"%V\" SSI command",
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1075 ch, &ctx->command);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1076 state = ssi_error_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1077 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1078 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1079
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1080 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1081
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1082 case ssi_error_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1083 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1084 case '-':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1085 state = ssi_error_end0_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1086 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1087
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1088 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1089 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1090 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1091
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1092 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1093
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1094 case ssi_error_end0_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1095 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1096 case '-':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1097 state = ssi_error_end1_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1098 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1099
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1100 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1101 state = ssi_error_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1102 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1103 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1104
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1105 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1106
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1107 case ssi_error_end1_state:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1108 switch (ch) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1109 case '>':
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1110 ctx->state = ssi_start_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1111 ctx->pos = p + 1;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1112 ctx->looked = looked;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1113 ctx->copy_end = copy_end;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1114
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1115 if (ctx->copy_start == NULL && copy_end) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1116 ctx->copy_start = ctx->buf->pos;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1117 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1118
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1119 return NGX_HTTP_SSI_ERROR;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1120
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1121 default:
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1122 state = ssi_error_state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1123 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1124 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1125
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1126 break;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1127 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1128 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1129
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1130 ctx->state = state;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1131 ctx->pos = p;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1132 ctx->looked = looked;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1133
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1134 ctx->copy_end = (state == ssi_start_state) ? p : copy_end;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1135
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1136 if (ctx->copy_start == NULL && ctx->copy_end) {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1137 ctx->copy_start = ctx->buf->pos;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1138 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1139
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1140 return NGX_AGAIN;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1141 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1142
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1143
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1144 static ngx_int_t
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1145 ngx_http_ssi_echo(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1146 ngx_str_t **params)
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1147 {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1148 ngx_uint_t i;
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1149 ngx_buf_t *b;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1150 ngx_str_t *var, *value;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1151 ngx_chain_t *cl;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1152 ngx_http_variable_value_t *vv;
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1153
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1154 var = params[NGX_HTTP_SSI_ECHO_VAR];
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1155
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1156 for (i = 0; i < var->len; i++) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1157 var->data[i] = ngx_toupper(var->data[i]);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1158 }
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1159
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1160 vv = ngx_http_get_variable(r, var);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1161
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1162 if (vv == NULL) {
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1163 return NGX_HTTP_SSI_ERROR;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1164 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1165
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1166 if (vv == NGX_HTTP_VARIABLE_NOT_FOUND) {
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1167 value = params[NGX_HTTP_SSI_ECHO_DEFAULT];
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1168
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1169 if (value == NULL) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1170 value = &ngx_http_ssi_none;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1171
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1172 } else if (value->len == 0) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1173 return NGX_OK;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1174 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1175
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1176 } else {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1177 value = &vv->text;
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1178
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1179 if (value->len == 0) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1180 return NGX_OK;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1181 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1182 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1183
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1184 b = ngx_calloc_buf(r->pool);
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1185 if (b == NULL) {
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1186 return NGX_HTTP_SSI_ERROR;
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1187 }
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1188
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1189 cl = ngx_alloc_chain_link(r->pool);
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1190 if (cl == NULL) {
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1191 return NGX_HTTP_SSI_ERROR;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1192 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1193
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1194 b->memory = 1;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1195 b->pos = value->data;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1196 b->last = value->data + value->len;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1197
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1198 cl->buf = b;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1199 cl->next = NULL;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1200 *ctx->last_out = cl;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1201 ctx->last_out = &cl->next;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1202
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1203 return NGX_OK;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1204 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1205
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1206
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1207 static void *
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1208 ngx_http_ssi_create_conf(ngx_conf_t *cf)
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1209 {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1210 ngx_http_ssi_conf_t *conf;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1211
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1212 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_ssi_conf_t));
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
1213 if (conf == NULL) {
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1214 return NGX_CONF_ERROR;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1215 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1216
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1217 conf->enable = NGX_CONF_UNSET;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1218 conf->silent_errors = NGX_CONF_UNSET;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1219
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1220 conf->min_file_chunk = NGX_CONF_UNSET_SIZE;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1221 conf->value_len = NGX_CONF_UNSET_SIZE;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1222
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1223 return conf;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1224 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1225
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1226
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1227 static char *
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1228 ngx_http_ssi_merge_conf(ngx_conf_t *cf, void *parent, void *child)
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1229 {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1230 ngx_http_ssi_conf_t *prev = parent;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1231 ngx_http_ssi_conf_t *conf = child;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1232
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1233 ngx_conf_merge_value(conf->enable, prev->enable, 0);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1234 ngx_conf_merge_value(conf->silent_errors, prev->silent_errors, 0);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1235
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1236 ngx_conf_merge_size_value(conf->min_file_chunk, prev->min_file_chunk, 1024);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1237 ngx_conf_merge_size_value(conf->value_len, prev->value_len, 256);
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1238
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1239 return NGX_CONF_OK;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1240 }
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1241
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1242
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1243 static ngx_int_t
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1244 ngx_http_ssi_filter_init(ngx_cycle_t *cycle)
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1245 {
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1246 ngx_http_next_header_filter = ngx_http_top_header_filter;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1247 ngx_http_top_header_filter = ngx_http_ssi_header_filter;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1248
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1249 ngx_http_next_body_filter = ngx_http_top_body_filter;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1250 ngx_http_top_body_filter = ngx_http_ssi_body_filter;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1251
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1252 return NGX_OK;
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1253 }