httpd-modules-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Tony Abo <t...@hitech.com>
Subject RE: How to test if request has been aborted
Date Fri, 29 Jul 2011 22:02:59 GMT
> On Fri, Jul 29, 2011 at 02:35, Tony Abo <tabo@hitech.com> wrote:
> >> >>  I need to cut the processing short if the user decides to press
> the
> >> >>stop button on the browser. I cant seem to figure out how to test
> for
> >> >>that condition from inside the handler. Can anyone help me?
> >> >>
> >> >>
> >> >> Thanks in advance,
> >> >> Tony
> >> >
> >> > r->connection->aborted
> >> >
> >> > Cheers
> >> >
> >> > Tom
> >> Thanks Tom
> >>
> >> Will that value get updated asynchronously if the connection closes
> >> while my handler does its processing (I.e without calling any Apache
> >> functions)?
> >
> > My testing shows that connection->aborted is not being set
> asynchronously when the connection is closed by the client. I need one
> of the following:
> >
> > - Some Apache function I can call that will attempt to touch the open
> socket and either set connection->aborted or return an error status so I
> can know it is no longer connected.
> >
> > Or
> >
> > - Access to the actual socket buried somewhere in the connection
> structure. I can't seem to find it. If I had that, I could test it
> myself.
> 
> The earliest hook that is passed the socket is create_connection. The
> socket is passed in the third argument. Use apr_os_sock_get to get the
> OS-specific socket descriptor.
> 
> If you do not place your own callback on the create_connection hook in
> order to save the socket in your own structures, then you can use the
> method below, but it's a hack, as I guess the core_module structure is
> not supposed to be visible to modules. The method works after the
> pre_connection hook.
> 
> #define CORE_PRIVATE 1
> #include <http_core.h>
> apr_socket_t *sock = (apr_socket_t
> *)ap_get_module_config(r->connection->conn_config, &core_module);
> apr_os_sock_t fd; // int for Unix
> apr_os_sock_get(&fd, sock);
> #undef CORE_PRIVATE
> 
> 
Thanks Sorin, that works. I found another approach, but I'm not sure how safe it is.

int CheckConnected(request_rec r)
{
   int nSocket;
   char acBuffer[1];
   int nResult;
   core_net_rec *cnr = pConnID->pRequestRecord->connection->output_filters->ctx;

   if ( apr_os_sock_get( &nSocket, cnr->client_socket ) != APR_SUCCESS )
      return FALSE;
   nResult = recv( nSocket, acBuffer, 1, MSG_PEEK | MSG_DONTWAIT );
   return nResult > 0 || (nResult == -1 && errno == EWOULDBLOCK);
}

Any thoughts?

> >
> > Thanks again,
> > Tony
> >
> >


Mime
View raw message