annotate src/http/modules/ngx_http_addition_filter_module.c @ 9274:46ecad404a29 default tip

Mail: reset imap tag to empty after authentication attempt. We need to reset the imap tag to empty after an authentication attempt completes, otherwise if the next line parsed is incomplete with no tag (e.g. empty line) then we use the "tag" from the previous buffer which is now definitely wrong and has been partially overwritten with the most recently read data (e.g. CRLF). An example before this patch: S: * OK IMAP4 ready C: foobar login a b S: foobar NO Incorrect username or password. C: S: S: obar BAD invalid command Then with this patch: S: * OK IMAP4 ready C: foobar login a b S: foobar NO Incorrect username or password. C: S: * BAD invalid command
author Rob Mueller <robm@fastmailteam.com>
date Wed, 15 May 2024 10:06:00 +0300
parents f583559aadc7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 3372
diff changeset
4 * Copyright (C) Nginx, Inc.
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 typedef struct {
2167
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
14 ngx_str_t before_body;
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
15 ngx_str_t after_body;
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
16
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
17 ngx_hash_t types;
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
18 ngx_array_t *types_keys;
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19 } ngx_http_addition_conf_t;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 typedef struct {
2167
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
23 ngx_uint_t before_body_sent;
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 } ngx_http_addition_ctx_t;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27 static void *ngx_http_addition_create_conf(ngx_conf_t *cf);
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 static char *ngx_http_addition_merge_conf(ngx_conf_t *cf, void *parent,
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 void *child);
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
30 static ngx_int_t ngx_http_addition_filter_init(ngx_conf_t *cf);
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 static ngx_command_t ngx_http_addition_commands[] = {
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 { ngx_string("add_before_body"),
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37 ngx_conf_set_str_slot,
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38 NGX_HTTP_LOC_CONF_OFFSET,
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 offsetof(ngx_http_addition_conf_t, before_body),
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 NULL },
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 { ngx_string("add_after_body"),
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 ngx_conf_set_str_slot,
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 NGX_HTTP_LOC_CONF_OFFSET,
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 offsetof(ngx_http_addition_conf_t, after_body),
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47 NULL },
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48
3146
29ba1de1ab0b fix typo in addition_types directive name
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
49 { ngx_string("addition_types"),
2167
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
50 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
51 ngx_http_types_slot,
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
52 NGX_HTTP_LOC_CONF_OFFSET,
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
53 offsetof(ngx_http_addition_conf_t, types_keys),
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
54 &ngx_http_html_default_types[0] },
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
55
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 ngx_null_command
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 };
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 static ngx_http_module_t ngx_http_addition_filter_module_ctx = {
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 NULL, /* preconfiguration */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
62 ngx_http_addition_filter_init, /* postconfiguration */
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 NULL, /* create main configuration */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 NULL, /* init main configuration */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 NULL, /* create server configuration */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 NULL, /* merge server configuration */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 ngx_http_addition_create_conf, /* create location configuration */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 ngx_http_addition_merge_conf /* merge location configuration */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 };
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 ngx_module_t ngx_http_addition_filter_module = {
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 NGX_MODULE_V1,
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 &ngx_http_addition_filter_module_ctx, /* module context */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 ngx_http_addition_commands, /* module directives */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 NGX_HTTP_MODULE, /* module type */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 NULL, /* init master */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
81 NULL, /* init module */
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 NULL, /* init process */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 NULL, /* init thread */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 NULL, /* exit thread */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 NULL, /* exit process */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 NULL, /* exit master */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 NGX_MODULE_V1_PADDING
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 };
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 static ngx_int_t
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 ngx_http_addition_header_filter(ngx_http_request_t *r)
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 {
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 ngx_http_addition_ctx_t *ctx;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 ngx_http_addition_conf_t *conf;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100
2167
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
101 if (r->headers_out.status != NGX_HTTP_OK || r != r->main) {
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 return ngx_http_next_header_filter(r);
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104
631
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
105 conf = ngx_http_get_module_loc_conf(r, ngx_http_addition_filter_module);
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
106
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
107 if (conf->before_body.len == 0 && conf->after_body.len == 0) {
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
108 return ngx_http_next_header_filter(r);
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
109 }
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
110
2167
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
111 if (ngx_http_test_content_type(r, &conf->types) == NULL) {
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 return ngx_http_next_header_filter(r);
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_addition_ctx_t));
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 if (ctx == NULL) {
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 return NGX_ERROR;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 ngx_http_set_ctx(r, ctx, ngx_http_addition_filter_module);
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 ngx_http_clear_content_length(r);
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 ngx_http_clear_accept_ranges(r);
5733
e491b26fa5a1 Entity tags: downgrade strong etags to weak ones as needed.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4746
diff changeset
124 ngx_http_weak_etag(r);
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125
7070
f583559aadc7 Upstream: keep request body file from removal if requested.
Roman Arutyunyan <arut@nginx.com>
parents: 6723
diff changeset
126 r->preserve_body = 1;
f583559aadc7 Upstream: keep request body file from removal if requested.
Roman Arutyunyan <arut@nginx.com>
parents: 6723
diff changeset
127
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 return ngx_http_next_header_filter(r);
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 static ngx_int_t
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 ngx_http_addition_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 {
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 ngx_int_t rc;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 ngx_uint_t last;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 ngx_chain_t *cl;
758
86bb73dc8d40 fix <!--#include virtual=... wait="yes" -->
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
138 ngx_http_request_t *sr;
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 ngx_http_addition_ctx_t *ctx;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 ngx_http_addition_conf_t *conf;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 if (in == NULL || r->header_only) {
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 return ngx_http_next_body_filter(r, in);
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 ctx = ngx_http_get_module_ctx(r, ngx_http_addition_filter_module);
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 if (ctx == NULL) {
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 return ngx_http_next_body_filter(r, in);
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 conf = ngx_http_get_module_loc_conf(r, ngx_http_addition_filter_module);
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 if (!ctx->before_body_sent) {
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 ctx->before_body_sent = 1;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 if (conf->before_body.len) {
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2167
diff changeset
158 if (ngx_http_subrequest(r, &conf->before_body, NULL, &sr, NULL, 0)
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2167
diff changeset
159 != NGX_OK)
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2167
diff changeset
160 {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2167
diff changeset
161 return NGX_ERROR;
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165
846
c2cae54f2045 fix add_before_body without add_after_body
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
166 if (conf->after_body.len == 0) {
c2cae54f2045 fix add_before_body without add_after_body
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
167 ngx_http_set_ctx(r, NULL, ngx_http_addition_filter_module);
c2cae54f2045 fix add_before_body without add_after_body
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
168 return ngx_http_next_body_filter(r, in);
c2cae54f2045 fix add_before_body without add_after_body
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
169 }
c2cae54f2045 fix add_before_body without add_after_body
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
170
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171 last = 0;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 for (cl = in; cl; cl = cl->next) {
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 if (cl->buf->last_buf) {
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175 cl->buf->last_buf = 0;
6723
ebba2f980489 Addition filter: set last_in_chain flag when clearing last_buf.
Roman Arutyunyan <arut@nginx.com>
parents: 5733
diff changeset
176 cl->buf->last_in_chain = 1;
631
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
177 cl->buf->sync = 1;
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178 last = 1;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182 rc = ngx_http_next_body_filter(r, in);
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183
631
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
184 if (rc == NGX_ERROR || !last || conf->after_body.len == 0) {
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 return rc;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187
2377
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2167
diff changeset
188 if (ngx_http_subrequest(r, &conf->after_body, NULL, &sr, NULL, 0)
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2167
diff changeset
189 != NGX_OK)
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2167
diff changeset
190 {
87b8c44906b5 *) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents: 2167
diff changeset
191 return NGX_ERROR;
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193
631
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 629
diff changeset
194 ngx_http_set_ctx(r, NULL, ngx_http_addition_filter_module);
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196 return ngx_http_send_special(r, NGX_HTTP_LAST);
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200 static ngx_int_t
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
201 ngx_http_addition_filter_init(ngx_conf_t *cf)
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 {
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 ngx_http_next_header_filter = ngx_http_top_header_filter;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204 ngx_http_top_header_filter = ngx_http_addition_header_filter;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
205
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206 ngx_http_next_body_filter = ngx_http_top_body_filter;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207 ngx_http_top_body_filter = ngx_http_addition_body_filter;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
208
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209 return NGX_OK;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
210 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
211
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
212
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213 static void *
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214 ngx_http_addition_create_conf(ngx_conf_t *cf)
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215 {
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216 ngx_http_addition_conf_t *conf;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
217
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_addition_conf_t));
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219 if (conf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2377
diff changeset
220 return NULL;
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223 /*
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224 * set by ngx_pcalloc():
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225 *
2167
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
226 * conf->before_body = { 0, NULL };
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
227 * conf->after_body = { 0, NULL };
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
228 * conf->types = { NULL };
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
229 * conf->types_keys = NULL;
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230 */
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 return conf;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233 }
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 static char *
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237 ngx_http_addition_merge_conf(ngx_conf_t *cf, void *parent, void *child)
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238 {
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 ngx_http_addition_conf_t *prev = parent;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 ngx_http_addition_conf_t *conf = child;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 ngx_conf_merge_str_value(conf->before_body, prev->before_body, "");
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243 ngx_conf_merge_str_value(conf->after_body, prev->after_body, "");
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244
3372
6b8e5c882e47 support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents: 3146
diff changeset
245 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: 3146
diff changeset
246 &prev->types_keys, &prev->types,
2167
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
247 ngx_http_html_default_types)
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
248 != NGX_OK)
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
249 {
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
250 return NGX_CONF_ERROR;
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
251 }
2cdefc40cabd *) charset_types
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
252
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253 return NGX_CONF_OK;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254 }