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.160 by root, Fri Jul 24 22:47:04 2009 UTC vs.
Revision 1.173 by root, Thu Aug 6 13:45:04 2009 UTC

11 11
12AnyEvent::Handle - non-blocking I/O on file handles via AnyEvent 12AnyEvent::Handle - non-blocking I/O on file handles via AnyEvent
13 13
14=cut 14=cut
15 15
16our $VERSION = 4.86; 16our $VERSION = 4.91;
17 17
18=head1 SYNOPSIS 18=head1 SYNOPSIS
19 19
20 use AnyEvent; 20 use AnyEvent;
21 use AnyEvent::Handle; 21 use AnyEvent::Handle;
101attempted, but after the file handle has been created. It could be used to 101attempted, but after the file handle has been created. It could be used to
102prepare the file handle with parameters required for the actual connect 102prepare the file handle with parameters required for the actual connect
103(as opposed to settings that can be changed when the connection is already 103(as opposed to settings that can be changed when the connection is already
104established). 104established).
105 105
106The return value of this callback should be the connect timeout value in
107seconds (or C<0>, or C<undef>, or the empty list, to indicate the default
108timeout is to be used).
109
106=item on_connect => $cb->($handle, $host, $port, $retry->()) 110=item on_connect => $cb->($handle, $host, $port, $retry->())
107 111
108This callback is called when a connection has been successfully established. 112This callback is called when a connection has been successfully established.
109 113
110The actual numeric host and port (the socket peername) are passed as 114The actual numeric host and port (the socket peername) are passed as
444 } else { 448 } else {
445 if ($self->{on_connect_error}) { 449 if ($self->{on_connect_error}) {
446 $self->{on_connect_error}($self, "$!"); 450 $self->{on_connect_error}($self, "$!");
447 $self->destroy; 451 $self->destroy;
448 } else { 452 } else {
449 $self->fatal ($!, 1); 453 $self->_error ($!, 1);
450 } 454 }
451 } 455 }
452 }, 456 },
453 sub { 457 sub {
454 local $self->{fh} = $_[0]; 458 local $self->{fh} = $_[0];
455 459
460 $self->{on_prepare}
456 $self->{on_prepare}->($self) 461 ? $self->{on_prepare}->($self)
457 if $self->{on_prepare}; 462 : ()
458 } 463 }
459 ); 464 );
460 } 465 }
461 466
462 } else { 467 } else {
595 600
596=cut 601=cut
597 602
598sub on_starttls { 603sub on_starttls {
599 $_[0]{on_stoptls} = $_[1]; 604 $_[0]{on_stoptls} = $_[1];
605}
606
607=item $handle->rbuf_max ($max_octets)
608
609Configures the C<rbuf_max> setting (C<undef> disables it).
610
611=cut
612
613sub rbuf_max {
614 $_[0]{rbuf_max} = $_[1];
600} 615}
601 616
602############################################################################# 617#############################################################################
603 618
604=item $handle->timeout ($seconds) 619=item $handle->timeout ($seconds)
976 991
977sub _drain_rbuf { 992sub _drain_rbuf {
978 my ($self) = @_; 993 my ($self) = @_;
979 994
980 # avoid recursion 995 # avoid recursion
981 return if exists $self->{_skip_drain_rbuf}; 996 return if $self->{_skip_drain_rbuf};
982 local $self->{_skip_drain_rbuf} = 1; 997 local $self->{_skip_drain_rbuf} = 1;
983
984 if (
985 defined $self->{rbuf_max}
986 && $self->{rbuf_max} < length $self->{rbuf}
987 ) {
988 $self->_error (Errno::ENOSPC, 1), return;
989 }
990 998
991 while () { 999 while () {
992 # we need to use a separate tls read buffer, as we must not receive data while 1000 # we need to use a separate tls read buffer, as we must not receive data while
993 # we are draining the buffer, and this can only happen with TLS. 1001 # we are draining the buffer, and this can only happen with TLS.
994 $self->{rbuf} .= delete $self->{_tls_rbuf} if exists $self->{_tls_rbuf}; 1002 $self->{rbuf} .= delete $self->{_tls_rbuf}
1003 if exists $self->{_tls_rbuf};
995 1004
996 my $len = length $self->{rbuf}; 1005 my $len = length $self->{rbuf};
997 1006
998 if (my $cb = shift @{ $self->{_queue} }) { 1007 if (my $cb = shift @{ $self->{_queue} }) {
999 unless ($cb->($self)) { 1008 unless ($cb->($self)) {
1000 if ($self->{_eof}) { 1009 # no progress can be made
1001 # no progress can be made (not enough data and no data forthcoming) 1010 # (not enough data and no data forthcoming)
1002 $self->_error (Errno::EPIPE, 1), return; 1011 $self->_error (Errno::EPIPE, 1), return
1003 } 1012 if $self->{_eof};
1004 1013
1005 unshift @{ $self->{_queue} }, $cb; 1014 unshift @{ $self->{_queue} }, $cb;
1006 last; 1015 last;
1007 } 1016 }
1008 } elsif ($self->{on_read}) { 1017 } elsif ($self->{on_read}) {
1028 last; 1037 last;
1029 } 1038 }
1030 } 1039 }
1031 1040
1032 if ($self->{_eof}) { 1041 if ($self->{_eof}) {
1033 if ($self->{on_eof}) { 1042 $self->{on_eof}
1034 $self->{on_eof}($self) 1043 ? $self->{on_eof}($self)
1035 } else {
1036 $self->_error (0, 1, "Unexpected end-of-file"); 1044 : $self->_error (0, 1, "Unexpected end-of-file");
1037 } 1045
1046 return;
1047 }
1048
1049 if (
1050 defined $self->{rbuf_max}
1051 && $self->{rbuf_max} < length $self->{rbuf}
1052 ) {
1053 $self->_error (Errno::ENOSPC, 1), return;
1038 } 1054 }
1039 1055
1040 # may need to restart read watcher 1056 # may need to restart read watcher
1041 unless ($self->{_rw}) { 1057 unless ($self->{_rw}) {
1042 $self->start_read 1058 $self->start_read
1716 Net::SSLeay::CTX_set_mode ($tls, 1|2); 1732 Net::SSLeay::CTX_set_mode ($tls, 1|2);
1717 1733
1718 $self->{_rbio} = Net::SSLeay::BIO_new (Net::SSLeay::BIO_s_mem ()); 1734 $self->{_rbio} = Net::SSLeay::BIO_new (Net::SSLeay::BIO_s_mem ());
1719 $self->{_wbio} = Net::SSLeay::BIO_new (Net::SSLeay::BIO_s_mem ()); 1735 $self->{_wbio} = Net::SSLeay::BIO_new (Net::SSLeay::BIO_s_mem ());
1720 1736
1737 Net::SSLeay::BIO_write ($self->{_rbio}, delete $self->{rbuf});
1738
1721 Net::SSLeay::set_bio ($tls, $self->{_rbio}, $self->{_wbio}); 1739 Net::SSLeay::set_bio ($tls, $self->{_rbio}, $self->{_wbio});
1722 1740
1723 $self->{_on_starttls} = sub { $_[0]{on_starttls}(@_) } 1741 $self->{_on_starttls} = sub { $_[0]{on_starttls}(@_) }
1724 if $self->{on_starttls}; 1742 if $self->{on_starttls};
1725 1743
1754 my ($self) = @_; 1772 my ($self) = @_;
1755 1773
1756 return unless $self->{tls}; 1774 return unless $self->{tls};
1757 1775
1758 $self->{tls_ctx}->_put_session (delete $self->{tls}) 1776 $self->{tls_ctx}->_put_session (delete $self->{tls})
1759 if ref $self->{tls}; 1777 if $self->{tls} > 0;
1760 1778
1761 delete @$self{qw(_rbio _wbio _tls_wbuf _on_starttls)}; 1779 delete @$self{qw(_rbio _wbio _tls_wbuf _on_starttls)};
1762} 1780}
1763 1781
1764sub DESTROY { 1782sub DESTROY {
1791 1809
1792=item $handle->destroy 1810=item $handle->destroy
1793 1811
1794Shuts down the handle object as much as possible - this call ensures that 1812Shuts down the handle object as much as possible - this call ensures that
1795no further callbacks will be invoked and as many resources as possible 1813no further callbacks will be invoked and as many resources as possible
1796will be freed. You must not call any methods on the object afterwards. 1814will be freed. Any method you will call on the handle object after
1815destroying it in this way will be silently ignored (and it will return the
1816empty list).
1797 1817
1798Normally, you can just "forget" any references to an AnyEvent::Handle 1818Normally, you can just "forget" any references to an AnyEvent::Handle
1799object and it will simply shut down. This works in fatal error and EOF 1819object and it will simply shut down. This works in fatal error and EOF
1800callbacks, as well as code outside. It does I<NOT> work in a read or write 1820callbacks, as well as code outside. It does I<NOT> work in a read or write
1801callback, so when you want to destroy the AnyEvent::Handle object from 1821callback, so when you want to destroy the AnyEvent::Handle object from
1815sub destroy { 1835sub destroy {
1816 my ($self) = @_; 1836 my ($self) = @_;
1817 1837
1818 $self->DESTROY; 1838 $self->DESTROY;
1819 %$self = (); 1839 %$self = ();
1840 bless $self, "AnyEvent::Handle::destroyed";
1841}
1842
1843sub AnyEvent::Handle::destroyed::AUTOLOAD {
1844 #nop
1820} 1845}
1821 1846
1822=item AnyEvent::Handle::TLS_CTX 1847=item AnyEvent::Handle::TLS_CTX
1823 1848
1824This function creates and returns the AnyEvent::TLS object used by default 1849This function creates and returns the AnyEvent::TLS object used by default

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines