Mercurial > hg > nginx-quic
diff src/core/ngx_proxy_protocol.c @ 7590:06b01840bd42
Core: moved PROXY protocol fields out of ngx_connection_t.
Now a new structure ngx_proxy_protocol_t holds these fields. This allows
to add more PROXY protocol fields in the future without modifying the
connection structure.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Mon, 21 Oct 2019 18:06:19 +0300 |
parents | 1fd992589ffe |
children | 89adf49fe76a |
line wrap: on
line diff
--- a/src/core/ngx_proxy_protocol.c +++ b/src/core/ngx_proxy_protocol.c @@ -47,9 +47,10 @@ static u_char *ngx_proxy_protocol_v2_rea u_char * ngx_proxy_protocol_read(ngx_connection_t *c, u_char *buf, u_char *last) { - size_t len; - u_char ch, *p, *addr, *port; - ngx_int_t n; + size_t len; + u_char ch, *p, *addr, *port; + ngx_int_t n; + ngx_proxy_protocol_t *pp; static const u_char signature[] = "\r\n\r\n\0\r\nQUIT\n"; @@ -105,15 +106,20 @@ ngx_proxy_protocol_read(ngx_connection_t } } - len = p - addr - 1; - c->proxy_protocol_addr.data = ngx_pnalloc(c->pool, len); - - if (c->proxy_protocol_addr.data == NULL) { + pp = ngx_pcalloc(c->pool, sizeof(ngx_proxy_protocol_t)); + if (pp == NULL) { return NULL; } - ngx_memcpy(c->proxy_protocol_addr.data, addr, len); - c->proxy_protocol_addr.len = len; + len = p - addr - 1; + + pp->src_addr.data = ngx_pnalloc(c->pool, len); + if (pp->src_addr.data == NULL) { + return NULL; + } + + ngx_memcpy(pp->src_addr.data, addr, len); + pp->src_addr.len = len; for ( ;; ) { if (p == last) { @@ -145,11 +151,13 @@ ngx_proxy_protocol_read(ngx_connection_t goto invalid; } - c->proxy_protocol_port = (in_port_t) n; + pp->src_port = (in_port_t) n; ngx_log_debug2(NGX_LOG_DEBUG_CORE, c->log, 0, - "PROXY protocol address: %V %d", &c->proxy_protocol_addr, - c->proxy_protocol_port); + "PROXY protocol address: %V %d", &pp->src_addr, + pp->src_port); + + c->proxy_protocol = pp; skip: @@ -220,6 +228,7 @@ ngx_proxy_protocol_v2_read(ngx_connectio socklen_t socklen; ngx_uint_t version, command, family, transport; ngx_sockaddr_t sockaddr; + ngx_proxy_protocol_t *pp; ngx_proxy_protocol_header_t *header; ngx_proxy_protocol_inet_addrs_t *in; #if (NGX_HAVE_INET6) @@ -266,6 +275,11 @@ ngx_proxy_protocol_v2_read(ngx_connectio return end; } + pp = ngx_pcalloc(c->pool, sizeof(ngx_proxy_protocol_t)); + if (pp == NULL) { + return NULL; + } + family = header->family_transport >> 4; switch (family) { @@ -282,7 +296,7 @@ ngx_proxy_protocol_v2_read(ngx_connectio sockaddr.sockaddr_in.sin_port = 0; memcpy(&sockaddr.sockaddr_in.sin_addr, in->src_addr, 4); - c->proxy_protocol_port = ngx_proxy_protocol_parse_uint16(in->src_port); + pp->src_port = ngx_proxy_protocol_parse_uint16(in->src_port); socklen = sizeof(struct sockaddr_in); @@ -304,7 +318,7 @@ ngx_proxy_protocol_v2_read(ngx_connectio sockaddr.sockaddr_in6.sin6_port = 0; memcpy(&sockaddr.sockaddr_in6.sin6_addr, in6->src_addr, 16); - c->proxy_protocol_port = ngx_proxy_protocol_parse_uint16(in6->src_port); + pp->src_port = ngx_proxy_protocol_parse_uint16(in6->src_port); socklen = sizeof(struct sockaddr_in6); @@ -321,23 +335,24 @@ ngx_proxy_protocol_v2_read(ngx_connectio return end; } - c->proxy_protocol_addr.data = ngx_pnalloc(c->pool, NGX_SOCKADDR_STRLEN); - if (c->proxy_protocol_addr.data == NULL) { + pp->src_addr.data = ngx_pnalloc(c->pool, NGX_SOCKADDR_STRLEN); + if (pp->src_addr.data == NULL) { return NULL; } - c->proxy_protocol_addr.len = ngx_sock_ntop(&sockaddr.sockaddr, socklen, - c->proxy_protocol_addr.data, - NGX_SOCKADDR_STRLEN, 0); + pp->src_addr.len = ngx_sock_ntop(&sockaddr.sockaddr, socklen, + pp->src_addr.data, NGX_SOCKADDR_STRLEN, 0); ngx_log_debug2(NGX_LOG_DEBUG_CORE, c->log, 0, - "PROXY protocol v2 address: %V %d", &c->proxy_protocol_addr, - c->proxy_protocol_port); + "PROXY protocol v2 address: %V %d", &pp->src_addr, + pp->src_port); if (buf < end) { ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0, "PROXY protocol v2 %z bytes of tlv ignored", end - buf); } + c->proxy_protocol = pp; + return end; }