You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by tr...@locus.apache.org on 2000/10/10 06:11:37 UTC

cvs commit: apache-2.0/src/modules/standard mod_cgi.c

trawick     00/10/09 21:11:36

  Modified:    src      CHANGES
               src/modules/standard mod_cgi.c
  Log:
  Write all of the request body to the child, not just what the kernel
  would accept on the first write.
  
  Because the pipe is non-blocking (via setting an APR timeout), we
  have to send in a loop.
  
  Revision  Changes    Path
  1.267     +3 -0      apache-2.0/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/CHANGES,v
  retrieving revision 1.266
  retrieving revision 1.267
  diff -u -r1.266 -r1.267
  --- CHANGES	2000/10/10 03:35:10	1.266
  +++ CHANGES	2000/10/10 04:11:35	1.267
  @@ -1,5 +1,8 @@
   Changes with Apache 2.0a8
   
  +  *) mod_cgi: Write all of the request body to the child, not just what
  +     the kernel would accept on the first write.  [Jeff Trawick]
  +
     *) Back out the change that moved the brigade from the core_output_filters
        ctx to the conn_rec.  Since all requests over a given connection
        go through the same core_output_filter, the ctx pointer has the
  
  
  
  1.64      +13 -4     apache-2.0/src/modules/standard/mod_cgi.c
  
  Index: mod_cgi.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_cgi.c,v
  retrieving revision 1.63
  retrieving revision 1.64
  diff -u -r1.63 -r1.64
  --- mod_cgi.c	2000/09/18 01:24:55	1.63
  +++ mod_cgi.c	2000/10/10 04:11:35	1.64
  @@ -579,7 +579,8 @@
        */
       if (ap_should_client_block(r)) {
   	int dbsize, len_read;
  -        apr_ssize_t bytes_written;
  +        apr_ssize_t bytes_written, bytes_to_write;
  +        apr_status_t rv;
   
   	if (conf->logname) {
   	    dbuf = apr_pcalloc(r->pool, conf->bufbytes + 1);
  @@ -598,9 +599,17 @@
   		memcpy(dbuf + dbpos, argsbuffer, dbsize);
   		dbpos += dbsize;
   	    }
  -            bytes_written = len_read;
  -            (void) apr_write(script_out, argsbuffer, &bytes_written);
  -	    if (bytes_written < len_read) {
  +            /* Keep writing data to the child until done or too much time
  +             * elapses with no progress or an error occurs.
  +             */
  +            bytes_written = 0;
  +            do {
  +                bytes_to_write = len_read - bytes_written;
  +                rv = apr_write(script_out, argsbuffer + bytes_written, 
  +                               &bytes_to_write);
  +                bytes_written += bytes_to_write;
  +            } while (rv == APR_SUCCESS && bytes_written < len_read);
  +	    if (rv != APR_SUCCESS || bytes_written < len_read) {
   		/* silly script stopped reading, soak up remaining message */
   		while (ap_get_client_block(r, argsbuffer, HUGE_STRING_LEN) > 0) {
   		    /* dump it */