annotate src/http/modules/ngx_http_sub_filter_module.c @ 5543:5730c0193842

Mp4: skip tracks shorter than seek position (ticket #414). Mp4 module does not check movie and track durations when reading file. Instead it generates errors when track metadata is shorter than seek position. Now such tracks are skipped and movie duration check is performed at file read stage.
author Roman Arutyunyan <arut@nginx.com>
date Wed, 29 Jan 2014 13:33:45 +0400
parents 102d7117ffb8
children 9e9c1310d17c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 3675
diff changeset
4 * Copyright (C) Nginx, Inc.
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 typedef struct {
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
14 ngx_str_t match;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
15 ngx_http_complex_value_t value;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
17 ngx_hash_t types;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
19 ngx_flag_t once;
5229
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
20 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
21
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
22 ngx_array_t *types_keys;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23 } ngx_http_sub_loc_conf_t;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 typedef enum {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27 sub_start_state = 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 sub_match_state,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 } ngx_http_sub_state_e;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 typedef struct {
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
33 ngx_str_t match;
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
34 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
35 ngx_str_t looked;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
37 ngx_uint_t once; /* unsigned once:1 */
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
39 ngx_buf_t *buf;
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 u_char *pos;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
42 u_char *copy_start;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
43 u_char *copy_end;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
45 ngx_chain_t *in;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
46 ngx_chain_t *out;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
47 ngx_chain_t **last_out;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
48 ngx_chain_t *busy;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
49 ngx_chain_t *free;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
51 ngx_str_t sub;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
53 ngx_uint_t state;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 } ngx_http_sub_ctx_t;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 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
58 ngx_http_sub_ctx_t *ctx);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 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
60 ngx_http_sub_ctx_t *ctx);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 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
63 void *conf);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 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
65 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
66 void *parent, void *child);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 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
68
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 static ngx_command_t ngx_http_sub_filter_commands[] = {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 { ngx_string("sub_filter"),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 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
74 ngx_http_sub_filter,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 NGX_HTTP_LOC_CONF_OFFSET,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 NULL },
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 { ngx_string("sub_filter_types"),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 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
81 ngx_http_types_slot,
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 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
83 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
84 &ngx_http_html_default_types[0] },
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 { ngx_string("sub_filter_once"),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 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
88 ngx_conf_set_flag_slot,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 NGX_HTTP_LOC_CONF_OFFSET,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 offsetof(ngx_http_sub_loc_conf_t, once),
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 NULL },
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92
5229
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
93 { ngx_string("sub_filter_last_modified"),
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
94 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
95 ngx_conf_set_flag_slot,
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
96 NGX_HTTP_LOC_CONF_OFFSET,
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
97 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
98 NULL },
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
99
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 ngx_null_command
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 };
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 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
105 NULL, /* preconfiguration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 ngx_http_sub_filter_init, /* postconfiguration */
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 NULL, /* create main configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 NULL, /* init main configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 NULL, /* create server configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 NULL, /* merge server configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 ngx_http_sub_create_conf, /* create location configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 ngx_http_sub_merge_conf /* merge location configuration */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 };
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 ngx_module_t ngx_http_sub_filter_module = {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 NGX_MODULE_V1,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 &ngx_http_sub_filter_module_ctx, /* module context */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 ngx_http_sub_filter_commands, /* module directives */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 NGX_HTTP_MODULE, /* module type */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124 NULL, /* init master */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 NULL, /* init module */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 NULL, /* init process */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 NULL, /* init thread */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 NULL, /* exit thread */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 NULL, /* exit process */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 NULL, /* exit master */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 NGX_MODULE_V1_PADDING
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 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
136 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
137
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 ngx_http_sub_header_filter(ngx_http_request_t *r)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 ngx_http_sub_ctx_t *ctx;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 ngx_http_sub_loc_conf_t *slcf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145 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
146
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 if (slcf->match.len == 0
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
148 || 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
149 || ngx_http_test_content_type(r, &slcf->types) == NULL)
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 return ngx_http_next_header_filter(r);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 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
155 if (ctx == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
159 ctx->saved.data = ngx_pnalloc(r->pool, slcf->match.len);
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
160 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
161 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
162 }
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
163
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
164 ctx->looked.data = ngx_pnalloc(r->pool, slcf->match.len);
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
165 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
166 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
167 }
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
168
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 ngx_http_set_ctx(r, ctx, ngx_http_sub_filter_module);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171 ctx->match = slcf->match;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 ctx->last_out = &ctx->out;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 r->filter_need_in_memory = 1;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 if (r == r->main) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177 ngx_http_clear_content_length(r);
4746
4a18bf1833a9 Entity tags: clear on entity changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
178 ngx_http_clear_etag(r);
5229
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
179
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
180 if (!slcf->last_modified) {
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
181 ngx_http_clear_last_modified(r);
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
182 }
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 return ngx_http_next_header_filter(r);
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190 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
191 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 ngx_int_t rc;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 ngx_buf_t *b;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194 ngx_chain_t *cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 ngx_http_sub_ctx_t *ctx;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196 ngx_http_sub_loc_conf_t *slcf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198 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
199
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200 if (ctx == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 return ngx_http_next_body_filter(r, in);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204 if ((in == NULL
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
205 && ctx->buf == NULL
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206 && ctx->in == NULL
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207 && ctx->busy == NULL))
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
208 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209 return ngx_http_next_body_filter(r, in);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
210 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
211
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
212 if (ctx->once && (ctx->buf == NULL || ctx->in == NULL)) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214 if (ctx->busy) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215 if (ngx_http_sub_output(r, ctx) == NGX_ERROR) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
217 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220 return ngx_http_next_body_filter(r, in);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223 /* add the incoming chain to the chain ctx->in */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225 if (in) {
2536
a6d6d762c554 small optimization: " == NGX_ERROR" > " != NGX_OK"
Igor Sysoev <igor@sysoev.ru>
parents: 2414
diff changeset
226 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
227 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231 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
232 "http sub filter \"%V\"", &r->uri);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234 while (ctx->in || ctx->buf) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235
3642
ac33852faaac style fix
Igor Sysoev <igor@sysoev.ru>
parents: 3372
diff changeset
236 if (ctx->buf == NULL) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237 ctx->buf = ctx->in->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238 ctx->in = ctx->in->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 ctx->pos = ctx->buf->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 if (ctx->state == sub_start_state) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243 ctx->copy_start = ctx->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 ctx->copy_end = ctx->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 b = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249 while (ctx->pos < ctx->buf->last) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
250
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
252 "saved: \"%V\" state: %d", &ctx->saved, ctx->state);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254 rc = ngx_http_sub_parse(r, ctx);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
255
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
256 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
257 "parse: %d, looked: \"%V\" %p-%p",
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
258 rc, &ctx->looked, ctx->copy_start, ctx->copy_end);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260 if (rc == NGX_ERROR) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261 return rc;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
262 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
264 if (ctx->saved.len) {
1172
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 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
267 "saved: \"%V\"", &ctx->saved);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
269 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
270 if (cl == NULL) {
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
271 return NGX_ERROR;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
272 }
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
273
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
274 b = cl->buf;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
275
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
276 ngx_memzero(b, sizeof(ngx_buf_t));
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
278 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
279 if (b->pos == NULL) {
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
280 return NGX_ERROR;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
281 }
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
282
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
283 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
284 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
285 b->memory = 1;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
286
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
287 *ctx->last_out = cl;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
288 ctx->last_out = &cl->next;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
289
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
290 ctx->saved.len = 0;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
291 }
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
292
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
293 if (ctx->copy_start != ctx->copy_end) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
294
5285
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
295 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
296 if (cl == NULL) {
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
297 return NGX_ERROR;
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
298 }
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299
5285
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
300 b = cl->buf;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302 ngx_memcpy(b, ctx->buf, sizeof(ngx_buf_t));
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 b->pos = ctx->copy_start;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
305 b->last = ctx->copy_end;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
306 b->shadow = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
307 b->last_buf = 0;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308 b->recycled = 0;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310 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
311 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
312 b->file_pos += b->pos - ctx->buf->pos;
1172
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 *ctx->last_out = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316 ctx->last_out = &cl->next;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319 if (ctx->state == sub_start_state) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
320 ctx->copy_start = ctx->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
321 ctx->copy_end = ctx->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
322
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
323 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
324 ctx->copy_start = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
325 ctx->copy_end = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
326 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
327
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
328 if (ctx->looked.len > (size_t) (ctx->pos - ctx->buf->pos)) {
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
329 ctx->saved.len = ctx->looked.len - (ctx->pos - ctx->buf->pos);
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
330 ngx_memcpy(ctx->saved.data, ctx->looked.data, ctx->saved.len);
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
331 }
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
332
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
333 if (rc == NGX_AGAIN) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
334 continue;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338 /* rc == NGX_OK */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339
5285
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
340 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
341 if (cl == NULL) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
342 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
343 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
344
5285
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
345 b = cl->buf;
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
346
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
347 ngx_memzero(b, sizeof(ngx_buf_t));
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
348
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
349 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
350
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
351 if (ctx->sub.data == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
352
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
353 if (ngx_http_complex_value(r, &slcf->value, &ctx->sub)
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
354 != NGX_OK)
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
355 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
356 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
357 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
358 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
359
1555
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
360 if (ctx->sub.len) {
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
361 b->memory = 1;
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
362 b->pos = ctx->sub.data;
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
363 b->last = ctx->sub.data + ctx->sub.len;
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
364
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
365 } else {
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
366 b->sync = 1;
76fe59c6fafb fix empty string replacement in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 1172
diff changeset
367 }
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
368
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
369 *ctx->last_out = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
370 ctx->last_out = &cl->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
371
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
372 ctx->once = slcf->once;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
374 continue;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
375 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
376
5287
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
377 if (ctx->buf->last_buf && ctx->looked.len) {
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
378 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
379 if (cl == NULL) {
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
380 return NGX_ERROR;
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
381 }
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
382
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
383 b = cl->buf;
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
384
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
385 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
386
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
387 b->pos = ctx->looked.data;
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
388 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
389 b->memory = 1;
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
390
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
391 *ctx->last_out = cl;
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
392 ctx->last_out = &cl->next;
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
393
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
394 ctx->looked.len = 0;
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
395 }
2dbc5e38b65d Sub filter: fixed incomplete last buffer on partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5286
diff changeset
396
5286
819c5b53d8b5 Sub filter: flush buffers handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5285
diff changeset
397 if (ctx->buf->last_buf || ctx->buf->flush
819c5b53d8b5 Sub filter: flush buffers handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5285
diff changeset
398 || ngx_buf_in_memory(ctx->buf))
819c5b53d8b5 Sub filter: flush buffers handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5285
diff changeset
399 {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
400 if (b == NULL) {
5285
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
401 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
402 if (cl == NULL) {
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
403 return NGX_ERROR;
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
404 }
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
405
5285
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
406 b = cl->buf;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
407
5285
d47ef93134e5 Sub filter: switched to ngx_chain_get_free_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 5284
diff changeset
408 ngx_memzero(b, sizeof(ngx_buf_t));
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
409
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
410 b->sync = 1;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
411
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
412 *ctx->last_out = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413 ctx->last_out = &cl->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
414 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
415
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416 b->last_buf = ctx->buf->last_buf;
5286
819c5b53d8b5 Sub filter: flush buffers handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5285
diff changeset
417 b->flush = ctx->buf->flush;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
418 b->shadow = ctx->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420 b->recycled = ctx->buf->recycled;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
422
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
423 ctx->buf = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
424
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
425 ctx->saved.len = ctx->looked.len;
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
426 ngx_memcpy(ctx->saved.data, ctx->looked.data, ctx->looked.len);
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
427 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
428
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
429 if (ctx->out == NULL && ctx->busy == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
430 return NGX_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
431 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
433 return ngx_http_sub_output(r, ctx);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
434 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
435
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
436
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438 ngx_http_sub_output(ngx_http_request_t *r, ngx_http_sub_ctx_t *ctx)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
439 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
440 ngx_int_t rc;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
441 ngx_buf_t *b;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
442 ngx_chain_t *cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
443
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
444 #if 1
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
445 b = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446 for (cl = ctx->out; cl; cl = cl->next) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
447 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
448 "sub out: %p %p", cl->buf, cl->buf->pos);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449 if (cl->buf == b) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
451 "the same buf was used in sub");
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
452 ngx_debug_point();
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
453 return NGX_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
454 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
455 b = cl->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
456 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
457 #endif
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
458
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
459 rc = ngx_http_next_body_filter(r, ctx->out);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
460
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
461 if (ctx->busy == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
462 ctx->busy = ctx->out;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
464 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
465 for (cl = ctx->busy; cl->next; cl = cl->next) { /* void */ }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
466 cl->next = ctx->out;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
467 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
468
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
469 ctx->out = NULL;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
470 ctx->last_out = &ctx->out;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
471
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
472 while (ctx->busy) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
474 cl = ctx->busy;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
475 b = cl->buf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
476
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
477 if (ngx_buf_size(b) != 0) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478 break;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
480
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481 if (b->shadow) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
482 b->shadow->pos = b->shadow->last;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
484
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485 ctx->busy = cl->next;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
486
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
487 if (ngx_buf_in_memory(b) || b->in_file) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488 /* add data bufs only to the free buf chain */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490 cl->next = ctx->free;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491 ctx->free = cl;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
494
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495 if (ctx->in || ctx->buf) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496 r->buffered |= NGX_HTTP_SUB_BUFFERED;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
497
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
498 } else {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
499 r->buffered &= ~NGX_HTTP_SUB_BUFFERED;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
500 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
501
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
502 return rc;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
504
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
505
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
506 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
507 ngx_http_sub_parse(ngx_http_request_t *r, ngx_http_sub_ctx_t *ctx)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
508 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
509 u_char *p, *last, *copy_end, ch, match;
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
510 size_t looked, i;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
511 ngx_http_sub_state_e state;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
512
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
513 if (ctx->once) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
514 ctx->copy_start = ctx->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
515 ctx->copy_end = ctx->buf->last;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
516 ctx->pos = ctx->buf->last;
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
517 ctx->looked.len = 0;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
518
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
519 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "once");
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
520
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
521 return NGX_AGAIN;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
522 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
523
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
524 state = ctx->state;
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
525 looked = ctx->looked.len;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
526 last = ctx->buf->last;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
527 copy_end = ctx->copy_end;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
528
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
529 for (p = ctx->pos; p < last; p++) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
530
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
531 ch = *p;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
532 ch = ngx_tolower(ch);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
533
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
534 if (state == sub_start_state) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
535
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
536 /* the tight loop */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
537
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
538 match = ctx->match.data[0];
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
539
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
540 for ( ;; ) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
541 if (ch == match) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
542 copy_end = p;
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
543 ctx->looked.data[0] = *p;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
544 looked = 1;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
545 state = sub_match_state;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
546
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
547 goto match_started;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
548 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
549
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
550 if (++p == last) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
551 break;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
552 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
553
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
554 ch = *p;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
555 ch = ngx_tolower(ch);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
556 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
557
1557
9d094e581587 *) add sub_filter parser fix similar to r1261 in SSI parser
Igor Sysoev <igor@sysoev.ru>
parents: 1555
diff changeset
558 ctx->state = state;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
559 ctx->pos = p;
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
560 ctx->looked.len = looked;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
561 ctx->copy_end = p;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
562
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
563 if (ctx->copy_start == NULL) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
564 ctx->copy_start = ctx->buf->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
565 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
566
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
567 return NGX_AGAIN;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
568
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
569 match_started:
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
570
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
571 continue;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
572 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
573
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
574 /* state == sub_match_state */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
575
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
576 if (ch == ctx->match.data[looked]) {
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
577 ctx->looked.data[looked] = *p;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
578 looked++;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
579
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
580 if (looked == ctx->match.len) {
1557
9d094e581587 *) add sub_filter parser fix similar to r1261 in SSI parser
Igor Sysoev <igor@sysoev.ru>
parents: 1555
diff changeset
581
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
582 ctx->state = sub_start_state;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
583 ctx->pos = p + 1;
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
584 ctx->looked.len = 0;
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
585 ctx->saved.len = 0;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
586 ctx->copy_end = copy_end;
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 if (ctx->copy_start == NULL && copy_end) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
589 ctx->copy_start = ctx->buf->pos;
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 return NGX_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
593 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
594
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
595 } else {
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
596 /*
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
597 * check if there is another partial match in previously
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
598 * matched substring to catch cases like "aab" in "aaab"
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
599 */
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
600
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
601 ctx->looked.data[looked] = *p;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
602 looked++;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
603
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
604 for (i = 1; i < looked; i++) {
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
605 if (ngx_strncasecmp(ctx->looked.data + i,
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
606 ctx->match.data, looked - i)
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
607 == 0)
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
608 {
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
609 break;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
610 }
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
611 }
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
612
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
613 if (i < looked) {
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
614 if (ctx->saved.len > i) {
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
615 ctx->saved.len = i;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
616 }
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
617
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
618 if ((size_t) (p + 1 - ctx->buf->pos) >= looked - i) {
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
619 copy_end = p + 1 - (looked - i);
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
620 }
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
621
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
622 ngx_memmove(ctx->looked.data, ctx->looked.data + i, looked - i);
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
623 looked = looked - i;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
624
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
625 } else {
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
626 copy_end = p;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
627 looked = 0;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
628 state = sub_start_state;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
629 }
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
630
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
631 if (ctx->saved.len) {
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
632 p++;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
633 goto out;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
634 }
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
635 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
636 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
637
5288
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
638 ctx->saved.len = 0;
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
639
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
640 out:
102d7117ffb8 Sub filter: fixed matching after a partial match.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5287
diff changeset
641
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
642 ctx->state = state;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
643 ctx->pos = p;
3675
08d7165b6be1 fix case of partially matched patterns on buffer border in sub_filter
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
644 ctx->looked.len = looked;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
645
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
646 ctx->copy_end = (state == sub_start_state) ? p : copy_end;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
647
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
648 if (ctx->copy_start == NULL && ctx->copy_end) {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
649 ctx->copy_start = ctx->buf->pos;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
650 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
651
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
652 return NGX_AGAIN;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
653 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
654
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
655
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
656 static char *
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
657 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
658 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
659 ngx_http_sub_loc_conf_t *slcf = conf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
660
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
661 ngx_str_t *value;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
662 ngx_http_compile_complex_value_t ccv;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
663
4947
4251e72b8bb4 Allow the complex value to be defined as an empty string.
Ruslan Ermilov <ru@nginx.com>
parents: 4746
diff changeset
664 if (slcf->match.data) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
665 return "is duplicate";
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
666 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
667
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
668 value = cf->args->elts;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
669
2135
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2079
diff changeset
670 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
671
2135
8c6521eedf84 ngx_strlow()
Igor Sysoev <igor@sysoev.ru>
parents: 2079
diff changeset
672 slcf->match = value[1];
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
673
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
674 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
675
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
676 ccv.cf = cf;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
677 ccv.value = &value[2];
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
678 ccv.complex_value = &slcf->value;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
679
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
680 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
681 return NGX_CONF_ERROR;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
682 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
683
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
684 return NGX_CONF_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
685 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
686
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
687
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
688 static void *
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
689 ngx_http_sub_create_conf(ngx_conf_t *cf)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
690 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
691 ngx_http_sub_loc_conf_t *slcf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
692
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
693 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
694 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
695 return NULL;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
698 /*
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
699 * set by ngx_pcalloc():
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
700 *
2166
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
701 * conf->match = { 0, NULL };
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
702 * conf->types = { NULL };
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
703 * conf->types_keys = NULL;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
704 */
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
705
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
706 slcf->once = NGX_CONF_UNSET;
5229
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
707 slcf->last_modified = NGX_CONF_UNSET;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
708
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
709 return slcf;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
710 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
711
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
712
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
713 static char *
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
714 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
715 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
716 ngx_http_sub_loc_conf_t *prev = parent;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
717 ngx_http_sub_loc_conf_t *conf = child;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
718
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
719 ngx_conf_merge_value(conf->once, prev->once, 1);
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
720 ngx_conf_merge_str_value(conf->match, prev->match, "");
5229
4c1a604b0285 Sub filter: sub_filter_last_modified directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4947
diff changeset
721 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
722
4947
4251e72b8bb4 Allow the complex value to be defined as an empty string.
Ruslan Ermilov <ru@nginx.com>
parents: 4746
diff changeset
723 if (conf->value.value.data == NULL) {
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2536
diff changeset
724 conf->value = prev->value;
1172
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
725 }
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
726
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
727 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
728 &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
729 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
730 != NGX_OK)
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
731 {
723df5089c05 use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents: 2135
diff changeset
732 return NGX_CONF_ERROR;
1172
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
735 return NGX_CONF_OK;
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
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
738
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
739 static ngx_int_t
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
740 ngx_http_sub_filter_init(ngx_conf_t *cf)
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
741 {
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
742 ngx_http_next_header_filter = ngx_http_top_header_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
743 ngx_http_top_header_filter = ngx_http_sub_header_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
744
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
745 ngx_http_next_body_filter = ngx_http_top_body_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
746 ngx_http_top_body_filter = ngx_http_sub_body_filter;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
747
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
748 return NGX_OK;
383ae25c3171 ngx_http_sub_filter_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
749 }