Frank Meier wrote:
Hi
I'm working with a proprietary apache module which communicates (through
a socket) with another backend application (I have the C source code of
the module). I've now found out, when the client closes the http
connection during a request, the module does not "see" that the client
has disconnected. In some cases the request is just finished, but with
larger requests (larger amount of data from backend), the module keeps hanging in the ap_rwrite() or ap_rflush() function. This is only resolved if a timeout (default 300s, timeout directive in httpd.conf) occurs. I think the tx-buffer of the socket is filled and then the
write/flush function blocks.

I think if the client has gone away while httpd is trying to write() to it, httpd will immediately error out - probably with a "Broken Pipe" error.

Even if your socket write buffer is filled, the actual attempt to write() by your tcp stack must raise an error.

Maybe I am not understanding the problem properly. If the tcp connection is broken, attempts to read() or write() on that connection should flag a detectable error. It maybe possible that httpd is waiting too long to perform a write() and doesn't figure out fast enough that the remote end has gone away.

I can think of a *hack* to determine if the client has really gone away.
In your module you can possibly do

client = ap_filter_t->ctx->client_socket /* ap_filter_t is either the input or output filter stack */

to get the apr client socket. You can try do a 0-byte read() on this socket to see if you get an error. An error means the remote side has gone away. I have not tested this, I don't know if this will work for you.



srp
--
http://saju.net.in

Reply via email to