ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Handle.pm
(Generate patch)

Comparing AnyEvent/lib/AnyEvent/Handle.pm (file contents):
Revision 1.149 by root, Thu Jul 16 03:48:33 2009 UTC vs.
Revision 1.151 by root, Thu Jul 16 04:20:23 2009 UTC

26 my $cv = AnyEvent->condvar; 26 my $cv = AnyEvent->condvar;
27 27
28 my $hdl; $hdl = new AnyEvent::Handle 28 my $hdl; $hdl = new AnyEvent::Handle
29 fh => \*STDIN, 29 fh => \*STDIN,
30 on_error => sub { 30 on_error => sub {
31 my ($hdl, $fatal, $msg) = @_;
31 warn "got error $_[2]\n"; 32 warn "got error $msg\n";
33 $hdl->destroy;
32 $cv->send; 34 $cv->send;
33 ); 35 );
34 36
35 # send some request line 37 # send some request line
36 $hdl->push_write ("getinfo\015\012"); 38 $hdl->push_write ("getinfo\015\012");
80 82
81=item on_eof => $cb->($handle) 83=item on_eof => $cb->($handle)
82 84
83Set the callback to be called when an end-of-file condition is detected, 85Set the callback to be called when an end-of-file condition is detected,
84i.e. in the case of a socket, when the other side has closed the 86i.e. in the case of a socket, when the other side has closed the
85connection cleanly. 87connection cleanly, and there are no outstanding read requests in the
88queue (if there are read requests, then an EOF counts as an unexpected
89connection close and will be flagged as an error).
86 90
87For sockets, this just means that the other side has stopped sending data, 91For sockets, this just means that the other side has stopped sending data,
88you can still try to write data, and, in fact, one can return from the EOF 92you can still try to write data, and, in fact, one can return from the EOF
89callback and continue writing data, as only the read part has been shut 93callback and continue writing data, as only the read part has been shut
90down. 94down.
91
92While not mandatory, it is I<highly> recommended to set an EOF callback,
93otherwise you might end up with a closed socket while you are still
94waiting for data.
95 95
96If an EOF condition has been detected but no C<on_eof> callback has been 96If an EOF condition has been detected but no C<on_eof> callback has been
97set, then a fatal error will be raised with C<$!> set to <0>. 97set, then a fatal error will be raised with C<$!> set to <0>.
98 98
99=item on_error => $cb->($handle, $fatal, $message) 99=item on_error => $cb->($handle, $fatal, $message)
140 140
141When an EOF condition is detected then AnyEvent::Handle will first try to 141When an EOF condition is detected then AnyEvent::Handle will first try to
142feed all the remaining data to the queued callbacks and C<on_read> before 142feed all the remaining data to the queued callbacks and C<on_read> before
143calling the C<on_eof> callback. If no progress can be made, then a fatal 143calling the C<on_eof> callback. If no progress can be made, then a fatal
144error will be raised (with C<$!> set to C<EPIPE>). 144error will be raised (with C<$!> set to C<EPIPE>).
145
146Note that, unlike requests in the read queue, an C<on_read> callback
147doesn't mean you I<require> some data: if there is an EOF and there
148are outstanding read requests then an error will be flagged. With an
149C<on_read> callback, the C<on_eof> callback will be invoked.
145 150
146=item on_drain => $cb->($handle) 151=item on_drain => $cb->($handle)
147 152
148This sets the callback that is called when the write buffer becomes empty 153This sets the callback that is called when the write buffer becomes empty
149(or when the callback is set and the buffer is empty already). 154(or when the callback is set and the buffer is empty already).
385 $! = $errno; 390 $! = $errno;
386 $message ||= "$!"; 391 $message ||= "$!";
387 392
388 if ($self->{on_error}) { 393 if ($self->{on_error}) {
389 $self->{on_error}($self, $fatal, $message); 394 $self->{on_error}($self, $fatal, $message);
390 $self->destroy; 395 $self->destroy if $fatal;
391 } elsif ($self->{fh}) { 396 } elsif ($self->{fh}) {
392 $self->destroy; 397 $self->destroy;
393 Carp::croak "AnyEvent::Handle uncaught error: $message"; 398 Carp::croak "AnyEvent::Handle uncaught error: $message";
394 } 399 }
395} 400}
512 $self->{_activity} = $NOW; 517 $self->{_activity} = $NOW;
513 518
514 if ($self->{on_timeout}) { 519 if ($self->{on_timeout}) {
515 $self->{on_timeout}($self); 520 $self->{on_timeout}($self);
516 } else { 521 } else {
517 $self->_error (&Errno::ETIMEDOUT); 522 $self->_error (Errno::ETIMEDOUT);
518 } 523 }
519 524
520 # callback could have changed timeout value, optimise 525 # callback could have changed timeout value, optimise
521 return unless $self->{timeout}; 526 return unless $self->{timeout};
522 527
864 869
865 if ( 870 if (
866 defined $self->{rbuf_max} 871 defined $self->{rbuf_max}
867 && $self->{rbuf_max} < length $self->{rbuf} 872 && $self->{rbuf_max} < length $self->{rbuf}
868 ) { 873 ) {
869 $self->_error (&Errno::ENOSPC, 1), return; 874 $self->_error (Errno::ENOSPC, 1), return;
870 } 875 }
871 876
872 while () { 877 while () {
873 # we need to use a separate tls read buffer, as we must not receive data while 878 # we need to use a separate tls read buffer, as we must not receive data while
874 # we are draining the buffer, and this can only happen with TLS. 879 # we are draining the buffer, and this can only happen with TLS.
878 883
879 if (my $cb = shift @{ $self->{_queue} }) { 884 if (my $cb = shift @{ $self->{_queue} }) {
880 unless ($cb->($self)) { 885 unless ($cb->($self)) {
881 if ($self->{_eof}) { 886 if ($self->{_eof}) {
882 # no progress can be made (not enough data and no data forthcoming) 887 # no progress can be made (not enough data and no data forthcoming)
883 $self->_error (&Errno::EPIPE, 1), return; 888 $self->_error (Errno::EPIPE, 1), return;
884 } 889 }
885 890
886 unshift @{ $self->{_queue} }, $cb; 891 unshift @{ $self->{_queue} }, $cb;
887 last; 892 last;
888 } 893 }
896 && !@{ $self->{_queue} } # and the queue is still empty 901 && !@{ $self->{_queue} } # and the queue is still empty
897 && $self->{on_read} # but we still have on_read 902 && $self->{on_read} # but we still have on_read
898 ) { 903 ) {
899 # no further data will arrive 904 # no further data will arrive
900 # so no progress can be made 905 # so no progress can be made
901 $self->_error (&Errno::EPIPE, 1), return 906 $self->_error (Errno::EPIPE, 1), return
902 if $self->{_eof}; 907 if $self->{_eof};
903 908
904 last; # more data might arrive 909 last; # more data might arrive
905 } 910 }
906 } else { 911 } else {
1156 return 1; 1161 return 1;
1157 } 1162 }
1158 1163
1159 # reject 1164 # reject
1160 if ($reject && $$rbuf =~ $reject) { 1165 if ($reject && $$rbuf =~ $reject) {
1161 $self->_error (&Errno::EBADMSG); 1166 $self->_error (Errno::EBADMSG);
1162 } 1167 }
1163 1168
1164 # skip 1169 # skip
1165 if ($skip && $$rbuf =~ $skip) { 1170 if ($skip && $$rbuf =~ $skip) {
1166 $data .= substr $$rbuf, 0, $+[0], ""; 1171 $data .= substr $$rbuf, 0, $+[0], "";
1182 my ($self, $cb) = @_; 1187 my ($self, $cb) = @_;
1183 1188
1184 sub { 1189 sub {
1185 unless ($_[0]{rbuf} =~ s/^(0|[1-9][0-9]*)://) { 1190 unless ($_[0]{rbuf} =~ s/^(0|[1-9][0-9]*)://) {
1186 if ($_[0]{rbuf} =~ /[^0-9]/) { 1191 if ($_[0]{rbuf} =~ /[^0-9]/) {
1187 $self->_error (&Errno::EBADMSG); 1192 $self->_error (Errno::EBADMSG);
1188 } 1193 }
1189 return; 1194 return;
1190 } 1195 }
1191 1196
1192 my $len = $1; 1197 my $len = $1;
1195 my $string = $_[1]; 1200 my $string = $_[1];
1196 $_[0]->unshift_read (chunk => 1, sub { 1201 $_[0]->unshift_read (chunk => 1, sub {
1197 if ($_[1] eq ",") { 1202 if ($_[1] eq ",") {
1198 $cb->($_[0], $string); 1203 $cb->($_[0], $string);
1199 } else { 1204 } else {
1200 $self->_error (&Errno::EBADMSG); 1205 $self->_error (Errno::EBADMSG);
1201 } 1206 }
1202 }); 1207 });
1203 }); 1208 });
1204 1209
1205 1 1210 1
1295 $json->incr_skip; 1300 $json->incr_skip;
1296 1301
1297 $self->{rbuf} = $json->incr_text; 1302 $self->{rbuf} = $json->incr_text;
1298 $json->incr_text = ""; 1303 $json->incr_text = "";
1299 1304
1300 $self->_error (&Errno::EBADMSG); 1305 $self->_error (Errno::EBADMSG);
1301 1306
1302 () 1307 ()
1303 } else { 1308 } else {
1304 $self->{rbuf} = ""; 1309 $self->{rbuf} = "";
1305 1310
1342 # read remaining chunk 1347 # read remaining chunk
1343 $_[0]->unshift_read (chunk => $len, sub { 1348 $_[0]->unshift_read (chunk => $len, sub {
1344 if (my $ref = eval { Storable::thaw ($_[1]) }) { 1349 if (my $ref = eval { Storable::thaw ($_[1]) }) {
1345 $cb->($_[0], $ref); 1350 $cb->($_[0], $ref);
1346 } else { 1351 } else {
1347 $self->_error (&Errno::EBADMSG); 1352 $self->_error (Errno::EBADMSG);
1348 } 1353 }
1349 }); 1354 });
1350 } 1355 }
1351 1356
1352 1 1357 1
1450 if ($self->{_on_starttls}) { 1455 if ($self->{_on_starttls}) {
1451 (delete $self->{_on_starttls})->($self, undef, $err); 1456 (delete $self->{_on_starttls})->($self, undef, $err);
1452 &_freetls; 1457 &_freetls;
1453 } else { 1458 } else {
1454 &_freetls; 1459 &_freetls;
1455 $self->_error (&Errno::EPROTO, 1, $err); 1460 $self->_error (Errno::EPROTO, 1, $err);
1456 } 1461 }
1457} 1462}
1458 1463
1459# poll the write BIO and send the data if applicable 1464# poll the write BIO and send the data if applicable
1460# also decode read data if possible 1465# also decode read data if possible

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines