comparison src/http/ngx_http_variables.c @ 448:76a79816b771 NGINX_0_7_36

nginx 0.7.36 *) Feature: a preliminary IPv6 support; the "listen" directive of the HTTP module supports IPv6. *) Bugfix: the $ancient_browser variable did not work for browsers preset by a "modern_browser" directives.
author Igor Sysoev <http://sysoev.ru>
date Sat, 21 Feb 2009 00:00:00 +0300
parents 670af56a1158
children a8424ffa495c
comparison
equal deleted inserted replaced
447:40964c811e59 448:76a79816b771
826 826
827 static ngx_int_t 827 static ngx_int_t
828 ngx_http_variable_binary_remote_addr(ngx_http_request_t *r, 828 ngx_http_variable_binary_remote_addr(ngx_http_request_t *r,
829 ngx_http_variable_value_t *v, uintptr_t data) 829 ngx_http_variable_value_t *v, uintptr_t data)
830 { 830 {
831 struct sockaddr_in *sin; 831 struct sockaddr_in *sin;
832 832 #if (NGX_HAVE_INET6)
833 /* AF_INET only */ 833 struct sockaddr_in6 *sin6;
834 834 #endif
835 sin = (struct sockaddr_in *) r->connection->sockaddr; 835
836 836 switch (r->connection->sockaddr->sa_family) {
837 v->len = sizeof(in_addr_t); 837
838 v->valid = 1; 838 #if (NGX_HAVE_INET6)
839 v->no_cacheable = 0; 839 case AF_INET6:
840 v->not_found = 0; 840 sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;
841 v->data = (u_char *) &sin->sin_addr.s_addr; 841
842 v->len = sizeof(struct in6_addr);
843 v->valid = 1;
844 v->no_cacheable = 0;
845 v->not_found = 0;
846 v->data = (u_char *) &sin6->sin6_addr;
847
848 break;
849 #endif
850
851 default: /* AF_INET */
852 sin = (struct sockaddr_in *) r->connection->sockaddr;
853
854 v->len = sizeof(in_addr_t);
855 v->valid = 1;
856 v->no_cacheable = 0;
857 v->not_found = 0;
858 v->data = (u_char *) &sin->sin_addr;
859
860 break;
861 }
842 862
843 return NGX_OK; 863 return NGX_OK;
844 } 864 }
845 865
846 866
860 880
861 static ngx_int_t 881 static ngx_int_t
862 ngx_http_variable_remote_port(ngx_http_request_t *r, 882 ngx_http_variable_remote_port(ngx_http_request_t *r,
863 ngx_http_variable_value_t *v, uintptr_t data) 883 ngx_http_variable_value_t *v, uintptr_t data)
864 { 884 {
865 ngx_uint_t port; 885 ngx_uint_t port;
866 struct sockaddr_in *sin; 886 struct sockaddr_in *sin;
887 #if (NGX_HAVE_INET6)
888 struct sockaddr_in6 *sin6;
889 #endif
867 890
868 v->len = 0; 891 v->len = 0;
869 v->valid = 1; 892 v->valid = 1;
870 v->no_cacheable = 0; 893 v->no_cacheable = 0;
871 v->not_found = 0; 894 v->not_found = 0;
873 v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1); 896 v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1);
874 if (v->data == NULL) { 897 if (v->data == NULL) {
875 return NGX_ERROR; 898 return NGX_ERROR;
876 } 899 }
877 900
878 /* AF_INET only */ 901 switch (r->connection->sockaddr->sa_family) {
879 902
880 if (r->connection->sockaddr->sa_family == AF_INET) { 903 #if (NGX_HAVE_INET6)
904 case AF_INET6:
905 sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;
906 port = ntohs(sin6->sin6_port);
907 break;
908 #endif
909
910 default: /* AF_INET */
881 sin = (struct sockaddr_in *) r->connection->sockaddr; 911 sin = (struct sockaddr_in *) r->connection->sockaddr;
882
883 port = ntohs(sin->sin_port); 912 port = ntohs(sin->sin_port);
884 913 break;
885 if (port > 0 && port < 65536) { 914 }
886 v->len = ngx_sprintf(v->data, "%ui", port) - v->data; 915
887 } 916 if (port > 0 && port < 65536) {
917 v->len = ngx_sprintf(v->data, "%ui", port) - v->data;
888 } 918 }
889 919
890 return NGX_OK; 920 return NGX_OK;
891 } 921 }
892 922
894 static ngx_int_t 924 static ngx_int_t
895 ngx_http_variable_server_addr(ngx_http_request_t *r, 925 ngx_http_variable_server_addr(ngx_http_request_t *r,
896 ngx_http_variable_value_t *v, uintptr_t data) 926 ngx_http_variable_value_t *v, uintptr_t data)
897 { 927 {
898 ngx_str_t s; 928 ngx_str_t s;
899 929 u_char addr[NGX_SOCKADDR_STRLEN];
900 s.data = ngx_pnalloc(r->pool, NGX_INET_ADDRSTRLEN); 930
931 s.len = NGX_SOCKADDR_STRLEN;
932 s.data = addr;
933
934 if (ngx_http_server_addr(r, &s) != NGX_OK) {
935 return NGX_ERROR;
936 }
937
938 s.data = ngx_pnalloc(r->pool, s.len);
901 if (s.data == NULL) { 939 if (s.data == NULL) {
902 return NGX_ERROR; 940 return NGX_ERROR;
903 } 941 }
904 942
905 if (ngx_http_server_addr(r, &s) != NGX_OK) { 943 ngx_memcpy(s.data, addr, s.len);
906 return NGX_ERROR;
907 }
908 944
909 v->len = s.len; 945 v->len = s.len;
910 v->valid = 1; 946 v->valid = 1;
911 v->no_cacheable = 0; 947 v->no_cacheable = 0;
912 v->not_found = 0; 948 v->not_found = 0;