Mercurial > hg > nginx
comparison src/core/ngx_inet.c @ 6564:19db5a6bc34e
Realip: port support in X-Real-IP and X-Forwarded-For.
Now, the module extracts optional port which may accompany an
IP address. This custom extension is introduced, among other
things, in order to facilitate logging of original client ports.
Addresses with ports are expected to be in the RFC 3986 format,
that is, with IPv6 addresses in square brackets. E.g.,
"X-Real-IP: [2001:0db8::1]:12345" sets client port ($remote_port)
to 12345.
author | Dmitry Volyntsev <xeioex@nginx.com> |
---|---|
date | Mon, 23 May 2016 18:44:23 +0300 |
parents | adf25b8d0431 |
children | 5d8f16859ced |
comparison
equal
deleted
inserted
replaced
6563:26feae43987f | 6564:19db5a6bc34e |
---|---|
524 return NGX_OK; | 524 return NGX_OK; |
525 } | 525 } |
526 | 526 |
527 | 527 |
528 ngx_int_t | 528 ngx_int_t |
529 ngx_parse_addr_port(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text, | |
530 size_t len) | |
531 { | |
532 u_char *p, *last; | |
533 size_t plen; | |
534 ngx_int_t rc, port; | |
535 struct sockaddr_in *sin; | |
536 #if (NGX_HAVE_INET6) | |
537 struct sockaddr_in6 *sin6; | |
538 #endif | |
539 | |
540 rc = ngx_parse_addr(pool, addr, text, len); | |
541 | |
542 if (rc != NGX_DECLINED) { | |
543 return rc; | |
544 } | |
545 | |
546 last = text + len; | |
547 | |
548 #if (NGX_HAVE_INET6) | |
549 if (len && text[0] == '[') { | |
550 | |
551 p = ngx_strlchr(text, last, ']'); | |
552 | |
553 if (p == NULL || p == last - 1 || *++p != ':') { | |
554 return NGX_DECLINED; | |
555 } | |
556 | |
557 text++; | |
558 len -= 2; | |
559 | |
560 } else | |
561 #endif | |
562 | |
563 { | |
564 p = ngx_strlchr(text, last, ':'); | |
565 | |
566 if (p == NULL) { | |
567 return NGX_DECLINED; | |
568 } | |
569 } | |
570 | |
571 p++; | |
572 plen = last - p; | |
573 | |
574 port = ngx_atoi(p, plen); | |
575 | |
576 if (port < 1 || port > 65535) { | |
577 return NGX_DECLINED; | |
578 } | |
579 | |
580 len -= plen + 1; | |
581 | |
582 rc = ngx_parse_addr(pool, addr, text, len); | |
583 | |
584 if (rc != NGX_OK) { | |
585 return rc; | |
586 } | |
587 | |
588 switch (addr->sockaddr->sa_family) { | |
589 | |
590 #if (NGX_HAVE_INET6) | |
591 case AF_INET6: | |
592 sin6 = (struct sockaddr_in6 *) addr->sockaddr; | |
593 sin6->sin6_port = htons(port); | |
594 break; | |
595 #endif | |
596 | |
597 default: /* AF_INET */ | |
598 sin = (struct sockaddr_in *) addr->sockaddr; | |
599 sin->sin_port = htons(port); | |
600 break; | |
601 } | |
602 | |
603 return NGX_OK; | |
604 } | |
605 | |
606 | |
607 ngx_int_t | |
529 ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u) | 608 ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u) |
530 { | 609 { |
531 u_char *p; | 610 u_char *p; |
532 size_t len; | 611 size_t len; |
533 | 612 |