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 >
|