Mercurial > hg > nginx
annotate src/core/ngx_inet.c @ 2200:fd15c193572d
split ngx_parse_url()
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 22 Aug 2008 13:36:56 +0000 |
parents | 5975975eedc0 |
children | 2300ab9b069e |
rev | line source |
---|---|
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
425
diff
changeset
|
1 |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
425
diff
changeset
|
2 /* |
444
42d11f017717
nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents:
441
diff
changeset
|
3 * Copyright (C) Igor Sysoev |
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
425
diff
changeset
|
4 */ |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
425
diff
changeset
|
5 |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
425
diff
changeset
|
6 |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
7 #include <ngx_config.h> |
100
7ebc8b7fb816
nginx-0.0.1-2003-06-03-19:42:58 import
Igor Sysoev <igor@sysoev.ru>
parents:
57
diff
changeset
|
8 #include <ngx_core.h> |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
9 |
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
10 |
2200 | 11 static ngx_int_t ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u); |
12 static ngx_int_t ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u); | |
13 | |
14 | |
1647 | 15 /* AF_INET only */ |
16 | |
17 in_addr_t | |
18 ngx_inet_addr(u_char *text, size_t len) | |
19 { | |
20 u_char *p, c; | |
21 in_addr_t addr; | |
22 ngx_uint_t octet, n; | |
23 | |
24 addr = 0; | |
25 octet = 0; | |
26 n = 0; | |
27 | |
28 for (p = text; p < text + len; p++) { | |
29 | |
30 c = *p; | |
31 | |
32 if (c >= '0' && c <= '9') { | |
33 octet = octet * 10 + (c - '0'); | |
34 continue; | |
35 } | |
36 | |
37 if (c == '.' && octet < 256) { | |
38 addr = (addr << 8) + octet; | |
39 octet = 0; | |
40 n++; | |
41 continue; | |
42 } | |
43 | |
44 return INADDR_NONE; | |
45 } | |
46 | |
47 if (n != 3) { | |
48 return INADDR_NONE; | |
49 } | |
50 | |
51 if (octet < 256) { | |
52 addr = (addr << 8) + octet; | |
53 return htonl(addr); | |
54 } | |
55 | |
56 return INADDR_NONE; | |
57 } | |
58 | |
59 | |
57
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
60 /* AF_INET only */ |
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
61 |
509 | 62 size_t |
2198
5975975eedc0
ngx_sock_ntop() takes family from sockaddr, remove duplicate field
Igor Sysoev <igor@sysoev.ru>
parents:
2197
diff
changeset
|
63 ngx_sock_ntop(struct sockaddr *sa, u_char *text, size_t len) |
57
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
64 { |
290
87e73f067470
nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
100
diff
changeset
|
65 u_char *p; |
479 | 66 struct sockaddr_in *sin; |
57
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
67 |
2198
5975975eedc0
ngx_sock_ntop() takes family from sockaddr, remove duplicate field
Igor Sysoev <igor@sysoev.ru>
parents:
2197
diff
changeset
|
68 if (sa->sa_family == AF_INET) { |
291
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
69 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
70 sin = (struct sockaddr_in *) sa; |
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
71 p = (u_char *) &sin->sin_addr; |
57
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
72 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
73 return ngx_snprintf(text, len, "%ud.%ud.%ud.%ud", |
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
74 p[0], p[1], p[2], p[3]) |
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
75 - text; |
291
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
76 } |
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
77 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
78 return 0; |
57
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
79 } |
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
80 |
1830 | 81 |
509 | 82 size_t |
83 ngx_inet_ntop(int family, void *addr, u_char *text, size_t len) | |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
84 { |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
85 u_char *p; |
291
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
86 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
87 if (family == AF_INET) { |
291
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
88 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
89 p = (u_char *) addr; |
291
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
90 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
91 return ngx_snprintf(text, len, "%ud.%ud.%ud.%ud", |
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
92 p[0], p[1], p[2], p[3]) |
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
93 - text; |
291
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
94 } |
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
95 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
96 return 0; |
1830 | 97 } |
98 | |
99 | |
340
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
100 /* AF_INET only */ |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
101 |
509 | 102 ngx_int_t |
103 ngx_ptocidr(ngx_str_t *text, void *cidr) | |
340
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
104 { |
368
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
105 ngx_int_t m; |
340
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
106 ngx_uint_t i; |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
107 ngx_inet_cidr_t *in_cidr; |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
108 |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
109 in_cidr = cidr; |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
110 |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
111 for (i = 0; i < text->len; i++) { |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
112 if (text->data[i] == '/') { |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
113 break; |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
114 } |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
115 } |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
116 |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
117 if (i == text->len) { |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
118 return NGX_ERROR; |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
119 } |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
120 |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
121 text->data[i] = '\0'; |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
122 in_cidr->addr = inet_addr((char *) text->data); |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
123 text->data[i] = '/'; |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
124 if (in_cidr->addr == INADDR_NONE) { |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
125 return NGX_ERROR; |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
126 } |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
127 |
368
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
128 m = ngx_atoi(&text->data[i + 1], text->len - (i + 1)); |
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
129 if (m == NGX_ERROR) { |
340
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
130 return NGX_ERROR; |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
131 } |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
132 |
368
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
133 if (m == 0) { |
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
134 |
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
135 /* the x86 compilers use the shl instruction that shifts by modulo 32 */ |
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
136 |
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
137 in_cidr->mask = 0; |
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
138 return NGX_OK; |
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
139 } |
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
140 |
404
37b5381fb6d8
nginx-0.0.9-2004-07-30-21:05:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
368
diff
changeset
|
141 in_cidr->mask = htonl((ngx_uint_t) (0 - (1 << (32 - m)))); |
368
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
142 |
1380
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1107
diff
changeset
|
143 if (in_cidr->addr == (in_cidr->addr & in_cidr->mask)) { |
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1107
diff
changeset
|
144 return NGX_OK; |
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1107
diff
changeset
|
145 } |
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1107
diff
changeset
|
146 |
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1107
diff
changeset
|
147 in_cidr->addr &= in_cidr->mask; |
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1107
diff
changeset
|
148 |
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1107
diff
changeset
|
149 return NGX_DONE; |
340
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
150 } |
425
bd39260a1383
nginx-0.0.10-2004-09-14-19:55:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
404
diff
changeset
|
151 |
bd39260a1383
nginx-0.0.10-2004-09-14-19:55:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
404
diff
changeset
|
152 |
651 | 153 ngx_int_t |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
154 ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u) |
651 | 155 { |
2200 | 156 u_char *p; |
651 | 157 |
158 p = u->url.data; | |
159 | |
1107
db7c468c447d
ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents:
906
diff
changeset
|
160 if (ngx_strncasecmp(p, (u_char *) "unix:", 5) == 0) { |
2200 | 161 return ngx_parse_unix_domain_url(pool, u); |
651 | 162 } |
163 | |
164 if ((p[0] == ':' || p[0] == '/') && !u->listen) { | |
165 u->err = "invalid host"; | |
166 return NGX_ERROR; | |
167 } | |
168 | |
2200 | 169 return ngx_parse_inet_url(pool, u); |
170 } | |
171 | |
172 | |
173 static ngx_int_t | |
174 ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u) | |
175 { | |
176 #if (NGX_HAVE_UNIX_DOMAIN) | |
177 u_char *p; | |
178 size_t len; | |
179 ngx_uint_t i; | |
180 struct sockaddr_un *saun; | |
181 | |
182 len = u->url.len; | |
183 p = u->url.data; | |
184 | |
185 p += 5; | |
186 len -= 5; | |
187 | |
188 u->uri.len = len; | |
189 u->uri.data = p; | |
190 | |
191 if (u->uri_part) { | |
192 for (i = 0; i < len; i++) { | |
193 | |
194 if (p[i] == ':') { | |
195 len = i; | |
196 | |
197 u->uri.len -= len + 1; | |
198 u->uri.data += len + 1; | |
199 | |
200 break; | |
201 } | |
202 } | |
203 } | |
204 | |
205 if (len == 0) { | |
206 u->err = "no path in the unix domain socket"; | |
207 return NGX_ERROR; | |
208 } | |
209 | |
210 if (len + 1 > sizeof(saun->sun_path)) { | |
211 u->err = "too long path in the unix domain socket"; | |
212 return NGX_ERROR; | |
213 } | |
214 | |
215 u->addrs = ngx_pcalloc(pool, sizeof(ngx_peer_addr_t)); | |
216 if (u->addrs == NULL) { | |
217 return NGX_ERROR; | |
218 } | |
219 | |
220 saun = ngx_pcalloc(pool, sizeof(struct sockaddr_un)); | |
221 if (saun == NULL) { | |
222 return NGX_ERROR; | |
223 } | |
224 | |
225 u->naddrs = 1; | |
226 | |
227 saun->sun_family = AF_UNIX; | |
228 (void) ngx_cpystrn((u_char *) saun->sun_path, p, len + 1); | |
229 | |
230 u->addrs[0].sockaddr = (struct sockaddr *) saun; | |
231 u->addrs[0].socklen = sizeof(struct sockaddr_un); | |
232 u->addrs[0].name.len = len + 5; | |
233 u->addrs[0].name.data = u->url.data; | |
234 | |
235 u->host.len = len; | |
236 u->host.data = p; | |
237 | |
238 u->unix_socket = 1; | |
239 | |
240 return NGX_OK; | |
241 | |
242 #else | |
243 | |
244 u->err = "the unix domain sockets are not supported on this platform"; | |
245 | |
246 return NGX_ERROR; | |
247 | |
248 #endif | |
249 } | |
250 | |
251 | |
252 static ngx_int_t | |
253 ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u) | |
254 { | |
255 u_char *p, *host, *port_start; | |
256 size_t len, port_len; | |
257 ngx_int_t port; | |
258 ngx_uint_t i; | |
259 struct hostent *h; | |
260 | |
261 len = u->url.len; | |
262 p = u->url.data; | |
263 | |
651 | 264 u->host.data = p; |
906 | 265 |
266 port_start = NULL; | |
267 port_len = 0; | |
651 | 268 |
269 for (i = 0; i < len; i++) { | |
270 | |
271 if (p[i] == ':') { | |
906 | 272 port_start = &p[i + 1]; |
651 | 273 u->host.len = i; |
274 | |
275 if (!u->uri_part) { | |
906 | 276 port_len = len - (i + 1); |
651 | 277 break; |
278 } | |
279 } | |
280 | |
281 if (p[i] == '/') { | |
282 u->uri.len = len - i; | |
283 u->uri.data = &p[i]; | |
284 | |
285 if (u->host.len == 0) { | |
286 u->host.len = i; | |
287 } | |
288 | |
906 | 289 if (port_start == NULL) { |
884 | 290 u->no_port = 1; |
291 goto no_port; | |
651 | 292 } |
293 | |
906 | 294 port_len = &p[i] - port_start; |
651 | 295 |
906 | 296 if (port_len == 0) { |
651 | 297 u->err = "invalid port"; |
298 return NGX_ERROR; | |
299 } | |
300 | |
301 break; | |
302 } | |
303 } | |
304 | |
906 | 305 if (port_start) { |
651 | 306 |
906 | 307 if (port_len == 0) { |
308 port_len = &p[i] - port_start; | |
651 | 309 |
906 | 310 if (port_len == 0) { |
651 | 311 u->err = "invalid port"; |
312 return NGX_ERROR; | |
313 } | |
314 } | |
315 | |
906 | 316 port = ngx_atoi(port_start, port_len); |
651 | 317 |
318 if (port == NGX_ERROR || port < 1 || port > 65536) { | |
319 u->err = "invalid port"; | |
320 return NGX_ERROR; | |
321 } | |
322 | |
1671
8075179cae21
ngx_parse_url() saves port text, this allows to use it in proxy host header
Igor Sysoev <igor@sysoev.ru>
parents:
1647
diff
changeset
|
323 u->port_text.len = port_len; |
8075179cae21
ngx_parse_url() saves port text, this allows to use it in proxy host header
Igor Sysoev <igor@sysoev.ru>
parents:
1647
diff
changeset
|
324 u->port_text.data = port_start; |
8075179cae21
ngx_parse_url() saves port text, this allows to use it in proxy host header
Igor Sysoev <igor@sysoev.ru>
parents:
1647
diff
changeset
|
325 |
651 | 326 } else { |
327 port = ngx_atoi(p, len); | |
328 | |
329 if (port == NGX_ERROR) { | |
330 u->host.len = len; | |
884 | 331 u->no_port = 1; |
651 | 332 |
884 | 333 goto no_port; |
651 | 334 } |
335 | |
336 u->wildcard = 1; | |
337 } | |
338 | |
906 | 339 u->port = (in_port_t) port; |
651 | 340 |
884 | 341 no_port: |
651 | 342 |
343 if (u->listen) { | |
884 | 344 |
906 | 345 if (u->port == 0) { |
346 if (u->default_port == 0) { | |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
347 u->err = "no port"; |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
348 return NGX_ERROR; |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
349 } |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
350 |
906 | 351 u->port = u->default_port; |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
352 } |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
353 |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
354 if (u->host.len == 1 && u->host.data[0] == '*') { |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
355 u->host.len = 0; |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
356 } |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
357 |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
358 /* AF_INET only */ |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
359 |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
360 if (u->host.len) { |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
361 |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
362 host = ngx_alloc(u->host.len + 1, pool->log); |
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
363 if (host == NULL) { |
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
364 return NGX_ERROR; |
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
365 } |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
366 |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
367 (void) ngx_cpystrn(host, u->host.data, u->host.len + 1); |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
368 |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
369 u->addr.in_addr = inet_addr((const char *) host); |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
370 |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
371 if (u->addr.in_addr == INADDR_NONE) { |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
372 h = gethostbyname((const char *) host); |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
373 |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
374 if (h == NULL || h->h_addr_list[0] == NULL) { |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
375 ngx_free(host); |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
376 u->err = "host not found"; |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
377 return NGX_ERROR; |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
378 } |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
379 |
906 | 380 u->addr.in_addr = *(in_addr_t *) (h->h_addr_list[0]); |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
381 } |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
382 |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
383 ngx_free(host); |
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
384 |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
385 } else { |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
386 u->addr.in_addr = INADDR_ANY; |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
387 } |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
388 |
651 | 389 return NGX_OK; |
390 } | |
391 | |
392 if (u->host.len == 0) { | |
393 u->err = "no host"; | |
394 return NGX_ERROR; | |
395 } | |
396 | |
884 | 397 if (u->no_resolve) { |
398 return NGX_OK; | |
651 | 399 } |
400 | |
906 | 401 if (u->no_port) { |
402 u->port = u->default_port; | |
403 } | |
404 | |
405 if (u->port == 0) { | |
406 u->err = "no port"; | |
407 return NGX_ERROR; | |
408 } | |
409 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
410 if (ngx_inet_resolve_host(pool, u) != NGX_OK) { |
651 | 411 return NGX_ERROR; |
412 } | |
413 | |
414 return NGX_OK; | |
415 } | |
416 | |
417 | |
884 | 418 ngx_int_t |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
419 ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u) |
651 | 420 { |
906 | 421 u_char *p, *host; |
651 | 422 size_t len; |
423 in_addr_t in_addr; | |
424 ngx_uint_t i; | |
425 struct hostent *h; | |
426 struct sockaddr_in *sin; | |
427 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
428 host = ngx_alloc(u->host.len + 1, pool->log); |
651 | 429 if (host == NULL) { |
884 | 430 return NGX_ERROR; |
651 | 431 } |
432 | |
884 | 433 (void) ngx_cpystrn(host, u->host.data, u->host.len + 1); |
651 | 434 |
435 /* AF_INET only */ | |
436 | |
437 in_addr = inet_addr((char *) host); | |
438 | |
439 if (in_addr == INADDR_NONE) { | |
440 h = gethostbyname((char *) host); | |
441 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
442 ngx_free(host); |
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
443 |
651 | 444 if (h == NULL || h->h_addr_list[0] == NULL) { |
884 | 445 u->err = "host not found"; |
446 return NGX_ERROR; | |
651 | 447 } |
448 | |
884 | 449 if (u->one_addr == 0) { |
450 for (i = 0; h->h_addr_list[i] != NULL; i++) { /* void */ } | |
451 | |
452 } else { | |
453 i = 1; | |
454 } | |
651 | 455 |
456 /* MP: ngx_shared_palloc() */ | |
457 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
458 u->addrs = ngx_pcalloc(pool, i * sizeof(ngx_peer_addr_t)); |
884 | 459 if (u->addrs == NULL) { |
460 return NGX_ERROR; | |
651 | 461 } |
462 | |
884 | 463 u->naddrs = i; |
651 | 464 |
465 for (i = 0; h->h_addr_list[i] != NULL; i++) { | |
466 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
467 sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in)); |
651 | 468 if (sin == NULL) { |
884 | 469 return NGX_ERROR; |
651 | 470 } |
471 | |
472 sin->sin_family = AF_INET; | |
906 | 473 sin->sin_port = htons(u->port); |
651 | 474 sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[i]); |
475 | |
884 | 476 u->addrs[i].sockaddr = (struct sockaddr *) sin; |
477 u->addrs[i].socklen = sizeof(struct sockaddr_in); | |
651 | 478 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
479 len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1; |
651 | 480 |
2049 | 481 p = ngx_pnalloc(pool, len); |
906 | 482 if (p == NULL) { |
884 | 483 return NGX_ERROR; |
651 | 484 } |
485 | |
2198
5975975eedc0
ngx_sock_ntop() takes family from sockaddr, remove duplicate field
Igor Sysoev <igor@sysoev.ru>
parents:
2197
diff
changeset
|
486 len = ngx_sock_ntop((struct sockaddr *) sin, p, len); |
651 | 487 |
906 | 488 u->addrs[i].name.len = ngx_sprintf(&p[len], ":%d", u->port) - p; |
489 u->addrs[i].name.data = p; | |
651 | 490 } |
491 | |
492 } else { | |
493 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
494 ngx_free(host); |
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
495 |
651 | 496 /* MP: ngx_shared_palloc() */ |
497 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
498 u->addrs = ngx_pcalloc(pool, sizeof(ngx_peer_addr_t)); |
884 | 499 if (u->addrs == NULL) { |
500 return NGX_ERROR; | |
651 | 501 } |
502 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
503 sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in)); |
651 | 504 if (sin == NULL) { |
884 | 505 return NGX_ERROR; |
651 | 506 } |
507 | |
884 | 508 u->naddrs = 1; |
651 | 509 |
510 sin->sin_family = AF_INET; | |
906 | 511 sin->sin_port = htons(u->port); |
651 | 512 sin->sin_addr.s_addr = in_addr; |
513 | |
884 | 514 u->addrs[0].sockaddr = (struct sockaddr *) sin; |
515 u->addrs[0].socklen = sizeof(struct sockaddr_in); | |
651 | 516 |
2049 | 517 p = ngx_pnalloc(pool, u->host.len + sizeof(":65536") - 1); |
906 | 518 if (p == NULL) { |
884 | 519 return NGX_ERROR; |
651 | 520 } |
521 | |
906 | 522 u->addrs[0].name.len = ngx_sprintf(p, "%V:%d", &u->host, u->port) - p; |
523 u->addrs[0].name.data = p; | |
651 | 524 } |
525 | |
884 | 526 return NGX_OK; |
651 | 527 } |