annotate src/http/modules/ngx_http_sub_filter_module.c @ 3440:88741ec7731a stable-0.7

merge r3294, r3305: Fix a bug introduced in r2032: After a child process has read a terminate message from a channel, the process tries to read the channel again. The kernel (at least FreeBSD) may preempt the process and sends a SIGIO signal to a master process. The master process sends a new terminate message, the kernel switches again to the the child process, and the child process reads the messages instead of an EAGAIN error. And this may repeat over and over. Being that the child process can not exit the cycle and test the termination flag set by the message handler. The fix disallow the master process to send a new terminate message on SIGIO signal reception. It may send the message only on SIGALARM signal.
author Igor Sysoev <igor@sysoev.ru>
date Mon, 01 Feb 2010 15:49:36 +0000
parents 2efa8d2fcde1
children 6b8e5c882e47 f706037d7f10
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4 */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12 typedef struct {
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
13 ngx_str_t match;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
14 ngx_http_complex_value_t value;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
16 ngx_hash_t types;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
18 ngx_flag_t once;
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
19
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
20 ngx_array_t *types_keys;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21 } ngx_http_sub_loc_conf_t;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 typedef enum {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 sub_start_state = 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 sub_match_state,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27 } ngx_http_sub_state_e;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30 typedef struct {
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
31 ngx_str_t match;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
33 ngx_uint_t once; /* unsigned once:1 */
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
35 ngx_buf_t *buf;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
37 u_char *pos;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
38 u_char *copy_start;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
39 u_char *copy_end;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
41 ngx_chain_t *in;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
42 ngx_chain_t *out;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
43 ngx_chain_t **last_out;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
44 ngx_chain_t *busy;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
45 ngx_chain_t *free;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
47 ngx_str_t sub;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
49 ngx_uint_t state;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
50 size_t saved;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
51 size_t looked;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 } ngx_http_sub_ctx_t;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 static ngx_int_t ngx_http_sub_output(ngx_http_request_t *r,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 ngx_http_sub_ctx_t *ctx);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 static ngx_int_t ngx_http_sub_parse(ngx_http_request_t *r,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 ngx_http_sub_ctx_t *ctx);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 static char * ngx_http_sub_filter(ngx_conf_t *cf, ngx_command_t *cmd,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 void *conf);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 static void *ngx_http_sub_create_conf(ngx_conf_t *cf);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 static char *ngx_http_sub_merge_conf(ngx_conf_t *cf,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 void *parent, void *child);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 static ngx_int_t ngx_http_sub_filter_init(ngx_conf_t *cf);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 static ngx_command_t ngx_http_sub_filter_commands[] = {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 { ngx_string("sub_filter"),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 ngx_http_sub_filter,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 NGX_HTTP_LOC_CONF_OFFSET,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 NULL },
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 { ngx_string("sub_filter_types"),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
79 ngx_http_types_slot,
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 NGX_HTTP_LOC_CONF_OFFSET,
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
81 offsetof(ngx_http_sub_loc_conf_t, types_keys),
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
82 &ngx_http_html_default_types[0] },
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 { ngx_string("sub_filter_once"),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 ngx_conf_set_flag_slot,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 NGX_HTTP_LOC_CONF_OFFSET,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 offsetof(ngx_http_sub_loc_conf_t, once),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 NULL },
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 ngx_null_command
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 };
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 static ngx_http_module_t ngx_http_sub_filter_module_ctx = {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 NULL, /* preconfiguration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 ngx_http_sub_filter_init, /* postconfiguration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 NULL, /* create main configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 NULL, /* init main configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 NULL, /* create server configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 NULL, /* merge server configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 ngx_http_sub_create_conf, /* create location configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 ngx_http_sub_merge_conf /* merge location configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 };
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110 ngx_module_t ngx_http_sub_filter_module = {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 NGX_MODULE_V1,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 &ngx_http_sub_filter_module_ctx, /* module context */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113 ngx_http_sub_filter_commands, /* module directives */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 NGX_HTTP_MODULE, /* module type */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 NULL, /* init master */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 NULL, /* init module */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 NULL, /* init process */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 NULL, /* init thread */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 NULL, /* exit thread */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 NULL, /* exit process */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 NULL, /* exit master */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 NGX_MODULE_V1_PADDING
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 };
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 ngx_http_sub_header_filter(ngx_http_request_t *r)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 ngx_http_sub_ctx_t *ctx;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 ngx_http_sub_loc_conf_t *slcf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 slcf = ngx_http_get_module_loc_conf(r, ngx_http_sub_filter_module);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 if (slcf->match.len == 0
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
139 || r->headers_out.content_length_n == 0
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
140 || ngx_http_test_content_type(r, &slcf->types) == NULL)
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 return ngx_http_next_header_filter(r);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_sub_ctx_t));
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 if (ctx == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 ngx_http_set_ctx(r, ctx, ngx_http_sub_filter_module);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 ctx->match = slcf->match;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153 ctx->last_out = &ctx->out;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 r->filter_need_in_memory = 1;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 if (r == r->main) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 ngx_http_clear_content_length(r);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159 ngx_http_clear_last_modified(r);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162 return ngx_http_next_header_filter(r);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 ngx_http_sub_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 ngx_int_t rc;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 ngx_buf_t *b;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171 ngx_chain_t *cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 ngx_http_sub_ctx_t *ctx;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 ngx_http_sub_loc_conf_t *slcf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175 ctx = ngx_http_get_module_ctx(r, ngx_http_sub_filter_module);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177 if (ctx == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178 return ngx_http_next_body_filter(r, in);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 if ((in == NULL
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182 && ctx->buf == NULL
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 && ctx->in == NULL
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 && ctx->busy == NULL))
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186 return ngx_http_next_body_filter(r, in);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 if (ctx->once && (ctx->buf == NULL || ctx->in == NULL)) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191 if (ctx->busy) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 if (ngx_http_sub_output(r, ctx) == NGX_ERROR) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 return ngx_http_next_body_filter(r, in);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200 /* add the incoming chain to the chain ctx->in */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 if (in) {
2536
a6d6d762c554 small optimization: " == NGX_ERROR" > " != NGX_OK"
Igor Sysoev <igor@sysoev.ru>
parents: 2414
diff changeset
203 if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
205 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
208 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209 "http sub filter \"%V\"", &r->uri);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
210
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
211 while (ctx->in || ctx->buf) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
212
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213 if (ctx->buf == NULL ){
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214 ctx->buf = ctx->in->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215 ctx->in = ctx->in->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216 ctx->pos = ctx->buf->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
217 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219 if (ctx->state == sub_start_state) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220 ctx->copy_start = ctx->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 ctx->copy_end = ctx->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224 b = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226 while (ctx->pos < ctx->buf->last) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 "saved: %d state: %d", ctx->saved, ctx->state);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231 rc = ngx_http_sub_parse(r, ctx);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234 "parse: %d, looked: %d %p-%p",
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235 rc, ctx->looked, ctx->copy_start, ctx->copy_end);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237 if (rc == NGX_ERROR) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238 return rc;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241 if (ctx->copy_start != ctx->copy_end) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 "saved: %d", ctx->saved);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 if (ctx->saved) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248 if (ctx->free) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249 cl = ctx->free;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
250 ctx->free = ctx->free->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251 b = cl->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252 ngx_memzero(b, sizeof(ngx_buf_t));
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
255 b = ngx_calloc_buf(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
256 if (b == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
258 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260 cl = ngx_alloc_chain_link(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261 if (cl == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
262 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265 cl->buf = b;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
266 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268 b->memory = 1;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269 b->pos = ctx->match.data;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
270 b->last = ctx->match.data + ctx->saved;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
271
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
272 *ctx->last_out = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
273 ctx->last_out = &cl->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
275 ctx->saved = 0;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
276 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278 if (ctx->free) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279 cl = ctx->free;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
280 ctx->free = ctx->free->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 b = cl->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
282
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
283 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
284 b = ngx_alloc_buf(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
285 if (b == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
286 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
288
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
289 cl = ngx_alloc_chain_link(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
290 if (cl == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
292 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
294 cl->buf = b;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
297 ngx_memcpy(b, ctx->buf, sizeof(ngx_buf_t));
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299 b->pos = ctx->copy_start;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300 b->last = ctx->copy_end;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301 b->shadow = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302 b->last_buf = 0;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
303 b->recycled = 0;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
304
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
305 if (b->in_file) {
2079
333ef9e18a59 fix error when response parsed by sub filter, then by SSI filter
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
306 b->file_last = b->file_pos + (b->last - ctx->buf->pos);
333ef9e18a59 fix error when response parsed by sub filter, then by SSI filter
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
307 b->file_pos += b->pos - ctx->buf->pos;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310 cl->next = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311 *ctx->last_out = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312 ctx->last_out = &cl->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
313 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315 if (ctx->state == sub_start_state) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316 ctx->copy_start = ctx->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317 ctx->copy_end = ctx->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
320 ctx->copy_start = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
321 ctx->copy_end = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
322 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
323
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
324 if (rc == NGX_AGAIN) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
325 continue;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
326 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
327
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
328
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
329 /* rc == NGX_OK */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
330
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
331 b = ngx_calloc_buf(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
332 if (b == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
333 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
334 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
335
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
336 cl = ngx_alloc_chain_link(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
337 if (cl == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
340
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
341 slcf = ngx_http_get_module_loc_conf(r, ngx_http_sub_filter_module);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
342
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
343 if (ctx->sub.data == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
344
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
345 if (ngx_http_complex_value(r, &slcf->value, &ctx->sub)
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
346 != NGX_OK)
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
347 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
348 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
349 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
350 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
351
1555
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
352 if (ctx->sub.len) {
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
353 b->memory = 1;
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
354 b->pos = ctx->sub.data;
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
355 b->last = ctx->sub.data + ctx->sub.len;
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
356
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
357 } else {
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
358 b->sync = 1;
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
359 }
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
360
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
361 cl->buf = b;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
362 cl->next = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
363 *ctx->last_out = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
364 ctx->last_out = &cl->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
365
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
366 ctx->once = slcf->once;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
367
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
368 continue;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
369 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
370
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
371 if (ctx->buf->last_buf || ngx_buf_in_memory(ctx->buf)) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
372 if (b == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373 if (ctx->free) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
374 cl = ctx->free;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
375 ctx->free = ctx->free->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
376 b = cl->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
377 ngx_memzero(b, sizeof(ngx_buf_t));
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
378
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
379 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
380 b = ngx_calloc_buf(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381 if (b == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
382 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
383 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
384
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
385 cl = ngx_alloc_chain_link(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386 if (cl == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
387 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
388 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
389
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
390 cl->buf = b;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
391 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393 b->sync = 1;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395 cl->next = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396 *ctx->last_out = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
397 ctx->last_out = &cl->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
398 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
399
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
400 b->last_buf = ctx->buf->last_buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
401 b->shadow = ctx->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
402
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403 b->recycled = ctx->buf->recycled;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
404 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
405
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
406 ctx->buf = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
407
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
408 ctx->saved = ctx->looked;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
409 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
410
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
411 if (ctx->out == NULL && ctx->busy == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
412 return NGX_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
414
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
415 return ngx_http_sub_output(r, ctx);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
417
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
418
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420 ngx_http_sub_output(ngx_http_request_t *r, ngx_http_sub_ctx_t *ctx)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
422 ngx_int_t rc;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
423 ngx_buf_t *b;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
424 ngx_chain_t *cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
425
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
426 #if 1
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
427 b = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
428 for (cl = ctx->out; cl; cl = cl->next) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
429 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
430 "sub out: %p %p", cl->buf, cl->buf->pos);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
431 if (cl->buf == b) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
433 "the same buf was used in sub");
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
434 ngx_debug_point();
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
435 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
436 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437 b = cl->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
439 #endif
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
440
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
441 rc = ngx_http_next_body_filter(r, ctx->out);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
442
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
443 if (ctx->busy == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
444 ctx->busy = ctx->out;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
445
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
447 for (cl = ctx->busy; cl->next; cl = cl->next) { /* void */ }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
448 cl->next = ctx->out;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
451 ctx->out = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
452 ctx->last_out = &ctx->out;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
453
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
454 while (ctx->busy) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
455
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
456 cl = ctx->busy;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
457 b = cl->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
458
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
459 if (ngx_buf_size(b) != 0) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
460 break;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
461 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
462
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463 if (b->shadow) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
464 b->shadow->pos = b->shadow->last;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
465 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
466
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
467 ctx->busy = cl->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
468
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
469 if (ngx_buf_in_memory(b) || b->in_file) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
470 /* add data bufs only to the free buf chain */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
471
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
472 cl->next = ctx->free;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473 ctx->free = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
474 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
475 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
476
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
477 if (ctx->in || ctx->buf) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478 r->buffered |= NGX_HTTP_SUB_BUFFERED;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
480 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481 r->buffered &= ~NGX_HTTP_SUB_BUFFERED;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
482 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
484 return rc;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
486
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
487
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489 ngx_http_sub_parse(ngx_http_request_t *r, ngx_http_sub_ctx_t *ctx)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491 u_char *p, *last, *copy_end, ch, match;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492 size_t looked;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493 ngx_http_sub_state_e state;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
494
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495 if (ctx->once) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496 ctx->copy_start = ctx->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
497 ctx->copy_end = ctx->buf->last;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
498 ctx->pos = ctx->buf->last;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
499 ctx->looked = 0;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
500
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
501 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "once");
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
502
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503 return NGX_AGAIN;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
504 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
505
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
506 state = ctx->state;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
507 looked = ctx->looked;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
508 last = ctx->buf->last;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
509 copy_end = ctx->copy_end;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
510
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
511 for (p = ctx->pos; p < last; p++) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
512
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
513 ch = *p;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
514 ch = ngx_tolower(ch);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
515
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
516 if (state == sub_start_state) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
517
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
518 /* the tight loop */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
519
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
520 match = ctx->match.data[0];
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
521
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
522 for ( ;; ) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
523 if (ch == match) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
524 copy_end = p;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
525 looked = 1;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
526 state = sub_match_state;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
527
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
528 goto match_started;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
529 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
530
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
531 if (++p == last) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
532 break;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
533 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
534
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
535 ch = *p;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
536 ch = ngx_tolower(ch);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
537 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
538
1557
9d094e581587 *) add sub_filter parser fix similar to r1261 in SSI parser
Igor Sysoev <igor@sysoev.ru>
parents: 1555
diff changeset
539 ctx->state = state;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
540 ctx->pos = p;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
541 ctx->looked = looked;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
542 ctx->copy_end = p;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
543
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
544 if (ctx->copy_start == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
545 ctx->copy_start = ctx->buf->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
546 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
547
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
548 return NGX_AGAIN;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
549
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
550 match_started:
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
551
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
552 continue;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
553 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
554
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
555 /* state == sub_match_state */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
556
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
557 if (ch == ctx->match.data[looked]) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
558 looked++;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
559
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
560 if (looked == ctx->match.len) {
1557
9d094e581587 *) add sub_filter parser fix similar to r1261 in SSI parser
Igor Sysoev <igor@sysoev.ru>
parents: 1555
diff changeset
561 if ((size_t) (p - ctx->pos) < looked) {
9d094e581587 *) add sub_filter parser fix similar to r1261 in SSI parser
Igor Sysoev <igor@sysoev.ru>
parents: 1555
diff changeset
562 ctx->saved = 0;
9d094e581587 *) add sub_filter parser fix similar to r1261 in SSI parser
Igor Sysoev <igor@sysoev.ru>
parents: 1555
diff changeset
563 }
9d094e581587 *) add sub_filter parser fix similar to r1261 in SSI parser
Igor Sysoev <igor@sysoev.ru>
parents: 1555
diff changeset
564
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
565 ctx->state = sub_start_state;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
566 ctx->pos = p + 1;
1978
c10e7b563fb4 reset looked at match
Igor Sysoev <igor@sysoev.ru>
parents: 1557
diff changeset
567 ctx->looked = 0;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
568 ctx->copy_end = copy_end;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
569
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
570 if (ctx->copy_start == NULL && copy_end) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
571 ctx->copy_start = ctx->buf->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
572 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
573
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
574 return NGX_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
575 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
576
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
577 } else if (ch == ctx->match.data[0]) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
578 copy_end = p;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
579 looked = 1;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
580
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
581 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
582 copy_end = p;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
583 looked = 0;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
584 state = sub_start_state;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
585 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
586 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
587
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
588 ctx->state = state;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
589 ctx->pos = p;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
590 ctx->looked = looked;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
591
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
592 ctx->copy_end = (state == sub_start_state) ? p : copy_end;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
593
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
594 if (ctx->copy_start == NULL && ctx->copy_end) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
595 ctx->copy_start = ctx->buf->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
596 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
597
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
598 return NGX_AGAIN;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
599 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
600
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
601
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
602 static char *
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
603 ngx_http_sub_filter(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
604 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
605 ngx_http_sub_loc_conf_t *slcf = conf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
606
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
607 ngx_str_t *value;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
608 ngx_http_compile_complex_value_t ccv;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
609
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
610 if (slcf->match.len) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
611 return "is duplicate";
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
612 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
613
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
614 value = cf->args->elts;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
615
2135
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2079
diff changeset
616 ngx_strlow(value[1].data, value[1].data, value[1].len);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
617
2135
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2079
diff changeset
618 slcf->match = value[1];
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
619
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
620 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
621
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
622 ccv.cf = cf;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
623 ccv.value = &value[2];
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
624 ccv.complex_value = &slcf->value;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
625
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
626 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
627 return NGX_CONF_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
628 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
629
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
630 return NGX_CONF_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
631 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
632
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
633
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
634 static void *
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
635 ngx_http_sub_create_conf(ngx_conf_t *cf)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
636 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
637 ngx_http_sub_loc_conf_t *slcf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
638
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
639 slcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_sub_loc_conf_t));
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
640 if (slcf == NULL) {
3237
2efa8d2fcde1 merge r2903, r2911, r2912, r3002:
Igor Sysoev <igor@sysoev.ru>
parents: 2588
diff changeset
641 return NULL;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
642 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
643
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
644 /*
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
645 * set by ngx_pcalloc():
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
646 *
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
647 * conf->match = { 0, NULL };
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
648 * conf->sub = { 0, NULL };
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
649 * conf->sub_lengths = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
650 * conf->sub_values = NULL;
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
651 * conf->types = { NULL };
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
652 * conf->types_keys = NULL;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
653 */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
654
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
655 slcf->once = NGX_CONF_UNSET;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
656
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
657 return slcf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
658 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
659
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
660
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
661 static char *
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
662 ngx_http_sub_merge_conf(ngx_conf_t *cf, void *parent, void *child)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
663 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
664 ngx_http_sub_loc_conf_t *prev = parent;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
665 ngx_http_sub_loc_conf_t *conf = child;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
666
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
667 ngx_conf_merge_value(conf->once, prev->once, 1);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
668 ngx_conf_merge_str_value(conf->match, prev->match, "");
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
669
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
670 if (conf->value.value.len == 0) {
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
671 conf->value = prev->value;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
672 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
673
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
674 if (ngx_http_merge_types(cf, conf->types_keys, &conf->types,
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
675 prev->types_keys, &prev->types,
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
676 ngx_http_html_default_types)
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
677 != NGX_OK)
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
678 {
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
679 return NGX_CONF_ERROR;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
680 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
681
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
682 return NGX_CONF_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
683 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
684
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
685
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
686 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
687 ngx_http_sub_filter_init(ngx_conf_t *cf)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
688 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
689 ngx_http_next_header_filter = ngx_http_top_header_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
690 ngx_http_top_header_filter = ngx_http_sub_header_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
691
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
692 ngx_http_next_body_filter = ngx_http_top_body_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
693 ngx_http_top_body_filter = ngx_http_sub_body_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
694
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
695 return NGX_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
696 }