Mercurial > hg > nginx-vendor-0-8
comparison src/core/ngx_inet.c @ 266:251bcd11a5b8 NGINX_0_5_3
nginx 0.5.3
*) Feature: the ngx_http_perl_module supports the $r->status,
$r->log_error, and $r->sleep methods.
*) Feature: the $r->variable method supports variables that do not
exist in nginx configuration.
*) Bugfix: the $r->has_request_body method did not work.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Wed, 13 Dec 2006 00:00:00 +0300 |
parents | e0b1d0a6c629 |
children | 5bef04fc3fd5 |
comparison
equal
deleted
inserted
replaced
265:3d4634b3b321 | 266:251bcd11a5b8 |
---|---|
219 | 219 |
220 | 220 |
221 ngx_int_t | 221 ngx_int_t |
222 ngx_parse_url(ngx_conf_t *cf, ngx_url_t *u) | 222 ngx_parse_url(ngx_conf_t *cf, ngx_url_t *u) |
223 { | 223 { |
224 u_char *p, *host; | 224 u_char *p, *host, *port_start; |
225 size_t len; | 225 size_t len, port_len; |
226 ngx_int_t port; | 226 ngx_int_t port; |
227 ngx_uint_t i; | 227 ngx_uint_t i; |
228 struct hostent *h; | 228 struct hostent *h; |
229 #if (NGX_HAVE_UNIX_DOMAIN) | 229 #if (NGX_HAVE_UNIX_DOMAIN) |
230 struct sockaddr_un *saun; | 230 struct sockaddr_un *saun; |
288 u->addrs[0].name.data = u->url.data; | 288 u->addrs[0].name.data = u->url.data; |
289 | 289 |
290 u->host.len = len; | 290 u->host.len = len; |
291 u->host.data = p; | 291 u->host.data = p; |
292 | 292 |
293 u->host_header.len = sizeof("localhost") - 1; | 293 u->unix_socket = 1; |
294 u->host_header.data = (u_char *) "localhost"; | |
295 | 294 |
296 return NGX_OK; | 295 return NGX_OK; |
297 | 296 |
298 #else | 297 #else |
299 u->err = "the unix domain sockets are not supported on this platform"; | 298 u->err = "the unix domain sockets are not supported on this platform"; |
307 u->err = "invalid host"; | 306 u->err = "invalid host"; |
308 return NGX_ERROR; | 307 return NGX_ERROR; |
309 } | 308 } |
310 | 309 |
311 u->host.data = p; | 310 u->host.data = p; |
312 u->host_header.len = len; | 311 |
313 u->host_header.data = p; | 312 port_start = NULL; |
313 port_len = 0; | |
314 | 314 |
315 for (i = 0; i < len; i++) { | 315 for (i = 0; i < len; i++) { |
316 | 316 |
317 if (p[i] == ':') { | 317 if (p[i] == ':') { |
318 u->port.data = &p[i + 1]; | 318 port_start = &p[i + 1]; |
319 u->host.len = i; | 319 u->host.len = i; |
320 | 320 |
321 if (!u->uri_part) { | 321 if (!u->uri_part) { |
322 u->port.len = len - (i + 1); | 322 port_len = len - (i + 1); |
323 break; | 323 break; |
324 } | 324 } |
325 } | 325 } |
326 | 326 |
327 if (p[i] == '/') { | 327 if (p[i] == '/') { |
328 u->uri.len = len - i; | 328 u->uri.len = len - i; |
329 u->uri.data = &p[i]; | 329 u->uri.data = &p[i]; |
330 u->host_header.len = i; | |
331 | 330 |
332 if (u->host.len == 0) { | 331 if (u->host.len == 0) { |
333 u->host.len = i; | 332 u->host.len = i; |
334 } | 333 } |
335 | 334 |
336 if (u->port.data == NULL) { | 335 if (port_start == NULL) { |
337 u->no_port = 1; | 336 u->no_port = 1; |
338 goto no_port; | 337 goto no_port; |
339 } | 338 } |
340 | 339 |
341 u->port.len = &p[i] - u->port.data; | 340 port_len = &p[i] - port_start; |
342 | 341 |
343 if (u->port.len == 0) { | 342 if (port_len == 0) { |
344 u->err = "invalid port"; | 343 u->err = "invalid port"; |
345 return NGX_ERROR; | 344 return NGX_ERROR; |
346 } | 345 } |
347 | 346 |
348 break; | 347 break; |
349 } | 348 } |
350 } | 349 } |
351 | 350 |
352 if (u->port.data) { | 351 if (port_start) { |
353 | 352 |
354 if (u->port.len == 0) { | 353 if (port_len == 0) { |
355 u->port.len = &p[i] - u->port.data; | 354 port_len = &p[i] - port_start; |
356 | 355 |
357 if (u->port.len == 0) { | 356 if (port_len == 0) { |
358 u->err = "invalid port"; | 357 u->err = "invalid port"; |
359 return NGX_ERROR; | 358 return NGX_ERROR; |
360 } | 359 } |
361 } | 360 } |
362 | 361 |
363 port = ngx_atoi(u->port.data, u->port.len); | 362 port = ngx_atoi(port_start, port_len); |
364 | 363 |
365 if (port == NGX_ERROR || port < 1 || port > 65536) { | 364 if (port == NGX_ERROR || port < 1 || port > 65536) { |
366 u->err = "invalid port"; | 365 u->err = "invalid port"; |
367 return NGX_ERROR; | 366 return NGX_ERROR; |
368 } | 367 } |
375 u->no_port = 1; | 374 u->no_port = 1; |
376 | 375 |
377 goto no_port; | 376 goto no_port; |
378 } | 377 } |
379 | 378 |
380 u->port.len = len; | |
381 u->port.data = p; | |
382 u->wildcard = 1; | 379 u->wildcard = 1; |
383 } | 380 } |
384 | 381 |
385 u->portn = (in_port_t) port; | 382 u->port = (in_port_t) port; |
386 | 383 |
387 no_port: | 384 no_port: |
388 | 385 |
389 if (u->listen) { | 386 if (u->listen) { |
390 | 387 |
391 if (u->portn == 0) { | 388 if (u->port == 0) { |
392 if (u->default_portn == 0) { | 389 if (u->default_port == 0) { |
393 u->err = "no port"; | 390 u->err = "no port"; |
394 return NGX_ERROR; | 391 return NGX_ERROR; |
395 } | 392 } |
396 | 393 |
397 u->portn = u->default_portn; | 394 u->port = u->default_port; |
398 } | 395 } |
399 | 396 |
400 if (u->host.len == 1 && u->host.data[0] == '*') { | 397 if (u->host.len == 1 && u->host.data[0] == '*') { |
401 u->host.len = 0; | 398 u->host.len = 0; |
402 } | 399 } |
420 if (h == NULL || h->h_addr_list[0] == NULL) { | 417 if (h == NULL || h->h_addr_list[0] == NULL) { |
421 u->err = "host not found"; | 418 u->err = "host not found"; |
422 return NGX_ERROR; | 419 return NGX_ERROR; |
423 } | 420 } |
424 | 421 |
425 u->addr.in_addr = *(in_addr_t *)(h->h_addr_list[0]); | 422 u->addr.in_addr = *(in_addr_t *) (h->h_addr_list[0]); |
426 } | 423 } |
427 | 424 |
428 } else { | 425 } else { |
429 u->addr.in_addr = INADDR_ANY; | 426 u->addr.in_addr = INADDR_ANY; |
430 } | 427 } |
431 | 428 |
432 return NGX_OK; | 429 return NGX_OK; |
433 } | 430 } |
434 | 431 |
435 if (u->no_port) { | |
436 | |
437 if (u->default_portn == 0 && !u->upstream) { | |
438 u->err = "no port"; | |
439 return NGX_ERROR; | |
440 } | |
441 | |
442 u->portn = u->default_portn; | |
443 | |
444 u->port.data = ngx_palloc(cf->pool, sizeof("65536") - 1); | |
445 if (u->port.data == NULL) { | |
446 return NGX_ERROR; | |
447 } | |
448 | |
449 u->port.len = ngx_sprintf(u->port.data, "%d", u->portn) - u->port.data; | |
450 | |
451 } else if (u->portn == 0) { | |
452 | |
453 u->err = "no port"; | |
454 return NGX_ERROR; | |
455 } | |
456 | |
457 if (u->host.len == 0) { | 432 if (u->host.len == 0) { |
458 u->err = "no host"; | 433 u->err = "no host"; |
459 return NGX_ERROR; | 434 return NGX_ERROR; |
460 } | 435 } |
461 | 436 |
462 if (u->no_resolve) { | 437 if (u->no_resolve) { |
463 return NGX_OK; | 438 return NGX_OK; |
439 } | |
440 | |
441 if (u->no_port) { | |
442 u->port = u->default_port; | |
443 } | |
444 | |
445 if (u->port == 0) { | |
446 u->err = "no port"; | |
447 return NGX_ERROR; | |
464 } | 448 } |
465 | 449 |
466 if (ngx_inet_resolve_host(cf, u) != NGX_OK) { | 450 if (ngx_inet_resolve_host(cf, u) != NGX_OK) { |
467 return NGX_ERROR; | 451 return NGX_ERROR; |
468 } | 452 } |
472 | 456 |
473 | 457 |
474 ngx_int_t | 458 ngx_int_t |
475 ngx_inet_resolve_host(ngx_conf_t *cf, ngx_url_t *u) | 459 ngx_inet_resolve_host(ngx_conf_t *cf, ngx_url_t *u) |
476 { | 460 { |
477 u_char *host; | 461 u_char *p, *host; |
478 size_t len; | 462 size_t len; |
479 in_addr_t in_addr; | 463 in_addr_t in_addr; |
480 ngx_uint_t i; | 464 ngx_uint_t i; |
481 struct hostent *h; | 465 struct hostent *h; |
482 struct sockaddr_in *sin; | 466 struct sockaddr_in *sin; |
522 if (sin == NULL) { | 506 if (sin == NULL) { |
523 return NGX_ERROR; | 507 return NGX_ERROR; |
524 } | 508 } |
525 | 509 |
526 sin->sin_family = AF_INET; | 510 sin->sin_family = AF_INET; |
527 sin->sin_port = htons(u->portn); | 511 sin->sin_port = htons(u->port); |
528 sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[i]); | 512 sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[i]); |
529 | 513 |
530 u->addrs[i].sockaddr = (struct sockaddr *) sin; | 514 u->addrs[i].sockaddr = (struct sockaddr *) sin; |
531 u->addrs[i].socklen = sizeof(struct sockaddr_in); | 515 u->addrs[i].socklen = sizeof(struct sockaddr_in); |
532 | 516 |
533 len = INET_ADDRSTRLEN - 1 + 1 + sizeof(":65536") - 1; | 517 len = INET_ADDRSTRLEN - 1 + 1 + sizeof(":65536") - 1; |
534 | 518 |
535 u->addrs[i].name.data = ngx_palloc(cf->pool, len); | 519 p = ngx_palloc(cf->pool, len); |
536 if (u->addrs[i].name.data == NULL) { | 520 if (p == NULL) { |
537 return NGX_ERROR; | 521 return NGX_ERROR; |
538 } | 522 } |
539 | 523 |
540 len = ngx_sock_ntop(AF_INET, (struct sockaddr *) sin, | 524 len = ngx_sock_ntop(AF_INET, (struct sockaddr *) sin, p, len); |
541 u->addrs[i].name.data, len); | 525 |
542 | 526 u->addrs[i].name.len = ngx_sprintf(&p[len], ":%d", u->port) - p; |
543 u->addrs[i].name.len = ngx_sprintf(&u->addrs[i].name.data[len], | 527 u->addrs[i].name.data = p; |
544 ":%d", u->portn) | |
545 - u->addrs[i].name.data; | |
546 } | 528 } |
547 | 529 |
548 } else { | 530 } else { |
549 | 531 |
550 /* MP: ngx_shared_palloc() */ | 532 /* MP: ngx_shared_palloc() */ |
560 } | 542 } |
561 | 543 |
562 u->naddrs = 1; | 544 u->naddrs = 1; |
563 | 545 |
564 sin->sin_family = AF_INET; | 546 sin->sin_family = AF_INET; |
565 sin->sin_port = htons(u->portn); | 547 sin->sin_port = htons(u->port); |
566 sin->sin_addr.s_addr = in_addr; | 548 sin->sin_addr.s_addr = in_addr; |
567 | 549 |
568 u->addrs[0].sockaddr = (struct sockaddr *) sin; | 550 u->addrs[0].sockaddr = (struct sockaddr *) sin; |
569 u->addrs[0].socklen = sizeof(struct sockaddr_in); | 551 u->addrs[0].socklen = sizeof(struct sockaddr_in); |
570 | 552 |
571 u->addrs[0].name.data = ngx_palloc(cf->pool, | 553 p = ngx_palloc(cf->pool, u->host.len + sizeof(":65536") - 1); |
572 u->host.len + sizeof(":65536") - 1); | 554 if (p == NULL) { |
573 if (u->addrs[0].name.data == NULL) { | 555 return NGX_ERROR; |
574 return NGX_ERROR; | 556 } |
575 } | 557 |
576 | 558 u->addrs[0].name.len = ngx_sprintf(p, "%V:%d", &u->host, u->port) - p; |
577 u->addrs[0].name.len = ngx_sprintf(u->addrs[0].name.data, "%V:%d", | 559 u->addrs[0].name.data = p; |
578 &u->host, u->portn) | |
579 - u->addrs[0].name.data; | |
580 } | 560 } |
581 | 561 |
582 return NGX_OK; | 562 return NGX_OK; |
583 } | 563 } |