aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Volyntsev <xeioex@nginx.com>2016-05-23 18:44:22 +0300
committerDmitry Volyntsev <xeioex@nginx.com>2016-05-23 18:44:22 +0300
commit19140c8c4f7f16747df4a7e3bf4299a6a8d75a81 (patch)
tree44aaec7ea173a583a49d176ddb31863d39edcefb
parent97495b662f378bad2a9df05d4c4b4e0977b1d309 (diff)
downloadnginx-19140c8c4f7f16747df4a7e3bf4299a6a8d75a81.tar.gz
nginx-19140c8c4f7f16747df4a7e3bf4299a6a8d75a81.zip
Realip: take client port from PROXY protocol header.
Previously, when the client address was changed to the one from the PROXY protocol header, the client port ($remote_port) was reset to zero. Now the client port is also changed to the one from the PROXY protocol header.
-rw-r--r--src/http/modules/ngx_http_realip_module.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/http/modules/ngx_http_realip_module.c b/src/http/modules/ngx_http_realip_module.c
index 5a6e4ad1d..cfaa4c978 100644
--- a/src/http/modules/ngx_http_realip_module.c
+++ b/src/http/modules/ngx_http_realip_module.c
@@ -138,6 +138,10 @@ ngx_http_realip_handler(ngx_http_request_t *r)
ngx_list_part_t *part;
ngx_table_elt_t *header;
ngx_connection_t *c;
+ struct sockaddr_in *sin;
+#if (NGX_HAVE_INET6)
+ struct sockaddr_in6 *sin6;
+#endif
ngx_http_realip_ctx_t *ctx;
ngx_http_realip_loc_conf_t *rlcf;
@@ -237,6 +241,24 @@ found:
rlcf->recursive)
!= NGX_DECLINED)
{
+ if (rlcf->type == NGX_HTTP_REALIP_PROXY) {
+
+ switch (addr.sockaddr->sa_family) {
+
+#if (NGX_HAVE_INET6)
+ case AF_INET6:
+ sin6 = (struct sockaddr_in6 *) addr.sockaddr;
+ sin6->sin6_port = htons(c->proxy_protocol_port);
+ break;
+#endif
+
+ default: /* AF_INET */
+ sin = (struct sockaddr_in *) addr.sockaddr;
+ sin->sin_port = htons(c->proxy_protocol_port);
+ break;
+ }
+ }
+
return ngx_http_realip_set_addr(r, &addr);
}