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