annotate src/http/modules/ngx_http_mirror_module.c @ 7736:a46fcf101cfc

Core: added format specifiers to output binary data as hex. Now "s", "V", and "v" format specifiers may be prefixed with "x" (lowercase) or "X" (uppercase) to output corresponding data in hexadecimal format. In collaboration with Maxim Dounin.
author Vladimir Homutov <vl@nginx.com>
date Wed, 28 Oct 2020 10:56:11 +0300
parents 230d16d35ebc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7072
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
2 /*
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
3 * Copyright (C) Roman Arutyunyan
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
5 */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
6
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
7
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
10 #include <ngx_http.h>
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
11
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
12
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
13 typedef struct {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
14 ngx_array_t *mirror;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
15 ngx_flag_t request_body;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
16 } ngx_http_mirror_loc_conf_t;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
17
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
18
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
19 typedef struct {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
20 ngx_int_t status;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
21 } ngx_http_mirror_ctx_t;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
22
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
23
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
24 static ngx_int_t ngx_http_mirror_handler(ngx_http_request_t *r);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
25 static void ngx_http_mirror_body_handler(ngx_http_request_t *r);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
26 static ngx_int_t ngx_http_mirror_handler_internal(ngx_http_request_t *r);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
27 static void *ngx_http_mirror_create_loc_conf(ngx_conf_t *cf);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
28 static char *ngx_http_mirror_merge_loc_conf(ngx_conf_t *cf, void *parent,
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
29 void *child);
7073
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
30 static char *ngx_http_mirror(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
7072
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
31 static ngx_int_t ngx_http_mirror_init(ngx_conf_t *cf);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
32
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
33
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
34 static ngx_command_t ngx_http_mirror_commands[] = {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
35
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
36 { ngx_string("mirror"),
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
37 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
7073
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
38 ngx_http_mirror,
7072
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
39 NGX_HTTP_LOC_CONF_OFFSET,
7073
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
40 0,
7072
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
41 NULL },
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
42
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
43 { ngx_string("mirror_request_body"),
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
44 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
45 ngx_conf_set_flag_slot,
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
46 NGX_HTTP_LOC_CONF_OFFSET,
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
47 offsetof(ngx_http_mirror_loc_conf_t, request_body),
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
48 NULL },
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
49
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
50 ngx_null_command
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
51 };
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
52
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
53
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
54 static ngx_http_module_t ngx_http_mirror_module_ctx = {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
55 NULL, /* preconfiguration */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
56 ngx_http_mirror_init, /* postconfiguration */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
57
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
58 NULL, /* create main configuration */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
59 NULL, /* init main configuration */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
60
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
61 NULL, /* create server configuration */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
62 NULL, /* merge server configuration */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
63
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
64 ngx_http_mirror_create_loc_conf, /* create location configuration */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
65 ngx_http_mirror_merge_loc_conf /* merge location configuration */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
66 };
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
67
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
68
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
69 ngx_module_t ngx_http_mirror_module = {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
70 NGX_MODULE_V1,
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
71 &ngx_http_mirror_module_ctx, /* module context */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
72 ngx_http_mirror_commands, /* module directives */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
73 NGX_HTTP_MODULE, /* module type */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
74 NULL, /* init master */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
75 NULL, /* init module */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
76 NULL, /* init process */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
77 NULL, /* init thread */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
78 NULL, /* exit thread */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
79 NULL, /* exit process */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
80 NULL, /* exit master */
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
81 NGX_MODULE_V1_PADDING
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
82 };
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
83
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
84
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
85 static ngx_int_t
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
86 ngx_http_mirror_handler(ngx_http_request_t *r)
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
87 {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
88 ngx_int_t rc;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
89 ngx_http_mirror_ctx_t *ctx;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
90 ngx_http_mirror_loc_conf_t *mlcf;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
91
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
92 if (r != r->main) {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
93 return NGX_DECLINED;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
94 }
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
95
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
96 mlcf = ngx_http_get_module_loc_conf(r, ngx_http_mirror_module);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
97
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
98 if (mlcf->mirror == NULL) {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
99 return NGX_DECLINED;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
100 }
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
101
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
102 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "mirror handler");
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
103
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
104 if (mlcf->request_body) {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
105 ctx = ngx_http_get_module_ctx(r, ngx_http_mirror_module);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
106
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
107 if (ctx) {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
108 return ctx->status;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
109 }
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
110
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
111 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_mirror_ctx_t));
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
112 if (ctx == NULL) {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
113 return NGX_ERROR;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
114 }
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
115
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
116 ctx->status = NGX_DONE;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
117
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
118 ngx_http_set_ctx(r, ctx, ngx_http_mirror_module);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
119
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
120 rc = ngx_http_read_client_request_body(r, ngx_http_mirror_body_handler);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
121 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
122 return rc;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
123 }
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
124
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
125 ngx_http_finalize_request(r, NGX_DONE);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
126 return NGX_DONE;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
127 }
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
128
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
129 return ngx_http_mirror_handler_internal(r);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
130 }
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
131
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
132
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
133 static void
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
134 ngx_http_mirror_body_handler(ngx_http_request_t *r)
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
135 {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
136 ngx_http_mirror_ctx_t *ctx;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
137
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
138 ctx = ngx_http_get_module_ctx(r, ngx_http_mirror_module);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
139
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
140 ctx->status = ngx_http_mirror_handler_internal(r);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
141
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
142 r->preserve_body = 1;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
143
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
144 r->write_event_handler = ngx_http_core_run_phases;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
145 ngx_http_core_run_phases(r);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
146 }
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
147
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
148
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
149 static ngx_int_t
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
150 ngx_http_mirror_handler_internal(ngx_http_request_t *r)
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
151 {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
152 ngx_str_t *name;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
153 ngx_uint_t i;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
154 ngx_http_request_t *sr;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
155 ngx_http_mirror_loc_conf_t *mlcf;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
156
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
157 mlcf = ngx_http_get_module_loc_conf(r, ngx_http_mirror_module);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
158
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
159 name = mlcf->mirror->elts;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
160
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
161 for (i = 0; i < mlcf->mirror->nelts; i++) {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
162 if (ngx_http_subrequest(r, &name[i], &r->args, &sr, NULL,
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
163 NGX_HTTP_SUBREQUEST_BACKGROUND)
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
164 != NGX_OK)
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
165 {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
166 return NGX_HTTP_INTERNAL_SERVER_ERROR;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
167 }
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
168
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
169 sr->header_only = 1;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
170 sr->method = r->method;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
171 sr->method_name = r->method_name;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
172 }
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
173
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
174 return NGX_DECLINED;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
175 }
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
176
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
177
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
178 static void *
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
179 ngx_http_mirror_create_loc_conf(ngx_conf_t *cf)
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
180 {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
181 ngx_http_mirror_loc_conf_t *mlcf;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
182
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
183 mlcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_mirror_loc_conf_t));
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
184 if (mlcf == NULL) {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
185 return NULL;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
186 }
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
187
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
188 mlcf->mirror = NGX_CONF_UNSET_PTR;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
189 mlcf->request_body = NGX_CONF_UNSET;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
190
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
191 return mlcf;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
192 }
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
193
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
194
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
195 static char *
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
196 ngx_http_mirror_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
197 {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
198 ngx_http_mirror_loc_conf_t *prev = parent;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
199 ngx_http_mirror_loc_conf_t *conf = child;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
200
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
201 ngx_conf_merge_ptr_value(conf->mirror, prev->mirror, NULL);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
202 ngx_conf_merge_value(conf->request_body, prev->request_body, 1);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
203
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
204 return NGX_CONF_OK;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
205 }
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
206
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
207
7073
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
208 static char *
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
209 ngx_http_mirror(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
210 {
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
211 ngx_http_mirror_loc_conf_t *mlcf = conf;
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
212
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
213 ngx_str_t *value, *s;
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
214
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
215 value = cf->args->elts;
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
216
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
217 if (ngx_strcmp(value[1].data, "off") == 0) {
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
218 if (mlcf->mirror != NGX_CONF_UNSET_PTR) {
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
219 return "is duplicate";
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
220 }
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
221
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
222 mlcf->mirror = NULL;
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
223 return NGX_CONF_OK;
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
224 }
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
225
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
226 if (mlcf->mirror == NULL) {
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
227 return "is duplicate";
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
228 }
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
229
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
230 if (mlcf->mirror == NGX_CONF_UNSET_PTR) {
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
231 mlcf->mirror = ngx_array_create(cf->pool, 4, sizeof(ngx_str_t));
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
232 if (mlcf->mirror == NULL) {
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
233 return NGX_CONF_ERROR;
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
234 }
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
235 }
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
236
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
237 s = ngx_array_push(mlcf->mirror);
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
238 if (s == NULL) {
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
239 return NGX_CONF_ERROR;
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
240 }
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
241
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
242 *s = value[1];
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
243
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
244 return NGX_CONF_OK;
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
245 }
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
246
230d16d35ebc Mirror: "off" paramater of the "mirror" directive.
Roman Arutyunyan <arut@nginx.com>
parents: 7072
diff changeset
247
7072
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
248 static ngx_int_t
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
249 ngx_http_mirror_init(ngx_conf_t *cf)
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
250 {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
251 ngx_http_handler_pt *h;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
252 ngx_http_core_main_conf_t *cmcf;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
253
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
254 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
255
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
256 h = ngx_array_push(&cmcf->phases[NGX_HTTP_PRECONTENT_PHASE].handlers);
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
257 if (h == NULL) {
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
258 return NGX_ERROR;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
259 }
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
260
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
261 *h = ngx_http_mirror_handler;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
262
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
263 return NGX_OK;
0bb747b2d7cb Mirror module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
264 }