[mod_python] A patch for mod_python-2.4.1

Gregory Trubetskoy grisha at modpython.org
Mon Aug 14 08:36:09 EST 2000


Thanks Leonid. I still have your original -OO patch in my INBOX and I'll
make sure to apply it.

Question - are you sure ap_get_client_block() doesn't take care of short
reads?

Thanks!

--
  Gregory (Grisha) Trubetskoy
       grisha at modpython.org

On Fri, 11 Aug 2000, Dr. L.A. Timochouk wrote:

> Hello All,
> 
> Please find attached a patch for mod_python-2.4.1. It addresses two issues:
> 
> (1) The current implementation of "req_read" method seems to contain a bug
>     (or a problematic feature?): it may return less bytes than was requested,
>     due to a known sockets phenomenon called "short read". Namely, a single
>     "read" on a TCP socket returns data ONLY up to the end of the current
>     IP packet; several "read"s may be required to get the whole amount
>     requested. The current implementation did not guard against that; on the
>     contrary, it shrank the output buffer is less-than-expected bytes were
>     received. In particular, this may result in incomplete receiving of POSTed
>     data (the problem shows up on large submissions only). The proposed
>     patch fixes it.
> 
> (2) A new Apache directive,
> 
>     PythonOptimize On|Off
> 
>     is implemented. If set, it allows us to run the interpreter in the
>     fully-optimising mode (equivalent to -OO Python command-line argument)
>     which may be useful for time-critical applications.
> 
> Best regards,
> 
> Dr. Leonid Timochouk
> Computing Laboratory
> University of Kent at Canterbury
> England
> ===============================================================================
> 
> --- mod_python.c.orig	Tue Jul  4 18:49:31 2000
> +++ mod_python.c	Sun Jul 23 16:39:55 2000
> @@ -1277,7 +1277,7 @@
>  static PyObject * req_read(requestobject *self, PyObject *args)
>  {
>  
> -    int len, rc, bytes_read;
> +    int len, rc, bytes_read, chunk_len;
>      char *buffer;
>      PyObject *result;
>  
> @@ -1316,13 +1316,18 @@
>  	return NULL;
>  
>      /* read it in */
> +    /* BEWARE of short reads!  */
>      buffer = PyString_AS_STRING((PyStringObject *) result);
> -    bytes_read = ap_get_client_block(self->request_rec, buffer, len);
> -
> -    /* resize if necessary */
> -    if (bytes_read < len) 
> -	if(_PyString_Resize(&result, bytes_read))
> +    bytes_read = 0;
> +    while (bytes_read < len)
> +    {
> +	chunk_len = ap_get_client_block
> +		    (self->request_rec, buffer+bytes_read, len-bytes_read);
> +	if  (chunk_len == 0)
> +	    /* Connection closed -- it's better not to return anything */
>  	    return NULL;
> +    	bytes_read += chunk_len;
> +    }
>  
>      return result;
>  }
> @@ -2087,6 +2092,19 @@
>  }
>  
>  /**
> + ** directive_PythonOptimize
> + **
> + *	This function called whenever PythonOptimize directive
> + *	is encountered.
> + */
> +static const char *directive_PythonOptimize(cmd_parms *cmd, void *mconfig,
> +					    int val) {
> +    if (val)
> +	Py_OptimizeFlag = 2; /* Optimize and remove function descr strings */
> +    return NULL;
> +}
> +
> +/**
>   ** directive_PythonInterpPerDirectory
>   **
>   *      This function called whenever PythonInterpPerDirectory directive
> @@ -2409,6 +2427,14 @@
>  	OR_ALL,                         
>  	FLAG,                               
>  	"Send (most) Python error output to the client rather than logfile."
> +    },
> +    {
> +	"PythonOptimize",
> +	directive_PythonOptimize,
> +	NULL,
> +	OR_ALL,
> +	FLAG,
> +	"Set the equivalent of the -O command-line flag on the interpreter."
>      },
>      {
>  	"PythonNoReload",                 
> 
> 
> _______________________________________________
> Mod_python mailing list
> Mod_python at modpython.org
> http://www.modpython.org/mailman/listinfo/mod_python
> 




More information about the Mod_python mailing list