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.233 by root, Thu Apr 5 06:14:10 2012 UTC vs.
Revision 1.240 by root, Tue Dec 17 16:43:15 2013 UTC

429appropriate error message. 429appropriate error message.
430 430
431TLS mode requires Net::SSLeay to be installed (it will be loaded 431TLS mode requires Net::SSLeay to be installed (it will be loaded
432automatically 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
433have 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
434to 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.
435 436
436Unlike 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
437C<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>
438mode. 439mode.
439 440
495callback. 496callback.
496 497
497This callback will only be called on TLS shutdowns, not when the 498This callback will only be called on TLS shutdowns, not when the
498underlying handle signals EOF. 499underlying handle signals EOF.
499 500
500=item json => JSON or JSON::XS object 501=item json => L<JSON>, L<JSON::PP> or L<JSON::XS> object
501 502
502This is the json coder object used by the C<json> read and write types. 503This is the json coder object used by the C<json> read and write types.
503 504
504If you don't supply it, then AnyEvent::Handle will create and use a 505If you don't supply it, then AnyEvent::Handle will create and use a
505suitable one (on demand), which will write and expect UTF-8 encoded JSON 506suitable one (on demand), which will write and expect UTF-8 encoded JSON
506texts. 507texts.
507 508
509=item cbor => L<CBOR::XS> object
510
511This is the cbor coder object used by the C<cbor> read and write types.
512
513If you don't supply it, then AnyEvent::Handle will create and use a
514suitable one (on demand), which will write CBOR without using extensions,
515if possible. texts.
516
508Note that you are responsible to depend on the JSON module if you want to 517Note that you are responsible to depend on the L<CBOR::XS> module if you
509use this functionality, as AnyEvent does not have a dependency itself. 518want to use this functionality, as AnyEvent does not have a dependency on
519it itself.
510 520
511=back 521=back
512 522
513=cut 523=cut
514 524
1052 1062
1053The generated JSON text is guaranteed not to contain any newlines: While 1063The generated JSON text is guaranteed not to contain any newlines: While
1054this module doesn't need delimiters after or between JSON texts to be 1064this module doesn't need delimiters after or between JSON texts to be
1055able to read them, many other languages depend on that. 1065able to read them, many other languages depend on that.
1056 1066
1057A simple RPC protocol that interoperates easily with others is to send 1067A simple RPC protocol that interoperates easily with other languages is
1058JSON arrays (or objects, although arrays are usually the better choice as 1068to send JSON arrays (or objects, although arrays are usually the better
1059they mimic how function argument passing works) and a newline after each 1069choice as they mimic how function argument passing works) and a newline
1060JSON text: 1070after each JSON text:
1061 1071
1062 $handle->push_write (json => ["method", "arg1", "arg2"]); # whatever 1072 $handle->push_write (json => ["method", "arg1", "arg2"]); # whatever
1063 $handle->push_write ("\012"); 1073 $handle->push_write ("\012");
1064 1074
1065An AnyEvent::Handle receiver would simply use the C<json> read type and 1075An AnyEvent::Handle receiver would simply use the C<json> read type and
1068 $handle->push_read (json => sub { my $array = $_[1]; ... }); 1078 $handle->push_read (json => sub { my $array = $_[1]; ... });
1069 1079
1070Other languages could read single lines terminated by a newline and pass 1080Other languages could read single lines terminated by a newline and pass
1071this line into their JSON decoder of choice. 1081this line into their JSON decoder of choice.
1072 1082
1083=item cbor => $perl_scalar
1084
1085Encodes the given scalar into a CBOR value. Unless you provide your own
1086L<CBOR::XS> object, this means it will be encoded to a CBOR string not
1087using any extensions, if possible.
1088
1089CBOR values are self-delimiting, so you can write CBOR at one end of
1090a handle and read them at the other end without using any additional
1091framing.
1092
1093A simple nd very very fast RPC protocol that interoperates with
1094other languages is to send CBOR and receive CBOR values (arrays are
1095recommended):
1096
1097 $handle->push_write (cbor => ["method", "arg1", "arg2"]); # whatever
1098
1099An AnyEvent::Handle receiver would simply use the C<cbor> read type:
1100
1101 $handle->push_read (cbor => sub { my $array = $_[1]; ... });
1102
1073=cut 1103=cut
1074 1104
1075sub json_coder() { 1105sub json_coder() {
1076 eval { require JSON::XS; JSON::XS->new->utf8 } 1106 eval { require JSON::XS; JSON::XS->new->utf8 }
1077 || do { require JSON; JSON->new->utf8 } 1107 || do { require JSON::PP; JSON::PP->new->utf8 }
1078} 1108}
1079 1109
1080register_write_type json => sub { 1110register_write_type json => sub {
1081 my ($self, $ref) = @_; 1111 my ($self, $ref) = @_;
1082 1112
1083 my $json = $self->{json} ||= json_coder; 1113 ($self->{json} ||= json_coder)
1084
1085 $json->encode ($ref) 1114 ->encode ($ref)
1115};
1116
1117sub cbor_coder() {
1118 require CBOR::XS;
1119 CBOR::XS->new
1120}
1121
1122register_write_type cbor => sub {
1123 my ($self, $scalar) = @_;
1124
1125 ($self->{cbor} ||= cbor_coder)
1126 ->encode ($scalar)
1086}; 1127};
1087 1128
1088=item storable => $reference 1129=item storable => $reference
1089 1130
1090Freezes the given reference using L<Storable> and writes it to the 1131Freezes the given reference using L<Storable> and writes it to the
1484 1525
1485register_read_type line => sub { 1526register_read_type line => sub {
1486 my ($self, $cb, $eol) = @_; 1527 my ($self, $cb, $eol) = @_;
1487 1528
1488 if (@_ < 3) { 1529 if (@_ < 3) {
1489 # this is more than twice as fast as the generic code below 1530 # this is faster then the generic code below
1490 sub { 1531 sub {
1491 $_[0]{rbuf} =~ s/^([^\015\012]*)(\015?\012)// or return; 1532 (my $pos = index $_[0]{rbuf}, "\012") >= 0
1533 or return;
1492 1534
1535 (my $str = substr $_[0]{rbuf}, 0, $pos + 1, "") =~ s/(\015?\012)\Z// or die;
1493 $cb->($_[0], "$1", "$2"); 1536 $cb->($_[0], $str, "$1");
1494 1 1537 1
1495 } 1538 }
1496 } else { 1539 } else {
1497 $eol = quotemeta $eol unless ref $eol; 1540 $eol = quotemeta $eol unless ref $eol;
1498 $eol = qr|^(.*?)($eol)|s; 1541 $eol = qr|^(.*?)($eol)|s;
1661=item json => $cb->($handle, $hash_or_arrayref) 1704=item json => $cb->($handle, $hash_or_arrayref)
1662 1705
1663Reads a JSON object or array, decodes it and passes it to the 1706Reads a JSON object or array, decodes it and passes it to the
1664callback. When a parse error occurs, an C<EBADMSG> error will be raised. 1707callback. When a parse error occurs, an C<EBADMSG> error will be raised.
1665 1708
1666If a C<json> object was passed to the constructor, then that will be used 1709If a C<json> object was passed to the constructor, then that will be
1667for the final decode, otherwise it will create a JSON coder expecting UTF-8. 1710used for the final decode, otherwise it will create a L<JSON::XS> or
1711L<JSON::PP> coder object expecting UTF-8.
1668 1712
1669This read type uses the incremental parser available with JSON version 1713This read type uses the incremental parser available with JSON version
16702.09 (and JSON::XS version 2.2) and above. You have to provide a 17142.09 (and JSON::XS version 2.2) and above.
1671dependency on your own: this module will load the JSON module, but
1672AnyEvent does not depend on it itself.
1673 1715
1674Since JSON texts are fully self-delimiting, the C<json> read and write 1716Since JSON texts are fully self-delimiting, the C<json> read and write
1675types are an ideal simple RPC protocol: just exchange JSON datagrams. See 1717types are an ideal simple RPC protocol: just exchange JSON datagrams. See
1676the C<json> write type description, above, for an actual example. 1718the C<json> write type description, above, for an actual example.
1677 1719
1681 my ($self, $cb) = @_; 1723 my ($self, $cb) = @_;
1682 1724
1683 my $json = $self->{json} ||= json_coder; 1725 my $json = $self->{json} ||= json_coder;
1684 1726
1685 my $data; 1727 my $data;
1686 my $rbuf = \$self->{rbuf};
1687 1728
1688 sub { 1729 sub {
1689 my $ref = eval { $json->incr_parse ($_[0]{rbuf}) }; 1730 my $ref = eval { $json->incr_parse ($_[0]{rbuf}) };
1690 1731
1691 if ($ref) { 1732 if ($ref) {
1705 1746
1706 () 1747 ()
1707 } else { 1748 } else {
1708 $_[0]{rbuf} = ""; 1749 $_[0]{rbuf} = "";
1709 1750
1751 ()
1752 }
1753 }
1754};
1755
1756=item cbor => $cb->($handle, $scalar)
1757
1758Reads a CBOR value, decodes it and passes it to the callback. When a parse
1759error occurs, an C<EBADMSG> error will be raised.
1760
1761If a L<CBOR::XS> object was passed to the constructor, then that will be
1762used for the final decode, otherwise it will create a CBOR coder without
1763enabling any options.
1764
1765You have to provide a dependency to L<CBOR::XS> on your own: this module
1766will load the L<CBOR::XS> module, but AnyEvent does not depend on it
1767itself.
1768
1769Since CBOR values are fully self-delimiting, the C<cbor> read and write
1770types are an ideal simple RPC protocol: just exchange CBOR datagrams. See
1771the C<cbor> write type description, above, for an actual example.
1772
1773=cut
1774
1775register_read_type cbor => sub {
1776 my ($self, $cb) = @_;
1777
1778 my $cbor = $self->{cbor} ||= cbor_coder;
1779
1780 my $data;
1781
1782 sub {
1783 my (@value) = eval { $cbor->incr_parse ($_[0]{rbuf}) };
1784
1785 if (@value) {
1786 $cb->($_[0], @value);
1787
1788 1
1789 } elsif ($@) {
1790 # error case
1791 $cbor->incr_reset;
1792
1793 $_[0]->_error (Errno::EBADMSG);
1794
1795 ()
1796 } else {
1710 () 1797 ()
1711 } 1798 }
1712 } 1799 }
1713}; 1800};
1714 1801
1752 }); 1839 });
1753 } 1840 }
1754 1841
1755 1 1842 1
1756 } 1843 }
1844};
1845
1846=item tls_detect => $cb->($handle, $detect, $major, $minor)
1847
1848Checks the input stream for a valid SSL or TLS handshake TLSPaintext
1849record without consuming anything. Only SSL version 3 or higher
1850is handled, up to the fictituous protocol 4.x (but both SSL3+ and
1851SSL2-compatible framing is supported).
1852
1853If it detects that the input data is likely TLS, it calls the callback
1854with a true value for C<$detect> and the (on-wire) TLS version as second
1855and third argument (C<$major> is C<3>, and C<$minor> is 0..3 for SSL
18563.0, TLS 1.0, 1.1 and 1.2, respectively). If it detects the input to
1857be definitely not TLS, it calls the callback with a false value for
1858C<$detect>.
1859
1860The callback could use this information to decide whether or not to start
1861TLS negotiation.
1862
1863In all cases the data read so far is passed to the following read
1864handlers.
1865
1866Usually you want to use the C<tls_autostart> read type instead.
1867
1868If you want to design a protocol that works in the presence of TLS
1869dtection, make sure that any non-TLS data doesn't start with the octet 22
1870(ASCII SYN, 16 hex) or 128-255 (i.e. highest bit set). The checks this
1871read type does are a bit more strict, but might losen in the future to
1872accomodate protocol changes.
1873
1874This read type does not rely on L<AnyEvent::TLS> (and thus, not on
1875L<Net::SSLeay>).
1876
1877=item tls_autostart => $tls[, $tls_ctx]
1878
1879Tries to detect a valid SSL or TLS handshake. If one is detected, it tries
1880to start tls by calling C<starttls> with the given arguments.
1881
1882In practise, C<$tls> must be C<accept>, or a Net::SSLeay context that has
1883been configured to accept, as servers do not normally send a handshake on
1884their own and ths cannot be detected in this way.
1885
1886See C<tls_detect> above for more details.
1887
1888Example: give the client a chance to start TLS before accepting a text
1889line.
1890
1891 $hdl->push_read (tls_detect => "accept");
1892 $hdl->push_read (line => sub {
1893 print "received ", ($_[0]{tls} ? "encrypted" : "cleartext"), " <$_[1]>\n";
1894 });
1895
1896=cut
1897
1898register_read_type tls_detect => sub {
1899 my ($self, $cb) = @_;
1900
1901 sub {
1902 # this regex matches a full or partial tls record
1903 if (
1904 # ssl3+: type(22=handshake) major(=3) minor(any) length_hi
1905 $self->{rbuf} =~ /^(?:\z| \x16 (\z| [\x03\x04] (?:\z| . (?:\z| [\x00-\x40] ))))/xs
1906 # ssl2 comapatible: len_hi len_lo type(1) major minor dummy(forlength)
1907 or $self->{rbuf} =~ /^(?:\z| [\x80-\xff] (?:\z| . (?:\z| \x01 (\z| [\x03\x04] (?:\z| . (?:\z| . ))))))/xs
1908 ) {
1909 return if 3 != length $1; # partial match, can't decide yet
1910
1911 # full match, valid TLS record
1912 my ($major, $minor) = unpack "CC", $1;
1913 $cb->($self, "accept", $major + $minor * 0.1);
1914 } else {
1915 # mismatch == guaranteed not TLS
1916 $cb->($self, undef);
1917 }
1918
1919 1
1920 }
1921};
1922
1923register_read_type tls_autostart => sub {
1924 my ($self, @tls) = @_;
1925
1926 $RH{tls_detect}($self, sub {
1927 return unless $_[1];
1928 $_[0]->starttls (@tls);
1929 })
1757}; 1930};
1758 1931
1759=back 1932=back
1760 1933
1761=item custom read types - Package::anyevent_read_type $handle, $cb, @args 1934=item custom read types - Package::anyevent_read_type $handle, $cb, @args
1885sub _dotls { 2058sub _dotls {
1886 my ($self) = @_; 2059 my ($self) = @_;
1887 2060
1888 my $tmp; 2061 my $tmp;
1889 2062
1890 if (length $self->{_tls_wbuf}) { 2063 while (length $self->{_tls_wbuf}) {
1891 while (($tmp = Net::SSLeay::write ($self->{tls}, $self->{_tls_wbuf})) > 0) { 2064 if (($tmp = Net::SSLeay::write ($self->{tls}, $self->{_tls_wbuf})) <= 0) {
1892 substr $self->{_tls_wbuf}, 0, $tmp, ""; 2065 $tmp = Net::SSLeay::get_error ($self->{tls}, $tmp);
2066
2067 return $self->_tls_error ($tmp)
2068 if $tmp != $ERROR_WANT_READ
2069 && ($tmp != $ERROR_SYSCALL || $!);
2070
2071 last;
1893 } 2072 }
1894 2073
1895 $tmp = Net::SSLeay::get_error ($self->{tls}, $tmp); 2074 substr $self->{_tls_wbuf}, 0, $tmp, "";
1896 return $self->_tls_error ($tmp)
1897 if $tmp != $ERROR_WANT_READ
1898 && ($tmp != $ERROR_SYSCALL || $!);
1899 } 2075 }
1900 2076
1901 while (defined ($tmp = Net::SSLeay::read ($self->{tls}))) { 2077 while (defined ($tmp = Net::SSLeay::read ($self->{tls}))) {
1902 unless (length $tmp) { 2078 unless (length $tmp) {
1903 $self->{_on_starttls} 2079 $self->{_on_starttls}
1917 $self->{_tls_rbuf} .= $tmp; 2093 $self->{_tls_rbuf} .= $tmp;
1918 $self->_drain_rbuf; 2094 $self->_drain_rbuf;
1919 $self->{tls} or return; # tls session might have gone away in callback 2095 $self->{tls} or return; # tls session might have gone away in callback
1920 } 2096 }
1921 2097
1922 $tmp = Net::SSLeay::get_error ($self->{tls}, -1); 2098 $tmp = Net::SSLeay::get_error ($self->{tls}, -1); # -1 is not neccessarily correct, but Net::SSLeay doesn't tell us
1923 return $self->_tls_error ($tmp) 2099 return $self->_tls_error ($tmp)
1924 if $tmp != $ERROR_WANT_READ 2100 if $tmp != $ERROR_WANT_READ
1925 && ($tmp != $ERROR_SYSCALL || $!); 2101 && ($tmp != $ERROR_SYSCALL || $!);
1926 2102
1927 while (length ($tmp = Net::SSLeay::BIO_read ($self->{_wbio}))) { 2103 while (length ($tmp = Net::SSLeay::BIO_read ($self->{_wbio}))) {
1937 2113
1938=item $handle->starttls ($tls[, $tls_ctx]) 2114=item $handle->starttls ($tls[, $tls_ctx])
1939 2115
1940Instead of starting TLS negotiation immediately when the AnyEvent::Handle 2116Instead of starting TLS negotiation immediately when the AnyEvent::Handle
1941object is created, you can also do that at a later time by calling 2117object is created, you can also do that at a later time by calling
1942C<starttls>. 2118C<starttls>. See the C<tls> constructor argument for general info.
1943 2119
1944Starting TLS is currently an asynchronous operation - when you push some 2120Starting TLS is currently an asynchronous operation - when you push some
1945write data and then call C<< ->starttls >> then TLS negotiation will start 2121write data and then call C<< ->starttls >> then TLS negotiation will start
1946immediately, after which the queued write data is then sent. 2122immediately, after which the queued write data is then sent. This might
2123change in future versions, so best make sure you have no outstanding write
2124data when calling this method.
1947 2125
1948The first argument is the same as the C<tls> constructor argument (either 2126The first argument is the same as the C<tls> constructor argument (either
1949C<"connect">, C<"accept"> or an existing Net::SSLeay object). 2127C<"connect">, C<"accept"> or an existing Net::SSLeay object).
1950 2128
1951The second argument is the optional C<AnyEvent::TLS> object that is used 2129The second argument is the optional C<AnyEvent::TLS> object that is used
1973 my ($self, $tls, $ctx) = @_; 2151 my ($self, $tls, $ctx) = @_;
1974 2152
1975 Carp::croak "It is an error to call starttls on an AnyEvent::Handle object while TLS is already active, caught" 2153 Carp::croak "It is an error to call starttls on an AnyEvent::Handle object while TLS is already active, caught"
1976 if $self->{tls}; 2154 if $self->{tls};
1977 2155
2156 unless (defined $AnyEvent::TLS::VERSION) {
2157 eval {
2158 require Net::SSLeay;
2159 require AnyEvent::TLS;
2160 1
2161 } or return $self->_error (Errno::EPROTO, 1, "TLS support not available on this system");
2162 }
2163
1978 $self->{tls} = $tls; 2164 $self->{tls} = $tls;
1979 $self->{tls_ctx} = $ctx if @_ > 2; 2165 $self->{tls_ctx} = $ctx if @_ > 2;
1980 2166
1981 return unless $self->{fh}; 2167 return unless $self->{fh};
1982 2168
1983 require Net::SSLeay;
1984
1985 $ERROR_SYSCALL = Net::SSLeay::ERROR_SYSCALL (); 2169 $ERROR_SYSCALL = Net::SSLeay::ERROR_SYSCALL ();
1986 $ERROR_WANT_READ = Net::SSLeay::ERROR_WANT_READ (); 2170 $ERROR_WANT_READ = Net::SSLeay::ERROR_WANT_READ ();
1987 2171
1988 $tls = delete $self->{tls}; 2172 $tls = delete $self->{tls};
1989 $ctx = $self->{tls_ctx}; 2173 $ctx = $self->{tls_ctx};
1990 2174
1991 local $Carp::CarpLevel = 1; # skip ourselves when creating a new context or session 2175 local $Carp::CarpLevel = 1; # skip ourselves when creating a new context or session
1992 2176
1993 if ("HASH" eq ref $ctx) { 2177 if ("HASH" eq ref $ctx) {
1994 require AnyEvent::TLS;
1995
1996 if ($ctx->{cache}) { 2178 if ($ctx->{cache}) {
1997 my $key = $ctx+0; 2179 my $key = $ctx+0;
1998 $ctx = $TLS_CACHE{$key} ||= new AnyEvent::TLS %$ctx; 2180 $ctx = $TLS_CACHE{$key} ||= new AnyEvent::TLS %$ctx;
1999 } else { 2181 } else {
2000 $ctx = new AnyEvent::TLS %$ctx; 2182 $ctx = new AnyEvent::TLS %$ctx;
2233handles requests until the server gets some QUIT command, causing it to 2415handles requests until the server gets some QUIT command, causing it to
2234close the connection first (highly desirable for a busy TCP server). A 2416close the connection first (highly desirable for a busy TCP server). A
2235client dropping the connection is an error, which means this variant can 2417client dropping the connection is an error, which means this variant can
2236detect an unexpected detection close. 2418detect an unexpected detection close.
2237 2419
2238To handle this case, always make sure you have a on-empty read queue, by 2420To handle this case, always make sure you have a non-empty read queue, by
2239pushing the "read request start" handler on it: 2421pushing the "read request start" handler on it:
2240 2422
2241 # we assume a request starts with a single line 2423 # we assume a request starts with a single line
2242 my @start_request; @start_request = (line => sub { 2424 my @start_request; @start_request = (line => sub {
2243 my ($hdl, $line) = @_; 2425 my ($hdl, $line) = @_;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines