@@ -611,6 +611,7 @@ static apr_status_t dispatch(proxy_conn_rec *conn, request_rec *r,
611611 char writebuf [AP_IOBUFSIZE ];
612612 apr_size_t writebuflen ;
613613 int last_stdin = 0 ;
614+ int nvec = 0 ;
614615
615616 rv = ap_get_brigade (r -> input_filters , ib ,
616617 AP_MODE_READBYTES , APR_BLOCK_READ ,
@@ -637,26 +638,32 @@ static apr_status_t dispatch(proxy_conn_rec *conn, request_rec *r,
637638 (apr_uint16_t ) writebuflen , 0 );
638639 fcgi_header_to_array (& header , farray );
639640
640- vec [0 ].iov_base = farray ;
641- vec [0 ].iov_len = sizeof (farray );
642- vec [1 ].iov_base = writebuf ;
643- vec [1 ].iov_len = writebuflen ;
641+ vec [nvec ].iov_base = farray ;
642+ vec [nvec ].iov_len = sizeof (farray );
643+ ++ nvec ;
644+ if (writebuflen ) {
645+ vec [nvec ].iov_base = writebuf ;
646+ vec [nvec ].iov_len = writebuflen ;
647+ ++ nvec ;
648+ }
644649
645- rv = send_data (conn , vec , 2 , & len , 0 );
650+ rv = send_data (conn , vec , nvec , & len , 0 );
646651 if (rv != APR_SUCCESS ) {
647652 break ;
648653 }
649654
650655 if (last_stdin ) {
651656 pfd .reqevents = APR_POLLIN ; /* Done with input data */
652657
653- fill_in_header (& header , FCGI_STDIN , request_id , 0 , 0 );
654- fcgi_header_to_array (& header , farray );
658+ if (writebuflen ) { /* empty FCGI_STDIN not already sent? */
659+ fill_in_header (& header , FCGI_STDIN , request_id , 0 , 0 );
660+ fcgi_header_to_array (& header , farray );
655661
656- vec [0 ].iov_base = farray ;
657- vec [0 ].iov_len = sizeof (farray );
662+ vec [0 ].iov_base = farray ;
663+ vec [0 ].iov_len = sizeof (farray );
658664
659- rv = send_data (conn , vec , 1 , & len , 1 );
665+ rv = send_data (conn , vec , 1 , & len , 1 );
666+ }
660667 }
661668 }
662669
0 commit comments