annotate src/http/modules/ngx_http_sub_filter_module.c @ 6749:f88a145b093e stable-1.10

HTTP/2: the "421 Misdirected Request" response (closes #848). Since 4fbef397c753 nginx rejects with the 400 error any attempts of requesting different host over the same connection, if the relevant virtual server requires verification of a client certificate. While requesting hosts other than negotiated isn't something legal in HTTP/1.x, the HTTP/2 specification explicitly permits such requests for connection reuse and has introduced a special response code 421. According to RFC 7540 Section 9.1.2 this code can be sent by a server that is not configured to produce responses for the combination of scheme and authority that are included in the request URI. And the client may retry the request over a different connection. Now this code is used for requests that aren't authorized in current connection. After receiving the 421 response a client will be able to open a new connection, provide the required certificate and retry the request. Unfortunately, not all clients currently are able to handle it well. Notably Chrome just shows an error, while at least the latest version of Firefox retries the request over a new connection.
author Valentin Bartenev <vbart@nginx.com>
date Fri, 20 May 2016 18:41:17 +0300
parents f01ab2dbcfdc
children 0e0adbbc8752
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 {
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
14 ngx_http_complex_value_t match;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
15 ngx_http_complex_value_t value;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
16 } ngx_http_sub_pair_t;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
17
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
18
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
19 typedef struct {
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
20 ngx_str_t match;
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
21 ngx_http_complex_value_t *value;
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
22 } ngx_http_sub_match_t;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
23
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
24
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
25 typedef struct {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
26 ngx_uint_t min_match_len;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
27 ngx_uint_t max_match_len;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
28
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
29 u_char index[257];
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
30 u_char shift[256];
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
31 } ngx_http_sub_tables_t;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
32
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
33
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
34 typedef struct {
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
35 ngx_uint_t dynamic; /* unsigned dynamic:1; */
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
36
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
37 ngx_array_t *pairs;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
38
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
39 ngx_http_sub_tables_t *tables;
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_hash_t types;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
43 ngx_flag_t once;
5229
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
44 ngx_flag_t last_modified;
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
45
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
46 ngx_array_t *types_keys;
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
47 ngx_array_t *matches;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 } ngx_http_sub_loc_conf_t;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51 typedef struct {
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
52 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
53 ngx_str_t looked;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
55 ngx_uint_t once; /* unsigned once:1 */
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
57 ngx_buf_t *buf;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
59 u_char *pos;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
60 u_char *copy_start;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
61 u_char *copy_end;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
63 ngx_chain_t *in;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
64 ngx_chain_t *out;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
65 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
66 ngx_chain_t *busy;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
67 ngx_chain_t *free;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
69 ngx_str_t *sub;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
70 ngx_uint_t applied;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
72 ngx_int_t offset;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
73 ngx_uint_t index;
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
74
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
75 ngx_http_sub_tables_t *tables;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
76 ngx_array_t *matches;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 } ngx_http_sub_ctx_t;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
80 static ngx_uint_t ngx_http_sub_cmp_index;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
81
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
82
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 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
84 ngx_http_sub_ctx_t *ctx);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 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
86 ngx_http_sub_ctx_t *ctx);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 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
89 void *conf);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 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
91 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
92 void *parent, void *child);
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
93 static void ngx_http_sub_init_tables(ngx_http_sub_tables_t *tables,
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
94 ngx_http_sub_match_t *match, ngx_uint_t n);
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
95 static ngx_int_t ngx_http_sub_cmp_matches(const void *one, const void *two);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 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
97
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 static ngx_command_t ngx_http_sub_filter_commands[] = {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 { ngx_string("sub_filter"),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 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
103 ngx_http_sub_filter,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 NGX_HTTP_LOC_CONF_OFFSET,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 NULL },
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 { ngx_string("sub_filter_types"),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 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
110 ngx_http_types_slot,
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 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
112 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
113 &ngx_http_html_default_types[0] },
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 { ngx_string("sub_filter_once"),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 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
117 ngx_conf_set_flag_slot,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 NGX_HTTP_LOC_CONF_OFFSET,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 offsetof(ngx_http_sub_loc_conf_t, once),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 NULL },
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121
5229
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
122 { ngx_string("sub_filter_last_modified"),
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
123 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
124 ngx_conf_set_flag_slot,
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
125 NGX_HTTP_LOC_CONF_OFFSET,
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
126 offsetof(ngx_http_sub_loc_conf_t, last_modified),
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
127 NULL },
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
128
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 ngx_null_command
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
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 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
134 NULL, /* preconfiguration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 ngx_http_sub_filter_init, /* postconfiguration */
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 NULL, /* create main configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 NULL, /* init main configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 NULL, /* create server configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 NULL, /* merge server configuration */
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 ngx_http_sub_create_conf, /* create location configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 ngx_http_sub_merge_conf /* merge location configuration */
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 ngx_module_t ngx_http_sub_filter_module = {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 NGX_MODULE_V1,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 &ngx_http_sub_filter_module_ctx, /* module context */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 ngx_http_sub_filter_commands, /* module directives */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 NGX_HTTP_MODULE, /* module type */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153 NULL, /* init master */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 NULL, /* init module */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 NULL, /* init process */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 NULL, /* init thread */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 NULL, /* exit thread */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 NULL, /* exit process */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159 NULL, /* exit master */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 NGX_MODULE_V1_PADDING
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
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 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
165 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
166
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 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 ngx_http_sub_header_filter(ngx_http_request_t *r)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 {
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
171 ngx_str_t *m;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
172 ngx_uint_t i, j, n;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
173 ngx_http_sub_ctx_t *ctx;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
174 ngx_http_sub_pair_t *pairs;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
175 ngx_http_sub_match_t *matches;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 ngx_http_sub_loc_conf_t *slcf;
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 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
179
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
180 if (slcf->pairs == NULL
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
181 || 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
182 || ngx_http_test_content_type(r, &slcf->types) == NULL)
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 return ngx_http_next_header_filter(r);
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187 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
188 if (ctx == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 return NGX_ERROR;
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
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
192 if (slcf->dynamic == 0) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
193 ctx->tables = slcf->tables;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
194 ctx->matches = slcf->matches;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
195
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
196 } else {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
197 pairs = slcf->pairs->elts;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
198 n = slcf->pairs->nelts;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
199
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
200 matches = ngx_pcalloc(r->pool, sizeof(ngx_http_sub_match_t) * n);
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
201 if (matches == NULL) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
202 return NGX_ERROR;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
203 }
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
204
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
205 j = 0;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
206 for (i = 0; i < n; i++) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
207 matches[j].value = &pairs[i].value;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
208
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
209 if (pairs[i].match.lengths == NULL) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
210 matches[j].match = pairs[i].match.value;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
211 j++;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
212 continue;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
213 }
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
214
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
215 m = &matches[j].match;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
216 if (ngx_http_complex_value(r, &pairs[i].match, m) != NGX_OK) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
217 return NGX_ERROR;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
218 }
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
219
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
220 if (m->len == 0) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
221 continue;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
222 }
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
223
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
224 ngx_strlow(m->data, m->data, m->len);
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
225 j++;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
226 }
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
227
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
228 if (j == 0) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
229 return ngx_http_next_header_filter(r);
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
230 }
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
231
6464
088ef087a011 Sub filter: fixed allocation alignment.
Roman Arutyunyan <arut@nginx.com>
parents: 6247
diff changeset
232 ctx->matches = ngx_palloc(r->pool, sizeof(ngx_array_t));
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
233 if (ctx->matches == NULL) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
234 return NGX_ERROR;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
235 }
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
236
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
237 ctx->matches->elts = matches;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
238 ctx->matches->nelts = j;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
239
6464
088ef087a011 Sub filter: fixed allocation alignment.
Roman Arutyunyan <arut@nginx.com>
parents: 6247
diff changeset
240 ctx->tables = ngx_palloc(r->pool, sizeof(ngx_http_sub_tables_t));
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
241 if (ctx->tables == NULL) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
242 return NGX_ERROR;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
243 }
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
244
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
245 ngx_http_sub_init_tables(ctx->tables, ctx->matches->elts,
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
246 ctx->matches->nelts);
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
247 }
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
248
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
249 ngx_http_set_ctx(r, ctx, ngx_http_sub_filter_module);
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
250
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
251 ctx->saved.data = ngx_pnalloc(r->pool, ctx->tables->max_match_len - 1);
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
252 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
253 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
254 }
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
255
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
256 ctx->looked.data = ngx_pnalloc(r->pool, ctx->tables->max_match_len - 1);
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
257 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
258 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
259 }
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
260
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
261 ctx->offset = ctx->tables->min_match_len - 1;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
262 ctx->last_out = &ctx->out;
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 r->filter_need_in_memory = 1;
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 if (r == r->main) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267 ngx_http_clear_content_length(r);
5229
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
268
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
269 if (!slcf->last_modified) {
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
270 ngx_http_clear_last_modified(r);
5733
e491b26fa5a1 Entity tags: downgrade strong etags to weak ones as needed.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5710
diff changeset
271 ngx_http_clear_etag(r);
e491b26fa5a1 Entity tags: downgrade strong etags to weak ones as needed.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5710
diff changeset
272
e491b26fa5a1 Entity tags: downgrade strong etags to weak ones as needed.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5710
diff changeset
273 } else {
e491b26fa5a1 Entity tags: downgrade strong etags to weak ones as needed.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5710
diff changeset
274 ngx_http_weak_etag(r);
5229
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
275 }
1172
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 return ngx_http_next_header_filter(r);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
280
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
282 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
283 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
284 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
285 ngx_int_t rc;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
286 ngx_buf_t *b;
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
287 ngx_str_t *sub;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
288 ngx_chain_t *cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
289 ngx_http_sub_ctx_t *ctx;
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
290 ngx_http_sub_match_t *match;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291 ngx_http_sub_loc_conf_t *slcf;
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 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
294
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295 if (ctx == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296 return ngx_http_next_body_filter(r, in);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
297 }
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 if ((in == NULL
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300 && ctx->buf == NULL
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301 && ctx->in == NULL
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302 && ctx->busy == NULL))
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
303 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
304 return ngx_http_next_body_filter(r, in);
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
307 if (ctx->once && (ctx->buf == NULL || ctx->in == NULL)) {
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 if (ctx->busy) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310 if (ngx_http_sub_output(r, ctx) == NGX_ERROR) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311 return NGX_ERROR;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315 return ngx_http_next_body_filter(r, in);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318 /* add the incoming chain to the chain ctx->in */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
320 if (in) {
2536
a6d6d762c554 small optimization: " == NGX_ERROR" > " != NGX_OK"
Igor Sysoev <igor@sysoev.ru>
parents: 2414
diff changeset
321 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
322 return NGX_ERROR;
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 }
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 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
327 "http sub filter \"%V\"", &r->uri);
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 while (ctx->in || ctx->buf) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
330
3642
ac33852faaac style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3372
diff changeset
331 if (ctx->buf == NULL) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
332 ctx->buf = ctx->in->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
333 ctx->in = ctx->in->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
334 ctx->pos = ctx->buf->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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
337 b = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339 while (ctx->pos < ctx->buf->last) {
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 rc = ngx_http_sub_parse(r, ctx);
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 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6480
f01ab2dbcfdc Fixed logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6464
diff changeset
344 "parse: %i, looked: \"%V\" %p-%p",
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
345 rc, &ctx->looked, ctx->copy_start, ctx->copy_end);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
346
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
347 if (rc == NGX_ERROR) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
348 return rc;
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
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
351 if (ctx->saved.len) {
1172
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 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
354 "saved: \"%V\"", &ctx->saved);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
355
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
356 cl = ngx_chain_get_free_buf(r->pool, &ctx->free);
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
357 if (cl == NULL) {
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
358 return NGX_ERROR;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
359 }
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
360
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
361 b = cl->buf;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
362
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
363 ngx_memzero(b, sizeof(ngx_buf_t));
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
364
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
365 b->pos = ngx_pnalloc(r->pool, ctx->saved.len);
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
366 if (b->pos == NULL) {
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
367 return NGX_ERROR;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
368 }
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
369
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
370 ngx_memcpy(b->pos, ctx->saved.data, ctx->saved.len);
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
371 b->last = b->pos + ctx->saved.len;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
372 b->memory = 1;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
374 *ctx->last_out = cl;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
375 ctx->last_out = &cl->next;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
376
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
377 ctx->saved.len = 0;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
378 }
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
379
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
380 if (ctx->copy_start != ctx->copy_end) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381
5285
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
382 cl = ngx_chain_get_free_buf(r->pool, &ctx->free);
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
383 if (cl == NULL) {
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
384 return NGX_ERROR;
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
385 }
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386
5285
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
387 b = cl->buf;
1172
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 ngx_memcpy(b, ctx->buf, sizeof(ngx_buf_t));
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
390
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
391 b->pos = ctx->copy_start;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392 b->last = ctx->copy_end;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393 b->shadow = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394 b->last_buf = 0;
5710
9e9c1310d17c Sub filter: fixed subrequests handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5288
diff changeset
395 b->last_in_chain = 0;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396 b->recycled = 0;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
397
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
398 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
399 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
400 b->file_pos += b->pos - ctx->buf->pos;
1172
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403 *ctx->last_out = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
404 ctx->last_out = &cl->next;
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 if (rc == NGX_AGAIN) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
408 continue;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
412 /* rc == NGX_OK */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413
5285
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
414 cl = ngx_chain_get_free_buf(r->pool, &ctx->free);
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
415 if (cl == NULL) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416 return NGX_ERROR;
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
5285
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
419 b = cl->buf;
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
420
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
421 ngx_memzero(b, sizeof(ngx_buf_t));
1172
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 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
424
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
425 if (ctx->sub == NULL) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
426 ctx->sub = ngx_pcalloc(r->pool, sizeof(ngx_str_t)
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
427 * ctx->matches->nelts);
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
428 if (ctx->sub == NULL) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
429 return NGX_ERROR;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
430 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
431 }
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
433 sub = &ctx->sub[ctx->index];
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
434
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
435 if (sub->data == NULL) {
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
436 match = ctx->matches->elts;
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
437
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
438 if (ngx_http_complex_value(r, match[ctx->index].value, sub)
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
439 != NGX_OK)
1172
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 return NGX_ERROR;
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 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
444
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
445 if (sub->len) {
1555
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
446 b->memory = 1;
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
447 b->pos = sub->data;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
448 b->last = sub->data + sub->len;
1555
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
449
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
450 } else {
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
451 b->sync = 1;
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
452 }
1172
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 *ctx->last_out = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
455 ctx->last_out = &cl->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
456
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
457 ctx->index = 0;
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
458 ctx->once = slcf->once && (++ctx->applied == ctx->matches->nelts);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
459
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
460 continue;
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
5710
9e9c1310d17c Sub filter: fixed subrequests handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5288
diff changeset
463 if (ctx->looked.len
9e9c1310d17c Sub filter: fixed subrequests handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5288
diff changeset
464 && (ctx->buf->last_buf || ctx->buf->last_in_chain))
9e9c1310d17c Sub filter: fixed subrequests handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5288
diff changeset
465 {
5287
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
466 cl = ngx_chain_get_free_buf(r->pool, &ctx->free);
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
467 if (cl == NULL) {
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
468 return NGX_ERROR;
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
469 }
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
470
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
471 b = cl->buf;
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
472
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
473 ngx_memzero(b, sizeof(ngx_buf_t));
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
474
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
475 b->pos = ctx->looked.data;
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
476 b->last = b->pos + ctx->looked.len;
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
477 b->memory = 1;
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
478
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
479 *ctx->last_out = cl;
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
480 ctx->last_out = &cl->next;
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
481
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
482 ctx->looked.len = 0;
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
483 }
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
484
5710
9e9c1310d17c Sub filter: fixed subrequests handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5288
diff changeset
485 if (ctx->buf->last_buf || ctx->buf->flush || ctx->buf->sync
5286
819c5b53d8b5 Sub filter: flush buffers handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5285
diff changeset
486 || ngx_buf_in_memory(ctx->buf))
819c5b53d8b5 Sub filter: flush buffers handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5285
diff changeset
487 {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488 if (b == NULL) {
5285
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
489 cl = ngx_chain_get_free_buf(r->pool, &ctx->free);
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
490 if (cl == NULL) {
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
491 return NGX_ERROR;
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
492 }
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493
5285
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
494 b = cl->buf;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495
5285
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
496 ngx_memzero(b, sizeof(ngx_buf_t));
1172
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 b->sync = 1;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
499
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
500 *ctx->last_out = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
501 ctx->last_out = &cl->next;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
504 b->last_buf = ctx->buf->last_buf;
5710
9e9c1310d17c Sub filter: fixed subrequests handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5288
diff changeset
505 b->last_in_chain = ctx->buf->last_in_chain;
5286
819c5b53d8b5 Sub filter: flush buffers handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5285
diff changeset
506 b->flush = ctx->buf->flush;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
507 b->shadow = ctx->buf;
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 b->recycled = ctx->buf->recycled;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
512 ctx->buf = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
513 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
514
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
515 if (ctx->out == NULL && ctx->busy == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
516 return NGX_OK;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
519 return ngx_http_sub_output(r, ctx);
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
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 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
524 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
525 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
526 ngx_int_t rc;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
527 ngx_buf_t *b;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
528 ngx_chain_t *cl;
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 #if 1
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
531 b = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
532 for (cl = ctx->out; cl; cl = cl->next) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
533 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
534 "sub out: %p %p", cl->buf, cl->buf->pos);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
535 if (cl->buf == b) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
536 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
537 "the same buf was used in sub");
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
538 ngx_debug_point();
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
539 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
540 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
541 b = cl->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
542 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
543 #endif
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
544
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
545 rc = ngx_http_next_body_filter(r, ctx->out);
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 if (ctx->busy == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
548 ctx->busy = ctx->out;
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 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
551 for (cl = ctx->busy; cl->next; cl = cl->next) { /* void */ }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
552 cl->next = ctx->out;
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 ctx->out = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
556 ctx->last_out = &ctx->out;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
557
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
558 while (ctx->busy) {
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 cl = ctx->busy;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
561 b = cl->buf;
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 (ngx_buf_size(b) != 0) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
564 break;
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 if (b->shadow) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
568 b->shadow->pos = b->shadow->last;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
571 ctx->busy = cl->next;
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 if (ngx_buf_in_memory(b) || b->in_file) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
574 /* add data bufs only to the free buf chain */
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 cl->next = ctx->free;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
577 ctx->free = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
578 }
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
581 if (ctx->in || ctx->buf) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
582 r->buffered |= NGX_HTTP_SUB_BUFFERED;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
583
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
584 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
585 r->buffered &= ~NGX_HTTP_SUB_BUFFERED;
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 return rc;
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
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 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
593 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
594 {
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
595 u_char *p, *last, *pat, *pat_end, c;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
596 ngx_str_t *m;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
597 ngx_int_t offset, start, next, end, len, rc;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
598 ngx_uint_t shift, i, j;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
599 ngx_http_sub_match_t *match;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
600 ngx_http_sub_tables_t *tables;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
601 ngx_http_sub_loc_conf_t *slcf;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
602
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
603 slcf = ngx_http_get_module_loc_conf(r, ngx_http_sub_filter_module);
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
604 tables = ctx->tables;
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
605
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
606 offset = ctx->offset;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
607 end = ctx->buf->last - ctx->pos;
1172
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 if (ctx->once) {
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
610 /* sets start and next to end */
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
611 offset = end + (ngx_int_t) tables->min_match_len - 1;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
612 goto again;
1172
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
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
615 while (offset < end) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
616
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
617 c = offset < 0 ? ctx->looked.data[ctx->looked.len + offset]
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
618 : ctx->pos[offset];
5810
5322be87fc02 Sub filter: fixed matching for a single character.
Valentin Bartenev <vbart@nginx.com>
parents: 5733
diff changeset
619
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
620 c = ngx_tolower(c);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
621
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
622 shift = tables->shift[c];
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
623 if (shift > 0) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
624 offset += shift;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
625 continue;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
626 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
627
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
628 /* a potential match */
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
629
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
630 start = offset - (ngx_int_t) tables->min_match_len + 1;
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
631 match = ctx->matches->elts;
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
632
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
633 i = ngx_max(tables->index[c], ctx->index);
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
634 j = tables->index[c + 1];
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
635
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
636 while (i != j) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
637
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
638 if (slcf->once && ctx->sub && ctx->sub[i].data) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
639 goto next;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
640 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
641
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
642 m = &match[i].match;
1557
9d094e581587 *) add sub_filter parser fix similar to r1261 in SSI parser
Igor Sysoev <igor@sysoev.ru>
parents: 1555
diff changeset
643
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
644 pat = m->data;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
645 pat_end = m->data + m->len;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
646
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
647 if (start >= 0) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
648 p = ctx->pos + start;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
649
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
650 } else {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
651 last = ctx->looked.data + ctx->looked.len;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
652 p = last + start;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
653
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
654 while (p < last && pat < pat_end) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
655 if (ngx_tolower(*p) != *pat) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
656 goto next;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
657 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
658
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
659 p++;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
660 pat++;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
661 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
662
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
663 p = ctx->pos;
1172
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
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
666 while (p < ctx->buf->last && pat < pat_end) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
667 if (ngx_tolower(*p) != *pat) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
668 goto next;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
669 }
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
670
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
671 p++;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
672 pat++;
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
673 }
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
674
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
675 ctx->index = i;
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
676
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
677 if (pat != pat_end) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
678 /* partial match */
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
679 goto again;
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
680 }
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
681
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
682 ctx->offset = offset + (ngx_int_t) m->len;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
683 next = start + (ngx_int_t) m->len;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
684 end = ngx_max(next, 0);
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
685 rc = NGX_OK;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
686
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
687 goto done;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
688
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
689 next:
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
690
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
691 i++;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
692 }
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
693
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
694 offset++;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
695 ctx->index = 0;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
696 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
697
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
698 again:
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
699
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
700 ctx->offset = offset;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
701 start = offset - (ngx_int_t) tables->min_match_len + 1;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
702 next = start;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
703 rc = NGX_AGAIN;
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
704
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
705 done:
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
706
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
707 /* send [ - looked.len, start ] to client */
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
708
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
709 ctx->saved.len = ctx->looked.len + ngx_min(start, 0);
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
710 ngx_memcpy(ctx->saved.data, ctx->looked.data, ctx->saved.len);
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
711
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
712 ctx->copy_start = ctx->pos;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
713 ctx->copy_end = ctx->pos + ngx_max(start, 0);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
714
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
715 /* save [ next, end ] in looked */
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
716
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
717 len = ngx_min(next, 0);
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
718 p = ctx->looked.data;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
719 p = ngx_movemem(p, p + ctx->looked.len + len, - len);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
720
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
721 len = ngx_max(next, 0);
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
722 p = ngx_cpymem(p, ctx->pos + len, end - len);
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
723 ctx->looked.len = p - ctx->looked.data;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
724
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
725 /* update position */
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
726
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
727 ctx->pos += end;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
728 ctx->offset -= end;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
729
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
730 return rc;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
731 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
732
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
733
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
734 static char *
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
735 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
736 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
737 ngx_http_sub_loc_conf_t *slcf = conf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
738
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
739 ngx_str_t *value;
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
740 ngx_http_sub_pair_t *pair;
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
741 ngx_http_compile_complex_value_t ccv;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
742
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
743 value = cf->args->elts;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
744
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
745 if (value[1].len == 0) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
746 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty search pattern");
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
747 return NGX_CONF_ERROR;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
748 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
749
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
750 if (slcf->pairs == NULL) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
751 slcf->pairs = ngx_array_create(cf->pool, 1,
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
752 sizeof(ngx_http_sub_pair_t));
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
753 if (slcf->pairs == NULL) {
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
754 return NGX_CONF_ERROR;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
755 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
756 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
757
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
758 if (slcf->pairs->nelts == 255) {
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
759 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
760 "number of search patterns exceeds 255");
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
761 return NGX_CONF_ERROR;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
762 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
763
2135
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2079
diff changeset
764 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
765
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
766 pair = ngx_array_push(slcf->pairs);
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
767 if (pair == NULL) {
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
768 return NGX_CONF_ERROR;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
769 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
770
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
771 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
772
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
773 ccv.cf = cf;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
774 ccv.value = &value[1];
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
775 ccv.complex_value = &pair->match;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
776
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
777 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
778 return NGX_CONF_ERROR;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
779 }
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
780
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
781 if (ccv.complex_value->lengths != NULL) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
782 slcf->dynamic = 1;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
783
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
784 } else {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
785 ngx_strlow(pair->match.value.data, pair->match.value.data,
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
786 pair->match.value.len);
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
787 }
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
788
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
789 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
790
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
791 ccv.cf = cf;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
792 ccv.value = &value[2];
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
793 ccv.complex_value = &pair->value;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
794
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
795 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
796 return NGX_CONF_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
797 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
798
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
799 return NGX_CONF_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
800 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
801
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
802
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
803 static void *
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
804 ngx_http_sub_create_conf(ngx_conf_t *cf)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
805 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
806 ngx_http_sub_loc_conf_t *slcf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
807
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
808 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
809 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
810 return NULL;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
811 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
812
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
813 /*
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
814 * set by ngx_pcalloc():
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
815 *
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
816 * conf->dynamic = 0;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
817 * conf->pairs = NULL;
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
818 * conf->tables = NULL;
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
819 * conf->types = { NULL };
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
820 * conf->types_keys = NULL;
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
821 * conf->matches = NULL;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
822 */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
823
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
824 slcf->once = NGX_CONF_UNSET;
5229
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
825 slcf->last_modified = NGX_CONF_UNSET;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
826
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
827 return slcf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
828 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
829
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
830
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
831 static char *
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
832 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
833 {
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
834 ngx_uint_t i, n;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
835 ngx_http_sub_pair_t *pairs;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
836 ngx_http_sub_match_t *matches;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
837 ngx_http_sub_loc_conf_t *prev = parent;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
838 ngx_http_sub_loc_conf_t *conf = child;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
839
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
840 ngx_conf_merge_value(conf->once, prev->once, 1);
5229
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
841 ngx_conf_merge_value(conf->last_modified, prev->last_modified, 0);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
842
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
843 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
844 &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
845 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
846 != NGX_OK)
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
847 {
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
848 return NGX_CONF_ERROR;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
849 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
850
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
851 if (conf->pairs == NULL) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
852 conf->dynamic = prev->dynamic;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
853 conf->pairs = prev->pairs;
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
854 conf->matches = prev->matches;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
855 conf->tables = prev->tables;
6247
fbbb1c1ce1eb Sub filter: fixed initialization in http{} level (ticket #791).
Roman Arutyunyan <arut@nginx.com>
parents: 6229
diff changeset
856 }
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
857
6247
fbbb1c1ce1eb Sub filter: fixed initialization in http{} level (ticket #791).
Roman Arutyunyan <arut@nginx.com>
parents: 6229
diff changeset
858 if (conf->pairs && conf->dynamic == 0 && conf->tables == NULL) {
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
859 pairs = conf->pairs->elts;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
860 n = conf->pairs->nelts;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
861
6464
088ef087a011 Sub filter: fixed allocation alignment.
Roman Arutyunyan <arut@nginx.com>
parents: 6247
diff changeset
862 matches = ngx_palloc(cf->pool, sizeof(ngx_http_sub_match_t) * n);
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
863 if (matches == NULL) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
864 return NGX_CONF_ERROR;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
865 }
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
866
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
867 for (i = 0; i < n; i++) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
868 matches[i].match = pairs[i].match.value;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
869 matches[i].value = &pairs[i].value;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
870 }
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
871
6464
088ef087a011 Sub filter: fixed allocation alignment.
Roman Arutyunyan <arut@nginx.com>
parents: 6247
diff changeset
872 conf->matches = ngx_palloc(cf->pool, sizeof(ngx_array_t));
6229
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
873 if (conf->matches == NULL) {
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
874 return NGX_CONF_ERROR;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
875 }
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
876
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
877 conf->matches->elts = matches;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
878 conf->matches->nelts = n;
2c045e5b8291 Sub filter: support of variables in the strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6228
diff changeset
879
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
880 conf->tables = ngx_palloc(cf->pool, sizeof(ngx_http_sub_tables_t));
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
881 if (conf->tables == NULL) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
882 return NGX_CONF_ERROR;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
883 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
884
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
885 ngx_http_sub_init_tables(conf->tables, conf->matches->elts,
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
886 conf->matches->nelts);
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
887 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
888
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
889 return NGX_CONF_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
890 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
891
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
892
6228
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
893 static void
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
894 ngx_http_sub_init_tables(ngx_http_sub_tables_t *tables,
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
895 ngx_http_sub_match_t *match, ngx_uint_t n)
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
896 {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
897 u_char c;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
898 ngx_uint_t i, j, min, max, ch;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
899
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
900 min = match[0].match.len;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
901 max = match[0].match.len;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
902
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
903 for (i = 1; i < n; i++) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
904 min = ngx_min(min, match[i].match.len);
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
905 max = ngx_max(max, match[i].match.len);
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
906 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
907
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
908 tables->min_match_len = min;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
909 tables->max_match_len = max;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
910
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
911 ngx_http_sub_cmp_index = tables->min_match_len - 1;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
912 ngx_sort(match, n, sizeof(ngx_http_sub_match_t), ngx_http_sub_cmp_matches);
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
913
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
914 min = ngx_min(min, 255);
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
915 ngx_memset(tables->shift, min, 256);
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
916
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
917 ch = 0;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
918
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
919 for (i = 0; i < n; i++) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
920
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
921 for (j = 0; j < min; j++) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
922 c = match[i].match.data[tables->min_match_len - 1 - j];
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
923 tables->shift[c] = ngx_min(tables->shift[c], (u_char) j);
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
924 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
925
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
926 c = match[i].match.data[tables->min_match_len - 1];
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
927 while (ch <= c) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
928 tables->index[ch++] = (u_char) i;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
929 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
930 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
931
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
932 while (ch < 257) {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
933 tables->index[ch++] = (u_char) n;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
934 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
935 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
936
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
937
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
938 static ngx_int_t
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
939 ngx_http_sub_cmp_matches(const void *one, const void *two)
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
940 {
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
941 ngx_int_t c1, c2;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
942 ngx_http_sub_match_t *first, *second;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
943
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
944 first = (ngx_http_sub_match_t *) one;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
945 second = (ngx_http_sub_match_t *) two;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
946
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
947 c1 = first->match.data[ngx_http_sub_cmp_index];
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
948 c2 = second->match.data[ngx_http_sub_cmp_index];
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
949
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
950 return c1 - c2;
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
951 }
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
952
b9447fc457b4 Sub filter: support of multiple strings to replace.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 5810
diff changeset
953
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
954 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
955 ngx_http_sub_filter_init(ngx_conf_t *cf)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
956 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
957 ngx_http_next_header_filter = ngx_http_top_header_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
958 ngx_http_top_header_filter = ngx_http_sub_header_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
959
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
960 ngx_http_next_body_filter = ngx_http_top_body_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
961 ngx_http_top_body_filter = ngx_http_sub_body_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
962
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
963 return NGX_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
964 }