> On Fri, Jul 29, 2011 at 02:35, Tony Abo <t...@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 > > > >