comparison src/http/modules/ngx_http_fastcgi_module.c @ 164:b922c231a392 NGINX_0_3_29

nginx 0.3.29 *) Feature: now nginx uses less memory, if PHP in FastCGI mode sends many warnings before the response. *) Bugfix: the "Transfer-Encoding: chunked" header line was issued in the 204 responses for the HTTP/1.1 requests. *) Bugfix: nginx returned the 502 response, if the complete response header lines were transferred in a separate FastCGI records. *) Bugfix: if the proxied URI was specified in the "post_action" directive, then it ran only after a successful completion of a request.
author Igor Sysoev <http://sysoev.ru>
date Mon, 20 Feb 2006 00:00:00 +0300
parents 91372f004adf
children 3314be145cb9
comparison
equal deleted inserted replaced
163:cf311b6cf6df 164:b922c231a392
44 u_char *last; 44 u_char *last;
45 ngx_uint_t type; 45 ngx_uint_t type;
46 size_t length; 46 size_t length;
47 size_t padding; 47 size_t padding;
48 48
49 ngx_uint_t header; 49 ngx_uint_t fastcgi_stdout;
50 } ngx_http_fastcgi_ctx_t; 50 } ngx_http_fastcgi_ctx_t;
51 51
52 52
53 #define NGX_HTTP_FASTCGI_RESPONDER 1 53 #define NGX_HTTP_FASTCGI_RESPONDER 1
54 54
774 if (f == NULL) { 774 if (f == NULL) {
775 return NGX_OK; 775 return NGX_OK;
776 } 776 }
777 777
778 f->state = ngx_http_fastcgi_st_version; 778 f->state = ngx_http_fastcgi_st_version;
779 f->header = 0; 779 f->fastcgi_stdout = 0;
780 780
781 return NGX_OK; 781 return NGX_OK;
782 } 782 }
783 783
784 784
874 874
875 /* f->state == ngx_http_fastcgi_st_data */ 875 /* f->state == ngx_http_fastcgi_st_data */
876 876
877 if (f->type == NGX_HTTP_FASTCGI_STDERR) { 877 if (f->type == NGX_HTTP_FASTCGI_STDERR) {
878 878
879 if (f->header) {
880 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
881 "upstream split a header in FastCGI records");
882
883 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
884 }
885
886 if (f->length) { 879 if (f->length) {
887 line.data = u->buffer.pos; 880 line.data = u->buffer.pos;
888 881
889 if (u->buffer.pos + f->length <= u->buffer.last) { 882 if (u->buffer.pos + f->length <= u->buffer.last) {
890 line.len = f->length; 883 line.len = f->length;
908 901
909 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, 902 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
910 "FastCGI sent in stderr: \"%V\"", &line); 903 "FastCGI sent in stderr: \"%V\"", &line);
911 904
912 if (u->buffer.pos == u->buffer.last) { 905 if (u->buffer.pos == u->buffer.last) {
906
907 if (!f->fastcgi_stdout) {
908
909 /*
910 * the special handling the large number
911 * of the PHP warnings to not allocate memory
912 */
913
914 u->buffer.pos = u->buffer.start;
915 u->buffer.last = u->buffer.start;
916 }
917
913 return NGX_AGAIN; 918 return NGX_AGAIN;
914 } 919 }
915 920
916 } else { 921 } else {
917 f->state = ngx_http_fastcgi_st_version; 922 f->state = ngx_http_fastcgi_st_version;
920 continue; 925 continue;
921 } 926 }
922 927
923 928
924 /* f->type == NGX_HTTP_FASTCGI_STDOUT */ 929 /* f->type == NGX_HTTP_FASTCGI_STDOUT */
930
931 f->fastcgi_stdout = 1;
925 932
926 start = u->buffer.pos; 933 start = u->buffer.pos;
927 934
928 if (u->buffer.pos + f->length < u->buffer.last) { 935 if (u->buffer.pos + f->length < u->buffer.last) {
929 936
936 u->buffer.last = u->buffer.pos + f->length; 943 u->buffer.last = u->buffer.pos + f->length;
937 944
938 } else { 945 } else {
939 last = NULL; 946 last = NULL;
940 } 947 }
941
942 f->header = 1;
943 948
944 for ( ;; ) { 949 for ( ;; ) {
945 950
946 rc = ngx_http_parse_header_line(r, &u->buffer); 951 rc = ngx_http_parse_header_line(r, &u->buffer);
947 952
989 994
990 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, 995 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
991 "http fastcgi header: \"%V: %V\"", 996 "http fastcgi header: \"%V: %V\"",
992 &h->key, &h->value); 997 &h->key, &h->value);
993 998
994 continue; 999 if (u->buffer.pos < u->buffer.last) {
1000 continue;
1001 }
1002
1003 /* the end of the FastCGI record */
1004
1005 break;
995 } 1006 }
996 1007
997 if (rc == NGX_HTTP_PARSE_HEADER_DONE) { 1008 if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
998 1009
999 /* a whole header has been parsed successfully */ 1010 /* a whole header has been parsed successfully */
1042 if (last) { 1053 if (last) {
1043 u->buffer.last = last; 1054 u->buffer.last = last;
1044 } 1055 }
1045 1056
1046 f->length -= u->buffer.pos - start; 1057 f->length -= u->buffer.pos - start;
1047
1048 if (rc == NGX_AGAIN) {
1049 if (u->buffer.pos == u->buffer.last) {
1050 return NGX_AGAIN;
1051 }
1052
1053 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
1054 "upstream split a header in FastCGI records");
1055
1056 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
1057 }
1058 1058
1059 if (f->length == 0) { 1059 if (f->length == 0) {
1060 if (f->padding) { 1060 if (f->padding) {
1061 f->state = ngx_http_fastcgi_st_padding; 1061 f->state = ngx_http_fastcgi_st_padding;
1062 } else { 1062 } else {
1063 f->state = ngx_http_fastcgi_st_version; 1063 f->state = ngx_http_fastcgi_st_version;
1064 } 1064 }
1065 } 1065 }
1066 1066
1067 return NGX_OK; 1067 if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
1068 return NGX_OK;
1069 }
1070
1071 if (u->buffer.pos == u->buffer.last) {
1072 return NGX_AGAIN;
1073 }
1074
1075 if (rc == NGX_AGAIN) {
1076 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
1077 "upstream split a header line in FastCGI records");
1078
1079 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
1080 }
1068 } 1081 }
1069 } 1082 }
1070 1083
1071 1084
1072 static ngx_int_t 1085 static ngx_int_t