Mercurial > hg > nginx
changeset 3273:fe71be4a02f1
support IPv6 addresses in Real IP headers
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 02 Nov 2009 16:24:27 +0000 |
parents | 98f49b2bcae8 |
children | 95b0b0d7843f |
files | src/http/modules/ngx_http_realip_module.c |
diffstat | 1 files changed, 20 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/src/http/modules/ngx_http_realip_module.c Mon Nov 02 16:11:06 2009 +0000 +++ b/src/http/modules/ngx_http_realip_module.c Mon Nov 02 16:24:27 2009 +0000 @@ -29,9 +29,10 @@ typedef struct { - ngx_connection_t *connection; - in_addr_t addr; - ngx_str_t addr_text; + ngx_connection_t *connection; + struct sockaddr *sockaddr; + socklen_t socklen; + ngx_str_t addr_text; } ngx_http_realip_ctx_t; @@ -103,8 +104,9 @@ { u_char *ip, *p; size_t len; - in_addr_t addr; + ngx_int_t rc; ngx_uint_t i, hash; + ngx_addr_t addr; ngx_list_part_t *part; ngx_table_elt_t *header; struct sockaddr_in *sin; @@ -226,10 +228,15 @@ ngx_http_set_ctx(r, ctx, ngx_http_realip_module); - addr = ngx_inet_addr(ip, len); + rc = ngx_parse_addr(c->pool, &addr, ip, len); - if (addr == INADDR_NONE) { + switch (rc) { + case NGX_DECLINED: return NGX_DECLINED; + case NGX_ERROR: + return NGX_HTTP_INTERNAL_SERVER_ERROR; + default: /* NGX_OK */ + break; } p = ngx_pnalloc(c->pool, len); @@ -242,11 +249,12 @@ cln->handler = ngx_http_realip_cleanup; ctx->connection = c; - ctx->addr = sin->sin_addr.s_addr; + ctx->sockaddr = c->sockaddr; + ctx->socklen = c->socklen; ctx->addr_text = c->addr_text; - sin->sin_addr.s_addr = addr; - + c->sockaddr = addr.sockaddr; + c->socklen = addr.socklen; c->addr_text.len = len; c->addr_text.data = p; @@ -263,14 +271,12 @@ { ngx_http_realip_ctx_t *ctx = data; - ngx_connection_t *c; - struct sockaddr_in *sin; + ngx_connection_t *c; c = ctx->connection; - sin = (struct sockaddr_in *) c->sockaddr; - sin->sin_addr.s_addr = ctx->addr; - + c->sockaddr = ctx->sockaddr; + c->socklen = ctx->socklen; c->addr_text = ctx->addr_text; }