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.72 by root, Wed Jul 16 21:17:59 2008 UTC vs.
Revision 1.80 by root, Sun Jul 27 08:43:32 2008 UTC

1package AnyEvent::Handle; 1package AnyEvent::Handle;
2 2
3no warnings; 3no warnings;
4use strict; 4use strict qw(subs vars);
5 5
6use AnyEvent (); 6use AnyEvent ();
7use AnyEvent::Util qw(WSAEWOULDBLOCK); 7use AnyEvent::Util qw(WSAEWOULDBLOCK);
8use Scalar::Util (); 8use Scalar::Util ();
9use Carp (); 9use Carp ();
14 14
15AnyEvent::Handle - non-blocking I/O on file handles via AnyEvent 15AnyEvent::Handle - non-blocking I/O on file handles via AnyEvent
16 16
17=cut 17=cut
18 18
19our $VERSION = 4.21; 19our $VERSION = 4.22;
20 20
21=head1 SYNOPSIS 21=head1 SYNOPSIS
22 22
23 use AnyEvent; 23 use AnyEvent;
24 use AnyEvent::Handle; 24 use AnyEvent::Handle;
75NOTE: The filehandle will be set to non-blocking (using 75NOTE: The filehandle will be set to non-blocking (using
76AnyEvent::Util::fh_nonblocking). 76AnyEvent::Util::fh_nonblocking).
77 77
78=item on_eof => $cb->($handle) 78=item on_eof => $cb->($handle)
79 79
80Set the callback to be called when an end-of-file condition is detcted, 80Set the callback to be called when an end-of-file condition is detected,
81i.e. in the case of a socket, when the other side has closed the 81i.e. in the case of a socket, when the other side has closed the
82connection cleanly. 82connection cleanly.
83 83
84While not mandatory, it is highly recommended to set an eof callback, 84While not mandatory, it is I<highly> recommended to set an eof callback,
85otherwise you might end up with a closed socket while you are still 85otherwise you might end up with a closed socket while you are still
86waiting for data. 86waiting for data.
87
88If an EOF condition has been detected but no C<on_eof> callback has been
89set, then a fatal error will be raised with C<$!> set to <0>.
87 90
88=item on_error => $cb->($handle, $fatal) 91=item on_error => $cb->($handle, $fatal)
89 92
90This is the error callback, which is called when, well, some error 93This is the error callback, which is called when, well, some error
91occured, such as not being able to resolve the hostname, failure to 94occured, such as not being able to resolve the hostname, failure to
225You can also provide your own TLS connection object, but you have 228You can also provide your own TLS connection object, but you have
226to make sure that you call either C<Net::SSLeay::set_connect_state> 229to make sure that you call either C<Net::SSLeay::set_connect_state>
227or C<Net::SSLeay::set_accept_state> on it before you pass it to 230or C<Net::SSLeay::set_accept_state> on it before you pass it to
228AnyEvent::Handle. 231AnyEvent::Handle.
229 232
230See the C<starttls> method if you need to start TLs negotiation later. 233See the C<starttls> method if you need to start TLS negotiation later.
231 234
232=item tls_ctx => $ssl_ctx 235=item tls_ctx => $ssl_ctx
233 236
234Use the given Net::SSLeay::CTX object to create the new TLS connection 237Use the given Net::SSLeay::CTX object to create the new TLS connection
235(unless a connection object was specified directly). If this parameter is 238(unless a connection object was specified directly). If this parameter is
730 ) { 733 ) {
731 return $self->_error (&Errno::ENOSPC, 1); 734 return $self->_error (&Errno::ENOSPC, 1);
732 } 735 }
733 736
734 while () { 737 while () {
735 no strict 'refs';
736
737 my $len = length $self->{rbuf}; 738 my $len = length $self->{rbuf};
738 739
739 if (my $cb = shift @{ $self->{_queue} }) { 740 if (my $cb = shift @{ $self->{_queue} }) {
740 unless ($cb->($self)) { 741 unless ($cb->($self)) {
741 if ($self->{_eof}) { 742 if ($self->{_eof}) {
768 delete $self->{_rw}; 769 delete $self->{_rw};
769 last; 770 last;
770 } 771 }
771 } 772 }
772 773
774 if ($self->{_eof}) {
775 if ($self->{on_eof}) {
773 $self->{on_eof}($self) 776 $self->{on_eof}($self)
774 if $self->{_eof} && $self->{on_eof}; 777 } else {
778 $self->_error (0, 1);
779 }
780 }
775 781
776 # may need to restart read watcher 782 # may need to restart read watcher
777 unless ($self->{_rw}) { 783 unless ($self->{_rw}) {
778 $self->start_read 784 $self->start_read
779 if $self->{on_read} || @{ $self->{_queue} }; 785 if $self->{on_read} || @{ $self->{_queue} };
905 $cb->($_[0], substr $_[0]{rbuf}, 0, $len, ""); 911 $cb->($_[0], substr $_[0]{rbuf}, 0, $len, "");
906 1 912 1
907 } 913 }
908}; 914};
909 915
910# compatibility with older API
911sub push_read_chunk {
912 $_[0]->push_read (chunk => $_[1], $_[2]);
913}
914
915sub unshift_read_chunk {
916 $_[0]->unshift_read (chunk => $_[1], $_[2]);
917}
918
919=item line => [$eol, ]$cb->($handle, $line, $eol) 916=item line => [$eol, ]$cb->($handle, $line, $eol)
920 917
921The callback will be called only once a full line (including the end of 918The callback will be called only once a full line (including the end of
922line marker, C<$eol>) has been read. This line (excluding the end of line 919line marker, C<$eol>) has been read. This line (excluding the end of line
923marker) will be passed to the callback as second argument (C<$line>), and 920marker) will be passed to the callback as second argument (C<$line>), and
938=cut 935=cut
939 936
940register_read_type line => sub { 937register_read_type line => sub {
941 my ($self, $cb, $eol) = @_; 938 my ($self, $cb, $eol) = @_;
942 939
943 $eol = qr|(\015?\012)| if @_ < 3; 940 if (@_ < 3) {
941 # this is more than twice as fast as the generic code below
942 sub {
943 $_[0]{rbuf} =~ s/^([^\015\012]*)(\015?\012)// or return;
944
945 $cb->($_[0], $1, $2);
946 1
947 }
948 } else {
944 $eol = quotemeta $eol unless ref $eol; 949 $eol = quotemeta $eol unless ref $eol;
945 $eol = qr|^(.*?)($eol)|s; 950 $eol = qr|^(.*?)($eol)|s;
946 951
947 sub { 952 sub {
948 $_[0]{rbuf} =~ s/$eol// or return; 953 $_[0]{rbuf} =~ s/$eol// or return;
949 954
950 $cb->($_[0], $1, $2); 955 $cb->($_[0], $1, $2);
956 1
951 1 957 }
952 } 958 }
953}; 959};
954
955# compatibility with older API
956sub push_read_line {
957 my $self = shift;
958 $self->push_read (line => @_);
959}
960
961sub unshift_read_line {
962 my $self = shift;
963 $self->unshift_read (line => @_);
964}
965 960
966=item regex => $accept[, $reject[, $skip], $cb->($handle, $data) 961=item regex => $accept[, $reject[, $skip], $cb->($handle, $data)
967 962
968Makes a regex match against the regex object C<$accept> and returns 963Makes a regex match against the regex object C<$accept> and returns
969everything up to and including the match. 964everything up to and including the match.
1090register_read_type packstring => sub { 1085register_read_type packstring => sub {
1091 my ($self, $cb, $format) = @_; 1086 my ($self, $cb, $format) = @_;
1092 1087
1093 sub { 1088 sub {
1094 # when we can use 5.10 we can use ".", but for 5.8 we use the re-pack method 1089 # when we can use 5.10 we can use ".", but for 5.8 we use the re-pack method
1095 defined (my $len = eval { unpack $format, $_[0]->{rbuf} }) 1090 defined (my $len = eval { unpack $format, $_[0]{rbuf} })
1096 or return; 1091 or return;
1097 1092
1093 $format = length pack $format, $len;
1094
1095 # bypass unshift if we already have the remaining chunk
1096 if ($format + $len <= length $_[0]{rbuf}) {
1097 my $data = substr $_[0]{rbuf}, $format, $len;
1098 substr $_[0]{rbuf}, 0, $format + $len, "";
1099 $cb->($_[0], $data);
1100 } else {
1098 # remove prefix 1101 # remove prefix
1099 substr $_[0]->{rbuf}, 0, (length pack $format, $len), ""; 1102 substr $_[0]{rbuf}, 0, $format, "";
1100 1103
1101 # read rest 1104 # read remaining chunk
1102 $_[0]->unshift_read (chunk => $len, $cb); 1105 $_[0]->unshift_read (chunk => $len, $cb);
1106 }
1103 1107
1104 1 1108 1
1105 } 1109 }
1106}; 1110};
1107 1111
1164 1168
1165 require Storable; 1169 require Storable;
1166 1170
1167 sub { 1171 sub {
1168 # when we can use 5.10 we can use ".", but for 5.8 we use the re-pack method 1172 # when we can use 5.10 we can use ".", but for 5.8 we use the re-pack method
1169 defined (my $len = eval { unpack "w", $_[0]->{rbuf} }) 1173 defined (my $len = eval { unpack "w", $_[0]{rbuf} })
1170 or return; 1174 or return;
1171 1175
1176 my $format = length pack "w", $len;
1177
1178 # bypass unshift if we already have the remaining chunk
1179 if ($format + $len <= length $_[0]{rbuf}) {
1180 my $data = substr $_[0]{rbuf}, $format, $len;
1181 substr $_[0]{rbuf}, 0, $format + $len, "";
1182 $cb->($_[0], Storable::thaw ($data));
1183 } else {
1172 # remove prefix 1184 # remove prefix
1173 substr $_[0]->{rbuf}, 0, (length pack "w", $len), ""; 1185 substr $_[0]{rbuf}, 0, $format, "";
1174 1186
1175 # read rest 1187 # read remaining chunk
1176 $_[0]->unshift_read (chunk => $len, sub { 1188 $_[0]->unshift_read (chunk => $len, sub {
1177 if (my $ref = eval { Storable::thaw ($_[1]) }) { 1189 if (my $ref = eval { Storable::thaw ($_[1]) }) {
1178 $cb->($_[0], $ref); 1190 $cb->($_[0], $ref);
1179 } else { 1191 } else {
1180 $self->_error (&Errno::EBADMSG); 1192 $self->_error (&Errno::EBADMSG);
1193 }
1181 } 1194 });
1182 }); 1195 }
1196
1197 1
1183 } 1198 }
1184}; 1199};
1185 1200
1186=back 1201=back
1187 1202
1448=over 4 1463=over 4
1449 1464
1450=item * all constructor arguments become object members. 1465=item * all constructor arguments become object members.
1451 1466
1452At least initially, when you pass a C<tls>-argument to the constructor it 1467At least initially, when you pass a C<tls>-argument to the constructor it
1453will end up in C<< $handle->{tls} >>. Those members might be changes or 1468will end up in C<< $handle->{tls} >>. Those members might be changed or
1454mutated later on (for example C<tls> will hold the TLS connection object). 1469mutated later on (for example C<tls> will hold the TLS connection object).
1455 1470
1456=item * other object member names are prefixed with an C<_>. 1471=item * other object member names are prefixed with an C<_>.
1457 1472
1458All object members not explicitly documented (internal use) are prefixed 1473All object members not explicitly documented (internal use) are prefixed

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines