annotate src/http/modules/ngx_http_sub_filter_module.c @ 5204:a64c8a5da336

PCRE: retain input pattern for all regular expressions. Previously, input pattern was kept only for regular expressions with named captures, which resulted in error log entries without input pattern for PCRE errors that occured while processing regular expressions without them. Signed-off-by: Piotr Sikora <piotr@cloudflare.com>
author Piotr Sikora <piotr@cloudflare.com>
date Thu, 02 May 2013 03:26:36 -0700
parents 4251e72b8bb4
children 4c1a604b0285
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
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 3675
diff changeset
4 * Copyright (C) Nginx, Inc.
1172
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 typedef struct {
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
14 ngx_str_t match;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
15 ngx_http_complex_value_t value;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
17 ngx_hash_t types;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
19 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
20
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
21 ngx_array_t *types_keys;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 } ngx_http_sub_loc_conf_t;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 typedef enum {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 sub_start_state = 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27 sub_match_state,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 } ngx_http_sub_state_e;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 typedef struct {
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
32 ngx_str_t match;
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
33 ngx_str_t saved;
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
34 ngx_str_t looked;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
36 ngx_uint_t once; /* unsigned once:1 */
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
38 ngx_buf_t *buf;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
40 u_char *pos;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
41 u_char *copy_start;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
42 u_char *copy_end;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
44 ngx_chain_t *in;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
45 ngx_chain_t *out;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
46 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
47 ngx_chain_t *busy;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
48 ngx_chain_t *free;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
50 ngx_str_t sub;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
52 ngx_uint_t state;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 } ngx_http_sub_ctx_t;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 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
57 ngx_http_sub_ctx_t *ctx);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 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
59 ngx_http_sub_ctx_t *ctx);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 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
62 void *conf);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 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
64 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
65 void *parent, void *child);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 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
67
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 static ngx_command_t ngx_http_sub_filter_commands[] = {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 { ngx_string("sub_filter"),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 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
73 ngx_http_sub_filter,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 NGX_HTTP_LOC_CONF_OFFSET,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 NULL },
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 { ngx_string("sub_filter_types"),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 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
80 ngx_http_types_slot,
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 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
82 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
83 &ngx_http_html_default_types[0] },
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 { ngx_string("sub_filter_once"),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 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
87 ngx_conf_set_flag_slot,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 NGX_HTTP_LOC_CONF_OFFSET,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 offsetof(ngx_http_sub_loc_conf_t, once),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 NULL },
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 ngx_null_command
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 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
97 NULL, /* preconfiguration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 ngx_http_sub_filter_init, /* postconfiguration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 NULL, /* create main configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 NULL, /* init main configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 NULL, /* create server configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 NULL, /* merge server configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 ngx_http_sub_create_conf, /* create location configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 ngx_http_sub_merge_conf /* merge location configuration */
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 ngx_module_t ngx_http_sub_filter_module = {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 NGX_MODULE_V1,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113 &ngx_http_sub_filter_module_ctx, /* module context */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 ngx_http_sub_filter_commands, /* module directives */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 NGX_HTTP_MODULE, /* module type */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 NULL, /* init master */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 NULL, /* init module */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 NULL, /* init process */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 NULL, /* init thread */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 NULL, /* exit thread */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 NULL, /* exit process */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 NULL, /* exit master */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 NGX_MODULE_V1_PADDING
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 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
128 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
129
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 ngx_http_sub_header_filter(ngx_http_request_t *r)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 ngx_http_sub_ctx_t *ctx;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 ngx_http_sub_loc_conf_t *slcf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 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
138
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 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
140 || 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
141 || ngx_http_test_content_type(r, &slcf->types) == NULL)
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 return ngx_http_next_header_filter(r);
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 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
147 if (ctx == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 return NGX_ERROR;
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
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
151 ctx->saved.data = ngx_pnalloc(r->pool, slcf->match.len);
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
152 if (ctx->saved.data == NULL) {
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
153 return NGX_ERROR;
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
154 }
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
155
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
156 ctx->looked.data = ngx_pnalloc(r->pool, slcf->match.len);
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
157 if (ctx->looked.data == NULL) {
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
158 return NGX_ERROR;
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
159 }
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
160
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 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
162
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 ctx->match = slcf->match;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 ctx->last_out = &ctx->out;
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 r->filter_need_in_memory = 1;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168 if (r == r->main) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 ngx_http_clear_content_length(r);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 ngx_http_clear_last_modified(r);
4746
4a18bf1833a9 Entity tags: clear on entity changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
171 ngx_http_clear_etag(r);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 return ngx_http_next_header_filter(r);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175 }
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 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
180 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 ngx_int_t rc;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182 ngx_buf_t *b;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 ngx_chain_t *cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 ngx_http_sub_ctx_t *ctx;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 ngx_http_sub_loc_conf_t *slcf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187 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
188
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 if (ctx == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190 return ngx_http_next_body_filter(r, in);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 if ((in == NULL
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194 && ctx->buf == NULL
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 && ctx->in == NULL
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196 && ctx->busy == NULL))
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198 return ngx_http_next_body_filter(r, in);
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 if (ctx->once && (ctx->buf == NULL || ctx->in == NULL)) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 if (ctx->busy) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204 if (ngx_http_sub_output(r, ctx) == NGX_ERROR) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
205 return NGX_ERROR;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209 return ngx_http_next_body_filter(r, in);
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
212 /* add the incoming chain to the chain ctx->in */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214 if (in) {
2536
a6d6d762c554 small optimization: " == NGX_ERROR" > " != NGX_OK"
Igor Sysoev <igor@sysoev.ru>
parents: 2414
diff changeset
215 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
216 return NGX_ERROR;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220 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
221 "http sub filter \"%V\"", &r->uri);
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 while (ctx->in || ctx->buf) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224
3642
ac33852faaac style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3372
diff changeset
225 if (ctx->buf == NULL) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226 ctx->buf = ctx->in->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227 ctx->in = ctx->in->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 ctx->pos = ctx->buf->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 }
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 if (ctx->state == sub_start_state) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 ctx->copy_start = ctx->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233 ctx->copy_end = ctx->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 b = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238 while (ctx->pos < ctx->buf->last) {
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 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
241 "saved: \"%V\" state: %d", &ctx->saved, ctx->state);
1172
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 rc = ngx_http_sub_parse(r, ctx);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
246 "parse: %d, looked: \"%V\" %p-%p",
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
247 rc, &ctx->looked, ctx->copy_start, ctx->copy_end);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249 if (rc == NGX_ERROR) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
250 return rc;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253 if (ctx->copy_start != ctx->copy_end) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
255 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
256 "saved: \"%V\"", &ctx->saved);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
258 if (ctx->saved.len) {
1172
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 if (ctx->free) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261 cl = ctx->free;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
262 ctx->free = ctx->free->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263 b = cl->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264 ngx_memzero(b, sizeof(ngx_buf_t));
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
266 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267 b = ngx_calloc_buf(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268 if (b == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
270 }
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 cl = ngx_alloc_chain_link(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
273 if (cl == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
275 }
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 cl->buf = b;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
280 b->pos = ngx_pnalloc(r->pool, ctx->saved.len);
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
281 if (b->pos == NULL) {
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
282 return NGX_ERROR;
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
283 }
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
284
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
285 ngx_memcpy(b->pos, ctx->saved.data, ctx->saved.len);
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
286 b->last = b->pos + ctx->saved.len;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287 b->memory = 1;
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 *ctx->last_out = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
290 ctx->last_out = &cl->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
292 ctx->saved.len = 0;
1172
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295 if (ctx->free) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296 cl = ctx->free;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
297 ctx->free = ctx->free->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 b = cl->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301 b = ngx_alloc_buf(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302 if (b == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
303 return NGX_ERROR;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
306 cl = ngx_alloc_chain_link(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
307 if (cl == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308 return NGX_ERROR;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311 cl->buf = b;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312 }
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 ngx_memcpy(b, ctx->buf, sizeof(ngx_buf_t));
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316 b->pos = ctx->copy_start;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317 b->last = ctx->copy_end;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318 b->shadow = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319 b->last_buf = 0;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
320 b->recycled = 0;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
321
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
322 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
323 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
324 b->file_pos += b->pos - ctx->buf->pos;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
325 }
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 cl->next = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
328 *ctx->last_out = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
329 ctx->last_out = &cl->next;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
332 if (ctx->state == sub_start_state) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
333 ctx->copy_start = ctx->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
334 ctx->copy_end = ctx->pos;
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 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
337 ctx->copy_start = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338 ctx->copy_end = NULL;
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 if (rc == NGX_AGAIN) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
342 continue;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
343 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
344
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
345
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
346 /* rc == NGX_OK */
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 b = ngx_calloc_buf(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
349 if (b == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
350 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
351 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
352
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
353 cl = ngx_alloc_chain_link(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
354 if (cl == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
355 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
356 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
357
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
358 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
359
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
360 if (ctx->sub.data == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
361
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
362 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
363 != NGX_OK)
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
364 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
365 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
366 }
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
1555
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
369 if (ctx->sub.len) {
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
370 b->memory = 1;
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
371 b->pos = ctx->sub.data;
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
372 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
373
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
374 } else {
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
375 b->sync = 1;
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
376 }
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
377
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
378 cl->buf = b;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
379 cl->next = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
380 *ctx->last_out = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381 ctx->last_out = &cl->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
382
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
383 ctx->once = slcf->once;
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 continue;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
387
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
388 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
389 if (b == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
390 if (ctx->free) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
391 cl = ctx->free;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392 ctx->free = ctx->free->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393 b = cl->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394 ngx_memzero(b, sizeof(ngx_buf_t));
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
397 b = ngx_calloc_buf(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
398 if (b == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
399 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
400 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
401
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
402 cl = ngx_alloc_chain_link(r->pool);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403 if (cl == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
404 return NGX_ERROR;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
407 cl->buf = b;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
408 }
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 b->sync = 1;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
411
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
412 cl->next = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413 *ctx->last_out = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
414 ctx->last_out = &cl->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
415 }
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 b->last_buf = ctx->buf->last_buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
418 b->shadow = ctx->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420 b->recycled = ctx->buf->recycled;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
423 ctx->buf = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
424
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
425 ctx->saved.len = ctx->looked.len;
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
426 ngx_memcpy(ctx->saved.data, ctx->looked.data, ctx->looked.len);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
427 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
428
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
429 if (ctx->out == NULL && ctx->busy == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
430 return NGX_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
431 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
433 return ngx_http_sub_output(r, ctx);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
434 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
435
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 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438 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
439 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
440 ngx_int_t rc;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
441 ngx_buf_t *b;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
442 ngx_chain_t *cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
443
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
444 #if 1
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
445 b = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446 for (cl = ctx->out; cl; cl = cl->next) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
447 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
448 "sub out: %p %p", cl->buf, cl->buf->pos);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449 if (cl->buf == b) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
451 "the same buf was used in sub");
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
452 ngx_debug_point();
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
453 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
454 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
455 b = cl->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
456 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
457 #endif
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 rc = ngx_http_next_body_filter(r, ctx->out);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
460
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
461 if (ctx->busy == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
462 ctx->busy = ctx->out;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
464 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
465 for (cl = ctx->busy; cl->next; cl = cl->next) { /* void */ }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
466 cl->next = ctx->out;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
467 }
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 ctx->out = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
470 ctx->last_out = &ctx->out;
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 while (ctx->busy) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
474 cl = ctx->busy;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
475 b = cl->buf;
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 (ngx_buf_size(b) != 0) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478 break;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481 if (b->shadow) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
482 b->shadow->pos = b->shadow->last;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485 ctx->busy = cl->next;
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 if (ngx_buf_in_memory(b) || b->in_file) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488 /* add data bufs only to the free buf chain */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490 cl->next = ctx->free;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491 ctx->free = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493 }
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->in || ctx->buf) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496 r->buffered |= NGX_HTTP_SUB_BUFFERED;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
497
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
498 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
499 r->buffered &= ~NGX_HTTP_SUB_BUFFERED;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
502 return rc;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503 }
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 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
507 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
508 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
509 u_char *p, *last, *copy_end, ch, match;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
510 size_t looked;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
511 ngx_http_sub_state_e state;
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 if (ctx->once) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
514 ctx->copy_start = ctx->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
515 ctx->copy_end = ctx->buf->last;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
516 ctx->pos = ctx->buf->last;
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
517 ctx->looked.len = 0;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
518
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
519 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
520
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
521 return NGX_AGAIN;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
522 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
523
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
524 state = ctx->state;
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
525 looked = ctx->looked.len;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
526 last = ctx->buf->last;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
527 copy_end = ctx->copy_end;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
528
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
529 for (p = ctx->pos; p < last; p++) {
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 ch = *p;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
532 ch = ngx_tolower(ch);
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 if (state == sub_start_state) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
535
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
536 /* the tight loop */
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 match = ctx->match.data[0];
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
539
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
540 for ( ;; ) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
541 if (ch == match) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
542 copy_end = p;
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
543 ctx->looked.data[0] = *p;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
544 looked = 1;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
545 state = sub_match_state;
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 goto match_started;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
548 }
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 if (++p == last) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
551 break;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
552 }
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 ch = *p;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
555 ch = ngx_tolower(ch);
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
1557
9d094e581587 *) add sub_filter parser fix similar to r1261 in SSI parser
Igor Sysoev <igor@sysoev.ru>
parents: 1555
diff changeset
558 ctx->state = state;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
559 ctx->pos = p;
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
560 ctx->looked.len = looked;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
561 ctx->copy_end = p;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
562
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
563 if (ctx->copy_start == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
564 ctx->copy_start = ctx->buf->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
565 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
566
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
567 return NGX_AGAIN;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
568
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
569 match_started:
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
570
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
571 continue;
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 /* state == sub_match_state */
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 if (ch == ctx->match.data[looked]) {
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
577 ctx->looked.data[looked] = *p;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
578 looked++;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
579
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
580 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
581 if ((size_t) (p - ctx->pos) < looked) {
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
582 ctx->saved.len = 0;
1557
9d094e581587 *) add sub_filter parser fix similar to r1261 in SSI parser
Igor Sysoev <igor@sysoev.ru>
parents: 1555
diff changeset
583 }
9d094e581587 *) add sub_filter parser fix similar to r1261 in SSI parser
Igor Sysoev <igor@sysoev.ru>
parents: 1555
diff changeset
584
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
585 ctx->state = sub_start_state;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
586 ctx->pos = p + 1;
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
587 ctx->looked.len = 0;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
588 ctx->copy_end = copy_end;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
589
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
590 if (ctx->copy_start == NULL && copy_end) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
591 ctx->copy_start = ctx->buf->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
592 }
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 return NGX_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
595 }
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 } else if (ch == ctx->match.data[0]) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
598 copy_end = p;
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
599 ctx->looked.data[0] = *p;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
600 looked = 1;
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 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
603 copy_end = p;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
604 looked = 0;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
605 state = sub_start_state;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
606 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
607 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
608
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
609 ctx->state = state;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
610 ctx->pos = p;
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
611 ctx->looked.len = looked;
1172
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 ctx->copy_end = (state == sub_start_state) ? p : copy_end;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
614
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
615 if (ctx->copy_start == NULL && ctx->copy_end) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
616 ctx->copy_start = ctx->buf->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
617 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
618
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
619 return NGX_AGAIN;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
620 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
621
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
622
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
623 static char *
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
624 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
625 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
626 ngx_http_sub_loc_conf_t *slcf = conf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
627
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
628 ngx_str_t *value;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
629 ngx_http_compile_complex_value_t ccv;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
630
4947
4251e72b8bb4 Allow the complex value to be defined as an empty string.
Ruslan Ermilov <ru@nginx.com>
parents: 4746
diff changeset
631 if (slcf->match.data) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
632 return "is duplicate";
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
635 value = cf->args->elts;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
636
2135
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2079
diff changeset
637 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
638
2135
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2079
diff changeset
639 slcf->match = value[1];
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
640
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
641 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
642
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
643 ccv.cf = cf;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
644 ccv.value = &value[2];
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
645 ccv.complex_value = &slcf->value;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
646
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
647 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
648 return NGX_CONF_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
649 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
650
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
651 return NGX_CONF_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
652 }
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 static void *
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
656 ngx_http_sub_create_conf(ngx_conf_t *cf)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
657 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
658 ngx_http_sub_loc_conf_t *slcf;
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 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
661 if (slcf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2588
diff changeset
662 return NULL;
1172
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
665 /*
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
666 * set by ngx_pcalloc():
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
667 *
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
668 * 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
669 * conf->sub = { 0, NULL };
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
670 * conf->sub_lengths = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
671 * 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
672 * conf->types = { NULL };
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
673 * conf->types_keys = NULL;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
674 */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
675
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
676 slcf->once = NGX_CONF_UNSET;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
677
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
678 return slcf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
679 }
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 static char *
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
683 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
684 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
685 ngx_http_sub_loc_conf_t *prev = parent;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
686 ngx_http_sub_loc_conf_t *conf = child;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
687
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
688 ngx_conf_merge_value(conf->once, prev->once, 1);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
689 ngx_conf_merge_str_value(conf->match, prev->match, "");
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
690
4947
4251e72b8bb4 Allow the complex value to be defined as an empty string.
Ruslan Ermilov <ru@nginx.com>
parents: 4746
diff changeset
691 if (conf->value.value.data == NULL) {
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
692 conf->value = prev->value;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
693 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
694
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
695 if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types,
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
696 &prev->types_keys, &prev->types,
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
697 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
698 != NGX_OK)
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
699 {
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
700 return NGX_CONF_ERROR;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
701 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
702
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
703 return NGX_CONF_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
704 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
705
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
706
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
707 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
708 ngx_http_sub_filter_init(ngx_conf_t *cf)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
709 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
710 ngx_http_next_header_filter = ngx_http_top_header_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
711 ngx_http_top_header_filter = ngx_http_sub_header_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
712
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
713 ngx_http_next_body_filter = ngx_http_top_body_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
714 ngx_http_top_body_filter = ngx_http_sub_body_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
715
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
716 return NGX_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
717 }