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 }