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.228 by root, Mon Feb 6 00:17:26 2012 UTC vs.
Revision 1.234 by root, Wed Apr 18 09:44:10 2012 UTC

11 11
12 my $hdl; $hdl = new AnyEvent::Handle 12 my $hdl; $hdl = new AnyEvent::Handle
13 fh => \*STDIN, 13 fh => \*STDIN,
14 on_error => sub { 14 on_error => sub {
15 my ($hdl, $fatal, $msg) = @_; 15 my ($hdl, $fatal, $msg) = @_;
16 AE::log error => "got error $msg\n"; 16 AE::log error => $msg;
17 $hdl->destroy; 17 $hdl->destroy;
18 $cv->send; 18 $cv->send;
19 }; 19 };
20 20
21 # send some request line 21 # send some request line
170with active (but unsatisfiable) read watchers (C<EPIPE>) or I/O errors. In 170with active (but unsatisfiable) read watchers (C<EPIPE>) or I/O errors. In
171cases where the other side can close the connection at will, it is 171cases where the other side can close the connection at will, it is
172often easiest to not report C<EPIPE> errors in this callback. 172often easiest to not report C<EPIPE> errors in this callback.
173 173
174AnyEvent::Handle tries to find an appropriate error code for you to check 174AnyEvent::Handle tries to find an appropriate error code for you to check
175against, but in some cases (TLS errors), this does not work well. It is 175against, but in some cases (TLS errors), this does not work well.
176recommended to always output the C<$message> argument in human-readable 176
177error messages (it's usually the same as C<"$!">). 177If you report the error to the user, it is recommended to always output
178the C<$message> argument in human-readable error messages (you don't need
179to report C<"$!"> if you report C<$message>).
180
181If you want to react programmatically to the error, then looking at C<$!>
182and comparing it against some of the documented C<Errno> values is usually
183better than looking at the C<$message>.
178 184
179Non-fatal errors can be retried by returning, but it is recommended 185Non-fatal errors can be retried by returning, but it is recommended
180to simply ignore this parameter and instead abondon the handle object 186to simply ignore this parameter and instead abondon the handle object
181when this callback is invoked. Examples of non-fatal errors are timeouts 187when this callback is invoked. Examples of non-fatal errors are timeouts
182C<ETIMEDOUT>) or badly-formatted data (C<EBADMSG>). 188C<ETIMEDOUT>) or badly-formatted data (C<EBADMSG>).
230If an EOF condition has been detected but no C<on_eof> callback has been 236If an EOF condition has been detected but no C<on_eof> callback has been
231set, then a fatal error will be raised with C<$!> set to <0>. 237set, then a fatal error will be raised with C<$!> set to <0>.
232 238
233=item on_drain => $cb->($handle) 239=item on_drain => $cb->($handle)
234 240
235This sets the callback that is called when the write buffer becomes empty 241This sets the callback that is called once when the write buffer becomes
236(or immediately if the buffer is empty already). 242empty (and immediately when the handle object is created).
237 243
238To append to the write buffer, use the C<< ->push_write >> method. 244To append to the write buffer, use the C<< ->push_write >> method.
239 245
240This callback is useful when you don't want to put all of your write data 246This callback is useful when you don't want to put all of your write data
241into the queue at once, for example, when you want to write the contents 247into the queue at once, for example, when you want to write the contents
423appropriate error message. 429appropriate error message.
424 430
425TLS mode requires Net::SSLeay to be installed (it will be loaded 431TLS mode requires Net::SSLeay to be installed (it will be loaded
426automatically when you try to create a TLS handle): this module doesn't 432automatically when you try to create a TLS handle): this module doesn't
427have a dependency on that module, so if your module requires it, you have 433have a dependency on that module, so if your module requires it, you have
428to add the dependency yourself. 434to add the dependency yourself. If Net::SSLeay cannot be loaded or is too
435old, you get an C<EPROTO> error.
429 436
430Unlike TCP, TLS has a server and client side: for the TLS server side, use 437Unlike TCP, TLS has a server and client side: for the TLS server side, use
431C<accept>, and for the TLS client side of a connection, use C<connect> 438C<accept>, and for the TLS client side of a connection, use C<connect>
432mode. 439mode.
433 440
886 893
887The write queue is very simple: you can add data to its end, and 894The write queue is very simple: you can add data to its end, and
888AnyEvent::Handle will automatically try to get rid of it for you. 895AnyEvent::Handle will automatically try to get rid of it for you.
889 896
890When data could be written and the write buffer is shorter then the low 897When data could be written and the write buffer is shorter then the low
891water mark, the C<on_drain> callback will be invoked. 898water mark, the C<on_drain> callback will be invoked once.
892 899
893=over 4 900=over 4
894 901
895=item $handle->on_drain ($cb) 902=item $handle->on_drain ($cb)
896 903
1730 1737
1731 # bypass unshift if we already have the remaining chunk 1738 # bypass unshift if we already have the remaining chunk
1732 if ($format + $len <= length $_[0]{rbuf}) { 1739 if ($format + $len <= length $_[0]{rbuf}) {
1733 my $data = substr $_[0]{rbuf}, $format, $len; 1740 my $data = substr $_[0]{rbuf}, $format, $len;
1734 substr $_[0]{rbuf}, 0, $format + $len, ""; 1741 substr $_[0]{rbuf}, 0, $format + $len, "";
1742
1735 $cb->($_[0], Storable::thaw ($data)); 1743 eval { $cb->($_[0], Storable::thaw ($data)); 1 }
1744 or return $_[0]->_error (Errno::EBADMSG);
1736 } else { 1745 } else {
1737 # remove prefix 1746 # remove prefix
1738 substr $_[0]{rbuf}, 0, $format, ""; 1747 substr $_[0]{rbuf}, 0, $format, "";
1739 1748
1740 # read remaining chunk 1749 # read remaining chunk
1741 $_[0]->unshift_read (chunk => $len, sub { 1750 $_[0]->unshift_read (chunk => $len, sub {
1742 if (my $ref = eval { Storable::thaw ($_[1]) }) { 1751 eval { $cb->($_[0], Storable::thaw ($_[1])); 1 }
1743 $cb->($_[0], $ref);
1744 } else {
1745 $_[0]->_error (Errno::EBADMSG); 1752 or $_[0]->_error (Errno::EBADMSG);
1746 }
1747 }); 1753 });
1748 } 1754 }
1749 1755
1750 1 1756 1
1751 } 1757 }
1856 my ($self, $err) = @_; 1862 my ($self, $err) = @_;
1857 1863
1858 return $self->_error ($!, 1) 1864 return $self->_error ($!, 1)
1859 if $err == Net::SSLeay::ERROR_SYSCALL (); 1865 if $err == Net::SSLeay::ERROR_SYSCALL ();
1860 1866
1861 my $err =Net::SSLeay::ERR_error_string (Net::SSLeay::ERR_get_error ()); 1867 my $err = Net::SSLeay::ERR_error_string (Net::SSLeay::ERR_get_error ());
1862 1868
1863 # reduce error string to look less scary 1869 # reduce error string to look less scary
1864 $err =~ s/^error:[0-9a-fA-F]{8}:[^:]+:([^:]+):/\L$1: /; 1870 $err =~ s/^error:[0-9a-fA-F]{8}:[^:]+:([^:]+):/\L$1: /;
1865 1871
1866 if ($self->{_on_starttls}) { 1872 if ($self->{_on_starttls}) {
1932 1938
1933=item $handle->starttls ($tls[, $tls_ctx]) 1939=item $handle->starttls ($tls[, $tls_ctx])
1934 1940
1935Instead of starting TLS negotiation immediately when the AnyEvent::Handle 1941Instead of starting TLS negotiation immediately when the AnyEvent::Handle
1936object is created, you can also do that at a later time by calling 1942object is created, you can also do that at a later time by calling
1937C<starttls>. 1943C<starttls>. See the C<tls> constructor argument for general info.
1938 1944
1939Starting TLS is currently an asynchronous operation - when you push some 1945Starting TLS is currently an asynchronous operation - when you push some
1940write data and then call C<< ->starttls >> then TLS negotiation will start 1946write data and then call C<< ->starttls >> then TLS negotiation will start
1941immediately, after which the queued write data is then sent. 1947immediately, after which the queued write data is then sent. This might
1948change in future versions, so best make sure you have no outstanding write
1949data when calling this method.
1942 1950
1943The first argument is the same as the C<tls> constructor argument (either 1951The first argument is the same as the C<tls> constructor argument (either
1944C<"connect">, C<"accept"> or an existing Net::SSLeay object). 1952C<"connect">, C<"accept"> or an existing Net::SSLeay object).
1945 1953
1946The second argument is the optional C<AnyEvent::TLS> object that is used 1954The second argument is the optional C<AnyEvent::TLS> object that is used
1968 my ($self, $tls, $ctx) = @_; 1976 my ($self, $tls, $ctx) = @_;
1969 1977
1970 Carp::croak "It is an error to call starttls on an AnyEvent::Handle object while TLS is already active, caught" 1978 Carp::croak "It is an error to call starttls on an AnyEvent::Handle object while TLS is already active, caught"
1971 if $self->{tls}; 1979 if $self->{tls};
1972 1980
1981 unless (defined $AnyEvent::TLS::VERSION) {
1982 eval {
1983 require Net::SSLeay;
1984 require AnyEvent::TLS;
1985 1
1986 } or return $self->_error (Errno::EPROTO, 1, "TLS support not available on this system");
1987 }
1988
1973 $self->{tls} = $tls; 1989 $self->{tls} = $tls;
1974 $self->{tls_ctx} = $ctx if @_ > 2; 1990 $self->{tls_ctx} = $ctx if @_ > 2;
1975 1991
1976 return unless $self->{fh}; 1992 return unless $self->{fh};
1977 1993
1978 require Net::SSLeay;
1979
1980 $ERROR_SYSCALL = Net::SSLeay::ERROR_SYSCALL (); 1994 $ERROR_SYSCALL = Net::SSLeay::ERROR_SYSCALL ();
1981 $ERROR_WANT_READ = Net::SSLeay::ERROR_WANT_READ (); 1995 $ERROR_WANT_READ = Net::SSLeay::ERROR_WANT_READ ();
1982 1996
1983 $tls = delete $self->{tls}; 1997 $tls = delete $self->{tls};
1984 $ctx = $self->{tls_ctx}; 1998 $ctx = $self->{tls_ctx};
1985 1999
1986 local $Carp::CarpLevel = 1; # skip ourselves when creating a new context or session 2000 local $Carp::CarpLevel = 1; # skip ourselves when creating a new context or session
1987 2001
1988 if ("HASH" eq ref $ctx) { 2002 if ("HASH" eq ref $ctx) {
1989 require AnyEvent::TLS;
1990
1991 if ($ctx->{cache}) { 2003 if ($ctx->{cache}) {
1992 my $key = $ctx+0; 2004 my $key = $ctx+0;
1993 $ctx = $TLS_CACHE{$key} ||= new AnyEvent::TLS %$ctx; 2005 $ctx = $TLS_CACHE{$key} ||= new AnyEvent::TLS %$ctx;
1994 } else { 2006 } else {
1995 $ctx = new AnyEvent::TLS %$ctx; 2007 $ctx = new AnyEvent::TLS %$ctx;
2336C<low_water_mark> this will be called precisely when all data has been 2348C<low_water_mark> this will be called precisely when all data has been
2337written to the socket: 2349written to the socket:
2338 2350
2339 $handle->push_write (...); 2351 $handle->push_write (...);
2340 $handle->on_drain (sub { 2352 $handle->on_drain (sub {
2341 AE::log debug => "all data submitted to the kernel\n"; 2353 AE::log debug => "All data submitted to the kernel.";
2342 undef $handle; 2354 undef $handle;
2343 }); 2355 });
2344 2356
2345If you just want to queue some data and then signal EOF to the other side, 2357If you just want to queue some data and then signal EOF to the other side,
2346consider using C<< ->push_shutdown >> instead. 2358consider using C<< ->push_shutdown >> instead.
2430When you have intermediate CA certificates that your clients might not 2442When you have intermediate CA certificates that your clients might not
2431know about, just append them to the C<cert_file>. 2443know about, just append them to the C<cert_file>.
2432 2444
2433=back 2445=back
2434 2446
2435
2436=head1 SUBCLASSING AnyEvent::Handle 2447=head1 SUBCLASSING AnyEvent::Handle
2437 2448
2438In many cases, you might want to subclass AnyEvent::Handle. 2449In many cases, you might want to subclass AnyEvent::Handle.
2439 2450
2440To make this easier, a given version of AnyEvent::Handle uses these 2451To make this easier, a given version of AnyEvent::Handle uses these
2466 2477
2467Robin Redeker C<< <elmex at ta-sa.org> >>, Marc Lehmann <schmorp@schmorp.de>. 2478Robin Redeker C<< <elmex at ta-sa.org> >>, Marc Lehmann <schmorp@schmorp.de>.
2468 2479
2469=cut 2480=cut
2470 2481
24711; # End of AnyEvent::Handle 24821
2483

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines