comparison src/http/ngx_http_variables.c @ 7591:89adf49fe76a

Parsing server PROXY protocol address and port (ticket #1206). New variables $proxy_protocol_server_addr and $proxy_protocol_server_port are added both to HTTP and Stream.
author Roman Arutyunyan <arut@nginx.com>
date Mon, 21 Oct 2019 20:22:30 +0300
parents 06b01840bd42
children 028b16e2798f
comparison
equal deleted inserted replaced
7590:06b01840bd42 7591:89adf49fe76a
197 { ngx_string("remote_addr"), NULL, ngx_http_variable_remote_addr, 0, 0, 0 }, 197 { ngx_string("remote_addr"), NULL, ngx_http_variable_remote_addr, 0, 0, 0 },
198 198
199 { ngx_string("remote_port"), NULL, ngx_http_variable_remote_port, 0, 0, 0 }, 199 { ngx_string("remote_port"), NULL, ngx_http_variable_remote_port, 0, 0, 0 },
200 200
201 { ngx_string("proxy_protocol_addr"), NULL, 201 { ngx_string("proxy_protocol_addr"), NULL,
202 ngx_http_variable_proxy_protocol_addr, 0, 0, 0 }, 202 ngx_http_variable_proxy_protocol_addr,
203 offsetof(ngx_proxy_protocol_t, src_addr), 0, 0 },
203 204
204 { ngx_string("proxy_protocol_port"), NULL, 205 { ngx_string("proxy_protocol_port"), NULL,
205 ngx_http_variable_proxy_protocol_port, 0, 0, 0 }, 206 ngx_http_variable_proxy_protocol_port,
207 offsetof(ngx_proxy_protocol_t, src_port), 0, 0 },
208
209 { ngx_string("proxy_protocol_server_addr"), NULL,
210 ngx_http_variable_proxy_protocol_addr,
211 offsetof(ngx_proxy_protocol_t, dst_addr), 0, 0 },
212
213 { ngx_string("proxy_protocol_server_port"), NULL,
214 ngx_http_variable_proxy_protocol_port,
215 offsetof(ngx_proxy_protocol_t, dst_port), 0, 0 },
206 216
207 { ngx_string("server_addr"), NULL, ngx_http_variable_server_addr, 0, 0, 0 }, 217 { ngx_string("server_addr"), NULL, ngx_http_variable_server_addr, 0, 0, 0 },
208 218
209 { ngx_string("server_port"), NULL, ngx_http_variable_server_port, 0, 0, 0 }, 219 { ngx_string("server_port"), NULL, ngx_http_variable_server_port, 0, 0, 0 },
210 220
1291 1301
1292 static ngx_int_t 1302 static ngx_int_t
1293 ngx_http_variable_proxy_protocol_addr(ngx_http_request_t *r, 1303 ngx_http_variable_proxy_protocol_addr(ngx_http_request_t *r,
1294 ngx_http_variable_value_t *v, uintptr_t data) 1304 ngx_http_variable_value_t *v, uintptr_t data)
1295 { 1305 {
1306 ngx_str_t *addr;
1296 ngx_proxy_protocol_t *pp; 1307 ngx_proxy_protocol_t *pp;
1297 1308
1298 pp = r->connection->proxy_protocol; 1309 pp = r->connection->proxy_protocol;
1299 if (pp == NULL) { 1310 if (pp == NULL) {
1300 v->not_found = 1; 1311 v->not_found = 1;
1301 return NGX_OK; 1312 return NGX_OK;
1302 } 1313 }
1303 1314
1304 v->len = pp->src_addr.len; 1315 addr = (ngx_str_t *) ((char *) pp + data);
1305 v->valid = 1; 1316
1306 v->no_cacheable = 0; 1317 v->len = addr->len;
1307 v->not_found = 0; 1318 v->valid = 1;
1308 v->data = pp->src_addr.data; 1319 v->no_cacheable = 0;
1320 v->not_found = 0;
1321 v->data = addr->data;
1309 1322
1310 return NGX_OK; 1323 return NGX_OK;
1311 } 1324 }
1312 1325
1313 1326
1332 v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1); 1345 v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1);
1333 if (v->data == NULL) { 1346 if (v->data == NULL) {
1334 return NGX_ERROR; 1347 return NGX_ERROR;
1335 } 1348 }
1336 1349
1337 port = pp->src_port; 1350 port = *(in_port_t *) ((char *) pp + data);
1338 1351
1339 if (port > 0 && port < 65536) { 1352 if (port > 0 && port < 65536) {
1340 v->len = ngx_sprintf(v->data, "%ui", port) - v->data; 1353 v->len = ngx_sprintf(v->data, "%ui", port) - v->data;
1341 } 1354 }
1342 1355