Mercurial > hg > ngx_http_compose_filter_module
annotate ngx_http_compose_filter_module.c @ 7:88272d0f29f9
Make sure upstream's status line won't be reused.
Range filter may change status to 206 Partial Content, but if we got
status line from upstream this won't have any effect on status sent to
client. Clear r->status_line when enabling range filter.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Sat, 20 Sep 2008 03:49:24 +0400 |
parents | 27628b3310ab |
children |
rev | line source |
---|---|
0
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
1 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
2 /* |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
3 * Copyright (C) Maxim Dounin |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
4 */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
5 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
6 #include <ngx_config.h> |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
7 #include <ngx_core.h> |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
8 #include <ngx_http.h> |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
9 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
10 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
11 typedef struct { |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
12 ngx_flag_t enable; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
13 } ngx_http_compose_conf_t; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
14 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
15 |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
16 typedef struct { |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
17 ngx_uint_t done; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
18 ngx_array_t parts; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
19 } ngx_http_compose_ctx_t; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
20 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
21 |
0
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
22 static void *ngx_http_compose_create_conf(ngx_conf_t *cf); |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
23 static char *ngx_http_compose_merge_conf(ngx_conf_t *cf, void *parent, |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
24 void *child); |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
25 static ngx_int_t ngx_http_compose_init(ngx_conf_t *cf); |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
26 static ngx_int_t ngx_http_compose_body_init(ngx_conf_t *cf); |
0
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
27 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
28 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
29 static ngx_command_t ngx_http_compose_commands[] = { |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
30 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
31 { ngx_string("compose"), |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
32 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
33 ngx_conf_set_flag_slot, |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
34 NGX_HTTP_LOC_CONF_OFFSET, |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
35 offsetof(ngx_http_compose_conf_t, enable), |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
36 NULL }, |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
37 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
38 ngx_null_command |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
39 }; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
40 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
41 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
42 static ngx_http_module_t ngx_http_compose_module_ctx = { |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
43 NULL, /* preconfiguration */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
44 ngx_http_compose_init, /* postconfiguration */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
45 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
46 NULL, /* create main configuration */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
47 NULL, /* init main configuration */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
48 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
49 NULL, /* create server configuration */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
50 NULL, /* merge server configuration */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
51 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
52 ngx_http_compose_create_conf, /* create location configuration */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
53 ngx_http_compose_merge_conf /* merge location configuration */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
54 }; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
55 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
56 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
57 ngx_module_t ngx_http_compose_filter_module = { |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
58 NGX_MODULE_V1, |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
59 &ngx_http_compose_module_ctx, /* module context */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
60 ngx_http_compose_commands, /* module directives */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
61 NGX_HTTP_MODULE, /* module type */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
62 NULL, /* init master */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
63 NULL, /* init module */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
64 NULL, /* init process */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
65 NULL, /* init thread */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
66 NULL, /* exit thread */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
67 NULL, /* exit process */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
68 NULL, /* exit master */ |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
69 NGX_MODULE_V1_PADDING |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
70 }; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
71 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
72 |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
73 static ngx_http_module_t ngx_http_compose_body_module_ctx = { |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
74 NULL, /* preconfiguration */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
75 ngx_http_compose_body_init, /* postconfiguration */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
76 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
77 NULL, /* create main configuration */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
78 NULL, /* init main configuration */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
79 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
80 NULL, /* create server configuration */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
81 NULL, /* merge server configuration */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
82 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
83 NULL, /* create location configuration */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
84 NULL /* merge location configuration */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
85 }; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
86 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
87 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
88 ngx_module_t ngx_http_compose_body_filter_module = { |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
89 NGX_MODULE_V1, |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
90 &ngx_http_compose_body_module_ctx, /* module context */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
91 NULL, /* module directives */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
92 NGX_HTTP_MODULE, /* module type */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
93 NULL, /* init master */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
94 NULL, /* init module */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
95 NULL, /* init process */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
96 NULL, /* init thread */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
97 NULL, /* exit thread */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
98 NULL, /* exit process */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
99 NULL, /* exit master */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
100 NGX_MODULE_V1_PADDING |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
101 }; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
102 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
103 |
0
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
104 static ngx_http_output_header_filter_pt ngx_http_next_header_filter; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
105 static ngx_http_output_body_filter_pt ngx_http_next_body_filter; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
106 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
107 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
108 static ngx_int_t |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
109 ngx_http_compose_header_filter(ngx_http_request_t *r) |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
110 { |
6
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
111 off_t len; |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
112 ngx_uint_t i; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
113 ngx_str_t *uri; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
114 ngx_list_part_t *part; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
115 ngx_table_elt_t *header; |
0
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
116 ngx_http_compose_conf_t *conf; |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
117 ngx_http_compose_ctx_t *ctx; |
0
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
118 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
119 conf = ngx_http_get_module_loc_conf(r, ngx_http_compose_filter_module); |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
120 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
121 if (!conf->enable) { |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
122 return ngx_http_next_header_filter(r); |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
123 } |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
124 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
125 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
126 "compose header filter"); |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
127 |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
128 /* create context */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
129 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
130 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_compose_ctx_t)); |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
131 if (ctx == NULL) { |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
132 return NGX_ERROR; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
133 } |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
134 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
135 if (ngx_array_init(&ctx->parts, r->pool, 1, sizeof(ngx_str_t)) |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
136 == NGX_ERROR) |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
137 { |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
138 return NGX_ERROR; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
139 } |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
140 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
141 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
142 /* |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
143 * Collect all X-Compose headers (or combined one?), store in context |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
144 * for our body filter to make actual subrequests. Hide them from the |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
145 * response. |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
146 */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
147 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
148 part = &r->headers_out.headers.part; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
149 header = part->elts; |
6
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
150 len = -1; |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
151 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
152 for (i = 0; /* void */; i++) { |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
153 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
154 if (i >= part->nelts) { |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
155 if (part->next == NULL) { |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
156 break; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
157 } |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
158 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
159 part = part->next; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
160 header = part->elts; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
161 i = 0; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
162 } |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
163 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
164 if (header[i].hash == 0) { |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
165 continue; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
166 } |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
167 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
168 if (header[i].key.len == sizeof("X-Compose-Length") - 1 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
169 && ngx_strncasecmp(header[i].key.data, "X-Compose-Length", |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
170 sizeof("X-Compose-Length") - 1) |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
171 == 0) |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
172 { |
5
fc206607251c
Fix compilation without debug.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
173 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
174 "compose body filter: bingo, %V, %V", |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
175 &header[i].key, &header[i].value); |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
176 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
177 header[i].hash = 0; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
178 |
6
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
179 len = ngx_atoof(header[i].value.data, header[i].value.len); |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
180 } |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
181 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
182 if (header[i].key.len == sizeof("X-Compose") - 1 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
183 && ngx_strncasecmp(header[i].key.data, "X-Compose", |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
184 sizeof("X-Compose") - 1) |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
185 == 0) |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
186 { |
5
fc206607251c
Fix compilation without debug.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4
diff
changeset
|
187 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
188 "compose body filter: bingo, %V, %V", |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
189 &header[i].key, &header[i].value); |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
190 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
191 header[i].hash = 0; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
192 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
193 /* |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
194 * XXX multiple headers with the same name must be combinable, |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
195 * see RFC 2616 4.2 Message Headers |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
196 */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
197 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
198 uri = ngx_array_push(&ctx->parts); |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
199 if (uri == NULL) { |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
200 return NGX_ERROR; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
201 } |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
202 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
203 *uri = header[i].value; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
204 } |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
205 } |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
206 |
6
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
207 if (ctx->parts.nelts == 0) { |
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
208 return ngx_http_next_header_filter(r); |
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
209 } |
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
210 |
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
211 r->headers_out.content_length_n = len; |
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
212 |
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
213 if (r->headers_out.content_length) { |
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
214 r->headers_out.content_length->hash = 0; |
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
215 r->headers_out.content_length = NULL; |
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
216 } |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
217 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
218 ngx_http_set_ctx(r, ctx, ngx_http_compose_filter_module); |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
219 |
6
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
220 if (len != -1) { |
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
221 r->allow_ranges = 1; |
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
222 r->late_ranges = 1; |
7
88272d0f29f9
Make sure upstream's status line won't be reused.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
223 r->headers_out.status_line.len = 0; |
6
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
224 |
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
225 } else { |
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
226 ngx_http_clear_accept_ranges(r); |
27628b3310ab
Better handle absence of controlling headers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5
diff
changeset
|
227 } |
4
37c6f2e0f278
Allow ranges and use new late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
228 |
0
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
229 return ngx_http_next_header_filter(r); |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
230 } |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
231 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
232 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
233 static ngx_int_t |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
234 ngx_http_compose_body_filter(ngx_http_request_t *r, ngx_chain_t *in) |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
235 { |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
236 ngx_str_t *uri, args; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
237 ngx_int_t rc; |
2
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
238 ngx_uint_t i, flags, last; |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
239 ngx_http_request_t *sr; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
240 ngx_http_compose_ctx_t *ctx; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
241 |
0
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
242 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
243 "compose body filter"); |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
244 |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
245 ctx = ngx_http_get_module_ctx(r, ngx_http_compose_filter_module); |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
246 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
247 if (ctx == NULL) { |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
248 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
249 "compose body filter: no ctx"); |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
250 return ngx_http_next_body_filter(r, in); |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
251 } |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
252 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
253 if (ctx->done) { |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
254 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
255 "compose body filter: done"); |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
256 return ngx_http_next_body_filter(r, in); |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
257 } |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
258 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
259 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
260 "compose body filter, doing work"); |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
261 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
262 /* |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
263 * Ignore body that comes to us, replace it with subrequests. |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
264 */ |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
265 |
2
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
266 last = 0; |
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
267 |
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
268 for ( ; in; in = in->next) { |
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
269 in->buf->pos = in->buf->last; |
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
270 if (in->buf->last_buf) { |
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
271 last = 1; |
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
272 in->buf->last_buf = 0; |
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
273 } |
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
274 } |
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
275 |
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
276 if (!last) { |
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
277 return NGX_OK; |
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
278 } |
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
279 |
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
280 ctx->done = 1; |
ed63d0bd4d14
Correctly handle complex body filtering.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
281 |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
282 uri = ctx->parts.elts; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
283 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
284 for (i = 0; i < ctx->parts.nelts; i++) { |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
285 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
286 args.len = 0; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
287 args.data = NULL; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
288 flags = 0; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
289 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
290 if (ngx_http_parse_unsafe_uri(r, &uri[i], &args, &flags) != NGX_OK) { |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
291 return NGX_ERROR; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
292 } |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
293 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
294 rc = ngx_http_subrequest(r, &uri[i], &args, &sr, NULL, flags); |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
295 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
296 if (rc == NGX_ERROR || rc == NGX_DONE) { |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
297 return rc; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
298 } |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
299 } |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
300 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
301 return ngx_http_send_special(r, NGX_HTTP_LAST); |
0
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
302 } |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
303 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
304 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
305 static void * |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
306 ngx_http_compose_create_conf(ngx_conf_t *cf) |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
307 { |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
308 ngx_http_compose_conf_t *conf; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
309 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
310 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_compose_conf_t)); |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
311 if (conf == NULL) { |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
312 return NGX_CONF_ERROR; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
313 } |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
314 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
315 conf->enable = NGX_CONF_UNSET; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
316 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
317 return conf; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
318 } |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
319 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
320 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
321 static char * |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
322 ngx_http_compose_merge_conf(ngx_conf_t *cf, void *parent, void *child) |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
323 { |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
324 ngx_http_compose_conf_t *prev = parent; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
325 ngx_http_compose_conf_t *conf = child; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
326 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
327 ngx_conf_merge_value(conf->enable, prev->enable, 0); |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
328 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
329 return NGX_CONF_OK; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
330 } |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
331 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
332 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
333 static ngx_int_t |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
334 ngx_http_compose_init(ngx_conf_t *cf) |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
335 { |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
336 ngx_http_next_header_filter = ngx_http_top_header_filter; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
337 ngx_http_top_header_filter = ngx_http_compose_header_filter; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
338 |
1
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
339 return NGX_OK; |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
340 } |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
341 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
342 |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
343 static ngx_int_t |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
344 ngx_http_compose_body_init(ngx_conf_t *cf) |
ba5471a3c988
First working code, still in progress.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
345 { |
0
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
346 ngx_http_next_body_filter = ngx_http_top_body_filter; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
347 ngx_http_top_body_filter = ngx_http_compose_body_filter; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
348 |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
349 return NGX_OK; |
6535d94ae07d
Compose filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
350 } |