comparison src/stream/ngx_stream_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 cca4c8a715de
comparison
equal deleted inserted replaced
7590:06b01840bd42 7591:89adf49fe76a
62 62
63 { ngx_string("remote_port"), NULL, 63 { ngx_string("remote_port"), NULL,
64 ngx_stream_variable_remote_port, 0, 0, 0 }, 64 ngx_stream_variable_remote_port, 0, 0, 0 },
65 65
66 { ngx_string("proxy_protocol_addr"), NULL, 66 { ngx_string("proxy_protocol_addr"), NULL,
67 ngx_stream_variable_proxy_protocol_addr, 0, 0, 0 }, 67 ngx_stream_variable_proxy_protocol_addr,
68 offsetof(ngx_proxy_protocol_t, src_addr), 0, 0 },
68 69
69 { ngx_string("proxy_protocol_port"), NULL, 70 { ngx_string("proxy_protocol_port"), NULL,
70 ngx_stream_variable_proxy_protocol_port, 0, 0, 0 }, 71 ngx_stream_variable_proxy_protocol_port,
72 offsetof(ngx_proxy_protocol_t, src_port), 0, 0 },
73
74 { ngx_string("proxy_protocol_server_addr"), NULL,
75 ngx_stream_variable_proxy_protocol_addr,
76 offsetof(ngx_proxy_protocol_t, dst_addr), 0, 0 },
77
78 { ngx_string("proxy_protocol_server_port"), NULL,
79 ngx_stream_variable_proxy_protocol_port,
80 offsetof(ngx_proxy_protocol_t, dst_port), 0, 0 },
71 81
72 { ngx_string("server_addr"), NULL, 82 { ngx_string("server_addr"), NULL,
73 ngx_stream_variable_server_addr, 0, 0, 0 }, 83 ngx_stream_variable_server_addr, 0, 0, 0 },
74 84
75 { ngx_string("server_port"), NULL, 85 { ngx_string("server_port"), NULL,
555 565
556 static ngx_int_t 566 static ngx_int_t
557 ngx_stream_variable_proxy_protocol_addr(ngx_stream_session_t *s, 567 ngx_stream_variable_proxy_protocol_addr(ngx_stream_session_t *s,
558 ngx_stream_variable_value_t *v, uintptr_t data) 568 ngx_stream_variable_value_t *v, uintptr_t data)
559 { 569 {
570 ngx_str_t *addr;
560 ngx_proxy_protocol_t *pp; 571 ngx_proxy_protocol_t *pp;
561 572
562 pp = s->connection->proxy_protocol; 573 pp = s->connection->proxy_protocol;
563 if (pp == NULL) { 574 if (pp == NULL) {
564 v->not_found = 1; 575 v->not_found = 1;
565 return NGX_OK; 576 return NGX_OK;
566 } 577 }
567 578
568 v->len = pp->src_addr.len; 579 addr = (ngx_str_t *) ((char *) pp + data);
569 v->valid = 1; 580
570 v->no_cacheable = 0; 581 v->len = addr->len;
571 v->not_found = 0; 582 v->valid = 1;
572 v->data = pp->src_addr.data; 583 v->no_cacheable = 0;
584 v->not_found = 0;
585 v->data = addr->data;
573 586
574 return NGX_OK; 587 return NGX_OK;
575 } 588 }
576 589
577 590
596 v->data = ngx_pnalloc(s->connection->pool, sizeof("65535") - 1); 609 v->data = ngx_pnalloc(s->connection->pool, sizeof("65535") - 1);
597 if (v->data == NULL) { 610 if (v->data == NULL) {
598 return NGX_ERROR; 611 return NGX_ERROR;
599 } 612 }
600 613
601 port = pp->src_port; 614 port = *(in_port_t *) ((char *) pp + data);
602 615
603 if (port > 0 && port < 65536) { 616 if (port > 0 && port < 65536) {
604 v->len = ngx_sprintf(v->data, "%ui", port) - v->data; 617 v->len = ngx_sprintf(v->data, "%ui", port) - v->data;
605 } 618 }
606 619