comparison src/http/ngx_http_upstream.c @ 542:4c5d2c627a6c NGINX_0_8_17

nginx 0.8.17 *) Security: now "/../" are disabled in "Destination" request header line. *) Change: now $host variable value is always low case. *) Feature: the $ssl_session_id variable. *) Bugfix: socket leak; the bug had appeared in 0.8.11.
author Igor Sysoev <http://sysoev.ru>
date Mon, 28 Sep 2009 00:00:00 +0400
parents 0161f3197817
children 0dc162a5f3e8
comparison
equal deleted inserted replaced
541:b8ac674b0ec9 542:4c5d2c627a6c
530 if (u->resolved->sockaddr) { 530 if (u->resolved->sockaddr) {
531 531
532 if (ngx_http_upstream_create_round_robin_peer(r, u->resolved) 532 if (ngx_http_upstream_create_round_robin_peer(r, u->resolved)
533 != NGX_OK) 533 != NGX_OK)
534 { 534 {
535 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); 535 ngx_http_upstream_finalize_request(r, u,
536 NGX_HTTP_INTERNAL_SERVER_ERROR);
536 return; 537 return;
537 } 538 }
538 539
539 ngx_http_upstream_connect(r, u); 540 ngx_http_upstream_connect(r, u);
540 541
562 563
563 temp.name = *host; 564 temp.name = *host;
564 565
565 ctx = ngx_resolve_start(clcf->resolver, &temp); 566 ctx = ngx_resolve_start(clcf->resolver, &temp);
566 if (ctx == NULL) { 567 if (ctx == NULL) {
567 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); 568 ngx_http_upstream_finalize_request(r, u,
569 NGX_HTTP_INTERNAL_SERVER_ERROR);
568 return; 570 return;
569 } 571 }
570 572
571 if (ctx == NGX_NO_RESOLVER) { 573 if (ctx == NGX_NO_RESOLVER) {
572 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, 574 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
573 "no resolver defined to resolve %V", host); 575 "no resolver defined to resolve %V", host);
574 576
575 ngx_http_finalize_request(r, NGX_HTTP_BAD_GATEWAY); 577 ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);
576 return; 578 return;
577 } 579 }
578 580
579 ctx->name = *host; 581 ctx->name = *host;
580 ctx->type = NGX_RESOLVE_A; 582 ctx->type = NGX_RESOLVE_A;
584 586
585 u->resolved->ctx = ctx; 587 u->resolved->ctx = ctx;
586 588
587 if (ngx_resolve_name(ctx) != NGX_OK) { 589 if (ngx_resolve_name(ctx) != NGX_OK) {
588 u->resolved->ctx = NULL; 590 u->resolved->ctx = NULL;
589 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); 591 ngx_http_upstream_finalize_request(r, u,
592 NGX_HTTP_INTERNAL_SERVER_ERROR);
590 return; 593 return;
591 } 594 }
592 595
593 return; 596 return;
594 } 597 }
595 598
596 found: 599 found:
597 600
598 if (uscf->peer.init(r, uscf) != NGX_OK) { 601 if (uscf->peer.init(r, uscf) != NGX_OK) {
599 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); 602 ngx_http_upstream_finalize_request(r, u,
603 NGX_HTTP_INTERNAL_SERVER_ERROR);
600 return; 604 return;
601 } 605 }
602 606
603 ngx_http_upstream_connect(r, u); 607 ngx_http_upstream_connect(r, u);
604 } 608 }
787 791
788 static void 792 static void
789 ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx) 793 ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx)
790 { 794 {
791 ngx_http_request_t *r; 795 ngx_http_request_t *r;
796 ngx_http_upstream_t *u;
792 ngx_http_upstream_resolved_t *ur; 797 ngx_http_upstream_resolved_t *ur;
793 798
794 r = ctx->data; 799 r = ctx->data;
795 800
796 r->upstream->resolved->ctx = NULL; 801 u = r->upstream;
802 ur = u->resolved;
797 803
798 if (ctx->state) { 804 if (ctx->state) {
799 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, 805 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
800 "%V could not be resolved (%i: %s)", 806 "%V could not be resolved (%i: %s)",
801 &ctx->name, ctx->state, 807 &ctx->name, ctx->state,
802 ngx_resolver_strerror(ctx->state)); 808 ngx_resolver_strerror(ctx->state));
803 809
804 ngx_resolve_name_done(ctx); 810 ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);
805 ngx_http_finalize_request(r, NGX_HTTP_BAD_GATEWAY); 811 return;
806 return; 812 }
807 } 813
808
809 ur = r->upstream->resolved;
810 ur->naddrs = ctx->naddrs; 814 ur->naddrs = ctx->naddrs;
811 ur->addrs = ctx->addrs; 815 ur->addrs = ctx->addrs;
812 816
813 #if (NGX_DEBUG) 817 #if (NGX_DEBUG)
814 { 818 {
825 } 829 }
826 } 830 }
827 #endif 831 #endif
828 832
829 if (ngx_http_upstream_create_round_robin_peer(r, ur) != NGX_OK) { 833 if (ngx_http_upstream_create_round_robin_peer(r, ur) != NGX_OK) {
830 ngx_resolve_name_done(ctx); 834 ngx_http_upstream_finalize_request(r, u,
831 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); 835 NGX_HTTP_INTERNAL_SERVER_ERROR);
832 return; 836 return;
833 } 837 }
834 838
835 ngx_resolve_name_done(ctx); 839 ngx_resolve_name_done(ctx);
836 840 ur->ctx = NULL;
837 ngx_http_upstream_connect(r, r->upstream); 841
842 ngx_http_upstream_connect(r, u);
838 } 843 }
839 844
840 845
841 static void 846 static void
842 ngx_http_upstream_handler(ngx_event_t *ev) 847 ngx_http_upstream_handler(ngx_event_t *ev)
916 if (!u->cacheable) { 921 if (!u->cacheable) {
917 ngx_http_upstream_finalize_request(r, u, 922 ngx_http_upstream_finalize_request(r, u,
918 NGX_HTTP_CLIENT_CLOSED_REQUEST); 923 NGX_HTTP_CLIENT_CLOSED_REQUEST);
919 } 924 }
920 925
921 return;
922 }
923
924 if (u->peer.connection == NULL) {
925 return; 926 return;
926 } 927 }
927 928
928 #if (NGX_HAVE_KQUEUE) 929 #if (NGX_HAVE_KQUEUE)
929 930
954 "prematurely connection"); 955 "prematurely connection");
955 956
956 if (u->peer.connection == NULL) { 957 if (u->peer.connection == NULL) {
957 ngx_http_upstream_finalize_request(r, u, 958 ngx_http_upstream_finalize_request(r, u,
958 NGX_HTTP_CLIENT_CLOSED_REQUEST); 959 NGX_HTTP_CLIENT_CLOSED_REQUEST);
959 return;
960 } 960 }
961 961
962 return; 962 return;
963 } 963 }
964 964
1017 "client closed prematurely connection"); 1017 "client closed prematurely connection");
1018 1018
1019 if (u->peer.connection == NULL) { 1019 if (u->peer.connection == NULL) {
1020 ngx_http_upstream_finalize_request(r, u, 1020 ngx_http_upstream_finalize_request(r, u,
1021 NGX_HTTP_CLIENT_CLOSED_REQUEST); 1021 NGX_HTTP_CLIENT_CLOSED_REQUEST);
1022 return;
1023 } 1022 }
1024 } 1023 }
1025 1024
1026 1025
1027 static void 1026 static void
1795 } 1794 }
1796 1795
1797 uri = &u->headers_in.x_accel_redirect->value; 1796 uri = &u->headers_in.x_accel_redirect->value;
1798 args.len = 0; 1797 args.len = 0;
1799 args.data = NULL; 1798 args.data = NULL;
1800 flags = 0; 1799 flags = NGX_HTTP_LOG_UNSAFE;
1801 1800
1802 if (ngx_http_parse_unsafe_uri(r, uri, &args, &flags) != NGX_OK) { 1801 if (ngx_http_parse_unsafe_uri(r, uri, &args, &flags) != NGX_OK) {
1803 ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND); 1802 ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);
1804 return NGX_DONE; 1803 return NGX_DONE;
1805 } 1804 }
2835 2834
2836 u = r->upstream; 2835 u = r->upstream;
2837 2836
2838 if (u->resolved && u->resolved->ctx) { 2837 if (u->resolved && u->resolved->ctx) {
2839 ngx_resolve_name_done(u->resolved->ctx); 2838 ngx_resolve_name_done(u->resolved->ctx);
2839 u->resolved->ctx = NULL;
2840 } 2840 }
2841 2841
2842 ngx_http_upstream_finalize_request(r, u, NGX_DONE); 2842 ngx_http_upstream_finalize_request(r, u, NGX_DONE);
2843 } 2843 }
2844 2844
2852 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, 2852 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2853 "finalize http upstream request: %i", rc); 2853 "finalize http upstream request: %i", rc);
2854 2854
2855 if (u->cleanup) { 2855 if (u->cleanup) {
2856 *u->cleanup = NULL; 2856 *u->cleanup = NULL;
2857 }
2858
2859 if (u->resolved && u->resolved->ctx) {
2860 ngx_resolve_name_done(u->resolved->ctx);
2861 u->resolved->ctx = NULL;
2857 } 2862 }
2858 2863
2859 if (u->state && u->state->response_sec) { 2864 if (u->state && u->state->response_sec) {
2860 tp = ngx_timeofday(); 2865 tp = ngx_timeofday();
2861 u->state->response_sec = tp->sec - u->state->response_sec; 2866 u->state->response_sec = tp->sec - u->state->response_sec;