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.241 by root, Fri Sep 5 22:17:26 2014 UTC vs.
Revision 1.252 by root, Fri Oct 18 20:12:16 2019 UTC

30 30
31 $cv->recv; 31 $cv->recv;
32 32
33=head1 DESCRIPTION 33=head1 DESCRIPTION
34 34
35This is a helper module to make it easier to do event-based I/O on 35This is a helper module to make it easier to do event-based I/O
36stream-based filehandles (sockets, pipes, and other stream things). 36on stream-based filehandles (sockets, pipes, and other stream
37things). Specifically, it doesn't work as expected on files, packet-based
38sockets or similar things.
37 39
38The L<AnyEvent::Intro> tutorial contains some well-documented 40The L<AnyEvent::Intro> tutorial contains some well-documented
39AnyEvent::Handle examples. 41AnyEvent::Handle examples.
40 42
41In the following, where the documentation refers to "bytes", it means 43In the following, where the documentation refers to "bytes", it means
53package AnyEvent::Handle; 55package AnyEvent::Handle;
54 56
55use Scalar::Util (); 57use Scalar::Util ();
56use List::Util (); 58use List::Util ();
57use Carp (); 59use Carp ();
58use Errno qw(EAGAIN EINTR); 60use Errno qw(EAGAIN EWOULDBLOCK EINTR);
59 61
60use AnyEvent (); BEGIN { AnyEvent::common_sense } 62use AnyEvent (); BEGIN { AnyEvent::common_sense }
61use AnyEvent::Util qw(WSAEWOULDBLOCK); 63use AnyEvent::Util qw(WSAEWOULDBLOCK);
62 64
63our $VERSION = $AnyEvent::VERSION; 65our $VERSION = $AnyEvent::VERSION;
91 93
92=item fh => $filehandle [C<fh> or C<connect> MANDATORY] 94=item fh => $filehandle [C<fh> or C<connect> MANDATORY]
93 95
94The filehandle this L<AnyEvent::Handle> object will operate on. 96The filehandle this L<AnyEvent::Handle> object will operate on.
95NOTE: The filehandle will be set to non-blocking mode (using 97NOTE: The filehandle will be set to non-blocking mode (using
96C<AnyEvent::Util::fh_nonblocking>) by the constructor and needs to stay in 98C<AnyEvent::fh_unblock>) by the constructor and needs to stay in
97that mode. 99that mode.
98 100
99=item connect => [$host, $service] [C<fh> or C<connect> MANDATORY] 101=item connect => [$host, $service] [C<fh> or C<connect> MANDATORY]
100 102
101Try to connect to the specified host and service (port), using 103Try to connect to the specified host and service (port), using
131 133
132The peer's numeric host and port (the socket peername) are passed as 134The peer's numeric host and port (the socket peername) are passed as
133parameters, together with a retry callback. At the time it is called the 135parameters, together with a retry callback. At the time it is called the
134read and write queues, EOF status, TLS status and similar properties of 136read and write queues, EOF status, TLS status and similar properties of
135the handle will have been reset. 137the handle will have been reset.
136
137It is not allowed to use the read or write queues while the handle object
138is connecting.
139 138
140If, for some reason, the handle is not acceptable, calling C<$retry> will 139If, for some reason, the handle is not acceptable, calling C<$retry> will
141continue with the next connection target (in case of multi-homed hosts or 140continue with the next connection target (in case of multi-homed hosts or
142SRV records there can be multiple connection endpoints). The C<$retry> 141SRV records there can be multiple connection endpoints). The C<$retry>
143callback can be invoked after the connect callback returns, i.e. one can 142callback can be invoked after the connect callback returns, i.e. one can
614 # with AnyEvent::Handle, do them a favour. 613 # with AnyEvent::Handle, do them a favour.
615 my $type = getsockopt $self->{fh}, Socket::SOL_SOCKET (), Socket::SO_TYPE (); 614 my $type = getsockopt $self->{fh}, Socket::SOL_SOCKET (), Socket::SO_TYPE ();
616 Carp::croak "AnyEvent::Handle: only stream sockets supported, anything else will NOT work!" 615 Carp::croak "AnyEvent::Handle: only stream sockets supported, anything else will NOT work!"
617 if Socket::SOCK_STREAM () != (unpack "I", $type) && defined $type; 616 if Socket::SOCK_STREAM () != (unpack "I", $type) && defined $type;
618 617
619 AnyEvent::Util::fh_nonblocking $self->{fh}, 1; 618 AnyEvent::fh_unblock $self->{fh};
620 619
621 $self->{_activity} = 620 $self->{_activity} =
622 $self->{_ractivity} = 621 $self->{_ractivity} =
623 $self->{_wactivity} = AE::now; 622 $self->{_wactivity} = AE::now;
624 623
756 $_[0]{oobinline} = $_[1]; 755 $_[0]{oobinline} = $_[1];
757 756
758 eval { 757 eval {
759 local $SIG{__DIE__}; 758 local $SIG{__DIE__};
760 setsockopt $_[0]{fh}, Socket::SOL_SOCKET (), Socket::SO_OOBINLINE (), int $_[1] 759 setsockopt $_[0]{fh}, Socket::SOL_SOCKET (), Socket::SO_OOBINLINE (), int $_[1]
761 if $_[0]{fh};
762 };
763}
764
765=item $handle->keepalive ($boolean)
766
767Enables or disables the C<keepalive> setting (see constructor argument of
768the same name for details).
769
770=cut
771
772sub keepalive {
773 $_[0]{keepalive} = $_[1];
774
775 eval {
776 local $SIG{__DIE__};
777 setsockopt $_[0]{fh}, Socket::SOL_SOCKET (), Socket::SO_KEEPALIVE (), int $_[1]
778 if $_[0]{fh}; 760 if $_[0]{fh};
779 }; 761 };
780} 762}
781 763
782=item $handle->on_starttls ($cb) 764=item $handle->on_starttls ($cb)
974 $self->{on_drain}($self) 956 $self->{on_drain}($self)
975 if $self->{low_water_mark} >= (length $self->{wbuf}) + (length $self->{_tls_wbuf}) 957 if $self->{low_water_mark} >= (length $self->{wbuf}) + (length $self->{_tls_wbuf})
976 && $self->{on_drain}; 958 && $self->{on_drain};
977 959
978 delete $self->{_ww} unless length $self->{wbuf}; 960 delete $self->{_ww} unless length $self->{wbuf};
979 } elsif ($! != EAGAIN && $! != EINTR && $! != WSAEWOULDBLOCK) { 961 } elsif ($! != EAGAIN && $! != EINTR && $! != EWOULDBLOCK && $! != WSAEWOULDBLOCK) {
980 $self->_error ($!, 1); 962 $self->_error ($!, 1);
981 } 963 }
982 }; 964 };
983 965
984 # try to write data immediately 966 # try to write data immediately
1573}; 1555};
1574 1556
1575=item regex => $accept[, $reject[, $skip], $cb->($handle, $data) 1557=item regex => $accept[, $reject[, $skip], $cb->($handle, $data)
1576 1558
1577Makes a regex match against the regex object C<$accept> and returns 1559Makes a regex match against the regex object C<$accept> and returns
1578everything up to and including the match. 1560everything up to and including the match. All the usual regex variables
1561($1, %+ etc.) from the regex match are available in the callback.
1579 1562
1580Example: read a single line terminated by '\n'. 1563Example: read a single line terminated by '\n'.
1581 1564
1582 $handle->push_read (regex => qr<\n>, sub { ... }); 1565 $handle->push_read (regex => qr<\n>, sub { ... });
1583 1566
1873is handled, up to the fictituous protocol 4.x (but both SSL3+ and 1856is handled, up to the fictituous protocol 4.x (but both SSL3+ and
1874SSL2-compatible framing is supported). 1857SSL2-compatible framing is supported).
1875 1858
1876If it detects that the input data is likely TLS, it calls the callback 1859If it detects that the input data is likely TLS, it calls the callback
1877with a true value for C<$detect> and the (on-wire) TLS version as second 1860with a true value for C<$detect> and the (on-wire) TLS version as second
1878and third argument (C<$major> is C<3>, and C<$minor> is 0..3 for SSL 1861and third argument (C<$major> is C<3>, and C<$minor> is 0..4 for SSL
18793.0, TLS 1.0, 1.1 and 1.2, respectively). If it detects the input to 18623.0, TLS 1.0, 1.1, 1.2 and 1.3, respectively). If it detects the input
1880be definitely not TLS, it calls the callback with a false value for 1863to be definitely not TLS, it calls the callback with a false value for
1881C<$detect>. 1864C<$detect>.
1882 1865
1883The callback could use this information to decide whether or not to start 1866The callback could use this information to decide whether or not to start
1884TLS negotiation. 1867TLS negotiation.
1885 1868
1895accomodate protocol changes. 1878accomodate protocol changes.
1896 1879
1897This read type does not rely on L<AnyEvent::TLS> (and thus, not on 1880This read type does not rely on L<AnyEvent::TLS> (and thus, not on
1898L<Net::SSLeay>). 1881L<Net::SSLeay>).
1899 1882
1900=item tls_autostart => $tls[, $tls_ctx] 1883=item tls_autostart => [$tls_ctx, ]$tls
1901 1884
1902Tries to detect a valid SSL or TLS handshake. If one is detected, it tries 1885Tries to detect a valid SSL or TLS handshake. If one is detected, it tries
1903to start tls by calling C<starttls> with the given arguments. 1886to start tls by calling C<starttls> with the given arguments.
1904 1887
1905In practise, C<$tls> must be C<accept>, or a Net::SSLeay context that has 1888In practise, C<$tls> must be C<accept>, or a Net::SSLeay context that has
1909See C<tls_detect> above for more details. 1892See C<tls_detect> above for more details.
1910 1893
1911Example: give the client a chance to start TLS before accepting a text 1894Example: give the client a chance to start TLS before accepting a text
1912line. 1895line.
1913 1896
1914 $hdl->push_read (tls_detect => "accept"); 1897 $hdl->push_read (tls_autostart => "accept");
1915 $hdl->push_read (line => sub { 1898 $hdl->push_read (line => sub {
1916 print "received ", ($_[0]{tls} ? "encrypted" : "cleartext"), " <$_[1]>\n"; 1899 print "received ", ($_[0]{tls} ? "encrypted" : "cleartext"), " <$_[1]>\n";
1917 }); 1900 });
1918 1901
1919=cut 1902=cut
1931 ) { 1914 ) {
1932 return if 3 != length $1; # partial match, can't decide yet 1915 return if 3 != length $1; # partial match, can't decide yet
1933 1916
1934 # full match, valid TLS record 1917 # full match, valid TLS record
1935 my ($major, $minor) = unpack "CC", $1; 1918 my ($major, $minor) = unpack "CC", $1;
1936 $cb->($self, "accept", $major + $minor * 0.1); 1919 $cb->($self, "accept", $major, $minor);
1937 } else { 1920 } else {
1938 # mismatch == guaranteed not TLS 1921 # mismatch == guaranteed not TLS
1939 $cb->($self, undef); 1922 $cb->($self, undef);
1940 } 1923 }
1941 1924
2041 } elsif (defined $len) { 2024 } elsif (defined $len) {
2042 delete $self->{_rw}; 2025 delete $self->{_rw};
2043 $self->{_eof} = 1; 2026 $self->{_eof} = 1;
2044 $self->_drain_rbuf; 2027 $self->_drain_rbuf;
2045 2028
2046 } elsif ($! != EAGAIN && $! != EINTR && $! != WSAEWOULDBLOCK) { 2029 } elsif ($! != EAGAIN && $! != EINTR && $! != EWOULDBLOCK && $! != WSAEWOULDBLOCK) {
2047 return $self->_error ($!, 1); 2030 return $self->_error ($!, 1);
2048 } 2031 }
2049 }; 2032 };
2050 } 2033 }
2051} 2034}
2210 $self->{tls} = $tls = $self->{tls_ctx}->_get_session ($tls, $self, $self->{peername}); 2193 $self->{tls} = $tls = $self->{tls_ctx}->_get_session ($tls, $self, $self->{peername});
2211 2194
2212 # basically, this is deep magic (because SSL_read should have the same issues) 2195 # basically, this is deep magic (because SSL_read should have the same issues)
2213 # but the openssl maintainers basically said: "trust us, it just works". 2196 # but the openssl maintainers basically said: "trust us, it just works".
2214 # (unfortunately, we have to hardcode constants because the abysmally misdesigned 2197 # (unfortunately, we have to hardcode constants because the abysmally misdesigned
2215 # and mismaintained ssleay-module doesn't even offer them). 2198 # and mismaintained ssleay-module didn't offer them for a decade or so).
2216 # http://www.mail-archive.com/openssl-dev@openssl.org/msg22420.html 2199 # http://www.mail-archive.com/openssl-dev@openssl.org/msg22420.html
2217 # 2200 #
2218 # in short: this is a mess. 2201 # in short: this is a mess.
2219 # 2202 #
2220 # note that we do not try to keep the length constant between writes as we are required to do. 2203 # note that we do not try to keep the length constant between writes as we are required to do.
2221 # we assume that most (but not all) of this insanity only applies to non-blocking cases, 2204 # we assume that most (but not all) of this insanity only applies to non-blocking cases,
2222 # and we drive openssl fully in blocking mode here. Or maybe we don't - openssl seems to 2205 # and we drive openssl fully in blocking mode here. Or maybe we don't - openssl seems to
2223 # have identity issues in that area. 2206 # have identity issues in that area.
2224# Net::SSLeay::CTX_set_mode ($ssl, 2207# Net::SSLeay::set_mode ($ssl,
2225# (eval { local $SIG{__DIE__}; Net::SSLeay::MODE_ENABLE_PARTIAL_WRITE () } || 1) 2208# (eval { local $SIG{__DIE__}; Net::SSLeay::MODE_ENABLE_PARTIAL_WRITE () } || 1)
2226# | (eval { local $SIG{__DIE__}; Net::SSLeay::MODE_ACCEPT_MOVING_WRITE_BUFFER () } || 2)); 2209# | (eval { local $SIG{__DIE__}; Net::SSLeay::MODE_ACCEPT_MOVING_WRITE_BUFFER () } || 2));
2227 Net::SSLeay::CTX_set_mode ($tls, 1|2); 2210 Net::SSLeay::set_mode ($tls, 1|2);
2228 2211
2229 $self->{_rbio} = Net::SSLeay::BIO_new (Net::SSLeay::BIO_s_mem ()); 2212 $self->{_rbio} = Net::SSLeay::BIO_new (Net::SSLeay::BIO_s_mem ());
2230 $self->{_wbio} = Net::SSLeay::BIO_new (Net::SSLeay::BIO_s_mem ()); 2213 $self->{_wbio} = Net::SSLeay::BIO_new (Net::SSLeay::BIO_s_mem ());
2231 2214
2232 Net::SSLeay::BIO_write ($self->{_rbio}, $self->{rbuf}); 2215 Net::SSLeay::BIO_write ($self->{_rbio}, $self->{rbuf});
2272 2255
2273 return unless $self->{tls}; 2256 return unless $self->{tls};
2274 2257
2275 $self->{tls_ctx}->_put_session (delete $self->{tls}) 2258 $self->{tls_ctx}->_put_session (delete $self->{tls})
2276 if $self->{tls} > 0; 2259 if $self->{tls} > 0;
2277 2260
2278 delete @$self{qw(_rbio _wbio _tls_wbuf _on_starttls)}; 2261 delete @$self{qw(_rbio _wbio _tls_wbuf _on_starttls)};
2279} 2262}
2280 2263
2281=item $handle->resettls 2264=item $handle->resettls
2282 2265
2307 push @linger, AE::io $fh, 1, sub { 2290 push @linger, AE::io $fh, 1, sub {
2308 my $len = syswrite $fh, $wbuf, length $wbuf; 2291 my $len = syswrite $fh, $wbuf, length $wbuf;
2309 2292
2310 if ($len > 0) { 2293 if ($len > 0) {
2311 substr $wbuf, 0, $len, ""; 2294 substr $wbuf, 0, $len, "";
2312 } elsif (defined $len || ($! != EAGAIN && $! != EINTR && $! != WSAEWOULDBLOCK)) { 2295 } elsif (defined $len || ($! != EAGAIN && $! != EINTR && $! != EWOULDBLOCK && $! != WSAEWOULDBLOCK)) {
2313 @linger = (); # end 2296 @linger = (); # end
2314 } 2297 }
2315 }; 2298 };
2316 push @linger, AE::timer $linger, 0, sub { 2299 push @linger, AE::timer $linger, 0, sub {
2317 @linger = (); 2300 @linger = ();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines