RE: Updating $r->connection->aborted before $r->print() ?
> -Original Message- > From: Joshua Chamas [mailto:[EMAIL PROTECTED]] > Sent: Friday, September 14, 2001 3:21 PM > To: Mod Perl > Subject: Updating $r->connection->aborted before $r->print() ? > > > Hey, > > In my own experience it seems that I can only get > $r->connection->aborted updated if I first do a $r->print(). > Is there any way to get aborted to update without > $r->print? my $fileno = $r->connection->fileno; $s = IO::Select->new($fileno); die "aborted" if grep { m/$fileno/ } $s->can_read(1); HTH --Geoff
Re: Updating $r->connection->aborted before $r->print() ?
Geoffrey Young wrote: > >>-Original Message- >>From: Joshua Chamas [mailto:[EMAIL PROTECTED]] >>Sent: Friday, September 14, 2001 3:21 PM >>To: Mod Perl >>Subject: Updating $r->connection->aborted before $r->print() ? >> >> >>Hey, >> >>In my own experience it seems that I can only get >>$r->connection->aborted updated if I first do a $r->print(). >>Is there any way to get aborted to update without >>$r->print? >> > > my $fileno = $r->connection->fileno; > > $s = IO::Select->new($fileno); > > die "aborted" if grep { m/$fileno/ } $s->can_read(1); Hmm, does this actually work Geoff? What happens if mod_perl is running as a back-end? In this case $r->connection->aborted doesn't work even if you print. Joshua, what about print "\0", I'm not sure whether this messes up the headers. given that you end these tests with a new line. _ Stas Bekman JAm_pH -- Just Another mod_perl Hacker http://stason.org/ mod_perl Guide http://perl.apache.org/guide mailto:[EMAIL PROTECTED] http://apachetoday.com http://eXtropia.com/ http://singlesheaven.com http://perl.apache.org http://perlmonth.com/
RE: Updating $r->connection->aborted before $r->print() ?
>> my $fileno = $r->connection->fileno; >> >> $s = IO::Select->new($fileno); >> >> die "aborted" if grep { m/$fileno/ } $s->can_read(1); > > >Hmm, does this actually work Geoff? What happens if mod_perl is running >as a back-end? In this case $r->connection->aborted doesn't work even if >you print. yes, it worked for me. actually, I guess I should have been clearer - this has nothing to do with $c->aborted or $r->print (well, on the outside anyway). for $c->aborted you have to wait for Apache to flush the print buffers. actually, in my tests $r->rflush didn't help things behave - only $|=1 did. $s->can_read should always work because Apache marks the client output file descriptor with a zero-length packet for reading when the client dies. so, when you can read from where you ought to be writing, you can assume a broken connection. at least this is my understanding. wish I could take credit, though - Eric discovered/documented this one a while ago:) at any rate, this worked for me just fine in some tests, but I never tested it against a front-end/back-end setup. seems like you would never be able to detect a broken client connection from in a proxy setup anyway, but that's not my area to comment on... --Geoff
RE: Updating $r->connection->aborted before $r->print() ?
On Sat, 15 Sep 2001, Geoffrey Young wrote: > >> my $fileno = $r->connection->fileno; > >> $s = IO::Select->new($fileno); > >> > >> die "aborted" if grep { m/$fileno/ } $s->can_read(1); > > >Hmm, does this actually work Geoff? What happens if mod_perl is running > >as a back-end? In this case $r->connection->aborted doesn't work even if > >you print. > > yes, it worked for me. actually, I guess I should have been clearer - this > has nothing to do with $c->aborted or $r->print (well, on the outside > anyway). for $c->aborted you have to wait for Apache to flush the print > buffers. actually, in my tests $r->rflush didn't help things behave - only > $|=1 did. > > $s->can_read should always work because Apache marks the client output file > descriptor with a zero-length packet for reading when the client dies. so, > when you can read from where you ought to be writing, you can assume a > broken connection. > > at least this is my understanding. wish I could take credit, though - Eric > discovered/documented this one a while ago:) cool! Somehow I've missed this patch. > at any rate, this worked for me just fine in some tests, but I never tested > it against a front-end/back-end setup. seems like you would never be able > to detect a broken client connection from in a proxy setup anyway, but > that's not my area to comment on... I'll give it a run when I get some time to play with it and update the guide appropriately. Thanks Geoff! _ Stas Bekman JAm_pH -- Just Another mod_perl Hacker http://stason.org/ mod_perl Guide http://perl.apache.org/guide mailto:[EMAIL PROTECTED] http://apachetoday.com http://eXtropia.com/ http://singlesheaven.com http://perl.apache.org http://perlmonth.com/
Re: Updating $r->connection->aborted before $r->print() ?
Geoffrey Young wrote: > > my $fileno = $r->connection->fileno; > > $s = IO::Select->new($fileno); > > die "aborted" if grep { m/$fileno/ } $s->can_read(1); > > HTH > Thanks for this. The code that I ended up using for Apache::ASP was: # IsClientConnected ? Might already be disconnected for busy site, if # a user hits stop/reload my $is_connected = 1; my $fileno = $r->connection->fileno; if(defined $fileno) { my $s = IO::Select->new($fileno); if($s->can_read(0)) { $is_connected = 0; } } The difference being the can_read(0) from can_read(1). The 1 would create an unnecessary wait of 1 second I found, whereas 0 does not, yet reports the aborted condition accurately. Thanks again! -- Josh _ Joshua Chamas Chamas Enterprises Inc. NodeWorks Founder Huntington Beach, CA USA http://www.nodeworks.com1-714-625-4051
Re: Updating $r->connection->aborted before $r->print() ?
Geoffrey Young wrote: > > yes, it worked for me. actually, I guess I should have been clearer - this > has nothing to do with $c->aborted or $r->print (well, on the outside > anyway). for $c->aborted you have to wait for Apache to flush the print > buffers. actually, in my tests $r->rflush didn't help things behave - only > $|=1 did. > Hey Geoff, for efficiency, my final code for detecting a client abort is: sub Apache::ASP::Response::IsClientConnected { ... # IsClientConnected ? Might already be disconnected for busy site, if # a user hits stop/reload my $conn = $self->{r}->connection; my $is_connected = $conn->aborted ? 0 : 1; if($is_connected) { my $fileno = $conn->fileno; if(defined $fileno) { my $s = IO::Select->new($fileno); $is_connected = $s->can_read(0) ? 0 : 1; } } where $self is the ASP object ... I looked at the IO::Select->new() and it looked pretty hairy, so I checked connection->aborted status first in case it was already set. -- Josh _ Joshua Chamas Chamas Enterprises Inc. NodeWorks Founder Huntington Beach, CA USA http://www.nodeworks.com1-714-625-4051
RE: Updating $r->connection->aborted before $r->print() ?
>Hey Geoff, for efficiency, my final code for detecting a client abort >is: [snip] >where $self is the ASP object ... I looked at the IO::Select->new() >and it looked pretty hairy, so I checked connection->aborted >status first in case it was already set. good idea. thanks for following up... --Geoff