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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }