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.132 by elmex, Thu Jul 2 22:25:13 2009 UTC vs.
Revision 1.137 by root, Sat Jul 4 23:58:52 2009 UTC

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.45; 19our $VERSION = 4.452;
20 20
21=head1 SYNOPSIS 21=head1 SYNOPSIS
22 22
23 use AnyEvent; 23 use AnyEvent;
24 use AnyEvent::Handle; 24 use AnyEvent::Handle;
95waiting for data. 95waiting for data.
96 96
97If an EOF condition has been detected but no C<on_eof> callback has been 97If an EOF condition has been detected but no C<on_eof> callback has been
98set, then a fatal error will be raised with C<$!> set to <0>. 98set, then a fatal error will be raised with C<$!> set to <0>.
99 99
100=item on_error => $cb->($handle, $fatal) 100=item on_error => $cb->($handle, $fatal, $message)
101 101
102This is the error callback, which is called when, well, some error 102This is the error callback, which is called when, well, some error
103occured, such as not being able to resolve the hostname, failure to 103occured, such as not being able to resolve the hostname, failure to
104connect or a read error. 104connect or a read error.
105 105
107fatal errors the handle object will be shut down and will not be usable 107fatal errors the handle object will be shut down and will not be usable
108(but you are free to look at the current C<< ->rbuf >>). Examples of fatal 108(but you are free to look at the current C<< ->rbuf >>). Examples of fatal
109errors are an EOF condition with active (but unsatisifable) read watchers 109errors are an EOF condition with active (but unsatisifable) read watchers
110(C<EPIPE>) or I/O errors. 110(C<EPIPE>) or I/O errors.
111 111
112AnyEvent::Handle tries to find an appropriate error code for you to check
113against, but in some cases (TLS errors), this does not work well. It is
114recommended to always output the C<$message> argument in human-readable
115error messages (it's usually the same as C<"$!">).
116
112Non-fatal errors can be retried by simply returning, but it is recommended 117Non-fatal errors can be retried by simply returning, but it is recommended
113to simply ignore this parameter and instead abondon the handle object 118to simply ignore this parameter and instead abondon the handle object
114when this callback is invoked. Examples of non-fatal errors are timeouts 119when this callback is invoked. Examples of non-fatal errors are timeouts
115C<ETIMEDOUT>) or badly-formatted data (C<EBADMSG>). 120C<ETIMEDOUT>) or badly-formatted data (C<EBADMSG>).
116 121
117On callback entrance, the value of C<$!> contains the operating system 122On callback entrance, the value of C<$!> contains the operating system
118error (or C<ENOSPC>, C<EPIPE>, C<ETIMEDOUT> or C<EBADMSG>). 123error code (or C<ENOSPC>, C<EPIPE>, C<ETIMEDOUT>, C<EBADMSG> or
124C<EPROTO>).
119 125
120While not mandatory, it is I<highly> recommended to set this callback, as 126While not mandatory, it is I<highly> recommended to set this callback, as
121you will not be notified of errors otherwise. The default simply calls 127you will not be notified of errors otherwise. The default simply calls
122C<croak>. 128C<croak>.
123 129
237 243
238This will not work for partial TLS data that could not be encoded 244This will not work for partial TLS data that could not be encoded
239yet. This data will be lost. Calling the C<stoptls> method in time might 245yet. This data will be lost. Calling the C<stoptls> method in time might
240help. 246help.
241 247
242=item common_name => $string 248=item peername => $string
243 249
244The common name used by some verification methods (most notably SSL/TLS) 250A string used to identify the remote site - usually the DNS hostname
245associated with this connection. Usually this is the remote hostname used 251(I<not> IDN!) used to create the connection, rarely the IP address.
246to connect, but can be almost anything. 252
253Apart from being useful in error messages, this string is also used in TLS
254common name verification (see C<verify_cn> in L<AnyEvent::TLS>).
247 255
248=item tls => "accept" | "connect" | Net::SSLeay::SSL object 256=item tls => "accept" | "connect" | Net::SSLeay::SSL object
249 257
250When this parameter is given, it enables TLS (SSL) mode, that means 258When this parameter is given, it enables TLS (SSL) mode, that means
251AnyEvent will start a TLS handshake as soon as the conenction has been 259AnyEvent will start a TLS handshake as soon as the conenction has been
252established and will transparently encrypt/decrypt data afterwards. 260established and will transparently encrypt/decrypt data afterwards.
261
262All TLS protocol errors will be signalled as C<EPROTO>, with an
263appropriate error message.
253 264
254TLS mode requires Net::SSLeay to be installed (it will be loaded 265TLS mode requires Net::SSLeay to be installed (it will be loaded
255automatically when you try to create a TLS handle): this module doesn't 266automatically when you try to create a TLS handle): this module doesn't
256have a dependency on that module, so if your module requires it, you have 267have a dependency on that module, so if your module requires it, you have
257to add the dependency yourself. 268to add the dependency yourself.
334 345
335 &_freetls; 346 &_freetls;
336} 347}
337 348
338sub _error { 349sub _error {
339 my ($self, $errno, $fatal) = @_; 350 my ($self, $errno, $fatal, $message) = @_;
340 351
341 $self->_shutdown 352 $self->_shutdown
342 if $fatal; 353 if $fatal;
343 354
344 $! = $errno; 355 $! = $errno;
356 $message ||= "$!";
345 357
346 if ($self->{on_error}) { 358 if ($self->{on_error}) {
347 $self->{on_error}($self, $fatal); 359 $self->{on_error}($self, $fatal, $message);
348 } elsif ($self->{fh}) { 360 } elsif ($self->{fh}) {
349 Carp::croak "AnyEvent::Handle uncaught error: $!"; 361 Carp::croak "AnyEvent::Handle uncaught error: $message";
350 } 362 }
351} 363}
352 364
353=item $fh = $handle->fh 365=item $fh = $handle->fh
354 366
666 678
667 pack "w/a*", Storable::nfreeze ($ref) 679 pack "w/a*", Storable::nfreeze ($ref)
668}; 680};
669 681
670=back 682=back
683
684=item $handle->push_shutdown
685
686Sometimes you know you want to close the socket after writing your data
687before it was actually written. One way to do that is to replace your
688C<on_drain> handler by a callback that shuts down the socket. This method
689is a shorthand for just that, and replaces the C<on_drain> callback with:
690
691 sub { shutdown $_[0]{fh}, 1 } # for push_shutdown
692
693This simply shuts down the write side and signals an EOF condition to the
694the peer.
695
696You can rely on the normal read queue and C<on_eof> handling
697afterwards. This is the cleanest way to close a connection.
698
699=cut
700
701sub push_shutdown {
702 $_[0]->{on_drain} = sub { shutdown $_[0]{fh}, 1 };
703}
671 704
672=item AnyEvent::Handle::register_write_type type => $coderef->($handle, @args) 705=item AnyEvent::Handle::register_write_type type => $coderef->($handle, @args)
673 706
674This function (not method) lets you add your own types to C<push_write>. 707This function (not method) lets you add your own types to C<push_write>.
675Whenever the given C<type> is used, C<push_write> will invoke the code 708Whenever the given C<type> is used, C<push_write> will invoke the code
1183=cut 1216=cut
1184 1217
1185register_read_type json => sub { 1218register_read_type json => sub {
1186 my ($self, $cb) = @_; 1219 my ($self, $cb) = @_;
1187 1220
1188 require JSON; 1221 my $json = $self->{json} ||=
1222 eval { require JSON::XS; JSON::XS->new->utf8 }
1223 || do { require JSON; JSON->new->utf8 };
1189 1224
1190 my $data; 1225 my $data;
1191 my $rbuf = \$self->{rbuf}; 1226 my $rbuf = \$self->{rbuf};
1192
1193 my $json = $self->{json} ||= JSON->new->utf8;
1194 1227
1195 sub { 1228 sub {
1196 my $ref = eval { $json->incr_parse ($self->{rbuf}) }; 1229 my $ref = eval { $json->incr_parse ($self->{rbuf}) };
1197 1230
1198 if ($ref) { 1231 if ($ref) {
1342 } 1375 }
1343 }); 1376 });
1344 } 1377 }
1345} 1378}
1346 1379
1380our $ERROR_SYSCALL;
1381our $ERROR_WANT_READ;
1382our $ERROR_ZERO_RETURN;
1383
1384sub _tls_error {
1385 my ($self, $err) = @_;
1386
1387 return $self->_error ($!, 1)
1388 if $err == Net::SSLeay::ERROR_SYSCALL ();
1389
1390 my $err =Net::SSLeay::ERR_error_string (Net::SSLeay::ERR_get_error ());
1391
1392 # reduce error string to look less scary
1393 $err =~ s/^error:[0-9a-fA-F]{8}:[^:]+:([^:]+):/\L$1: /;
1394
1395 $self->_error (&Errno::EPROTO, 1, $err);
1396}
1397
1347# poll the write BIO and send the data if applicable 1398# poll the write BIO and send the data if applicable
1399# also decode read data if possible
1400# this is basiclaly our TLS state machine
1401# more efficient implementations are possible with openssl,
1402# but not with the buggy and incomplete Net::SSLeay.
1348sub _dotls { 1403sub _dotls {
1349 my ($self) = @_; 1404 my ($self) = @_;
1350 1405
1351 my $tmp; 1406 my $tmp;
1352 1407
1353 if (length $self->{_tls_wbuf}) { 1408 if (length $self->{_tls_wbuf}) {
1354 while (($tmp = Net::SSLeay::write ($self->{tls}, $self->{_tls_wbuf})) > 0) { 1409 while (($tmp = Net::SSLeay::write ($self->{tls}, $self->{_tls_wbuf})) > 0) {
1355 substr $self->{_tls_wbuf}, 0, $tmp, ""; 1410 substr $self->{_tls_wbuf}, 0, $tmp, "";
1356 } 1411 }
1412
1413 $tmp = Net::SSLeay::get_error ($self->{tls}, $tmp);
1414 return $self->_tls_error ($tmp)
1415 if $tmp != $ERROR_WANT_READ
1416 && ($tmp != $ERROR_SYSCALL || $!)
1417 && $tmp != $ERROR_ZERO_RETURN;
1357 } 1418 }
1358 1419
1359 while (defined ($tmp = Net::SSLeay::read ($self->{tls}))) { 1420 while (defined ($tmp = Net::SSLeay::read ($self->{tls}))) {
1360 unless (length $tmp) { 1421 unless (length $tmp) {
1361 # let's treat SSL-eof as we treat normal EOF 1422 # let's treat SSL-eof as we treat normal EOF
1368 $self->_drain_rbuf unless $self->{_in_drain}; 1429 $self->_drain_rbuf unless $self->{_in_drain};
1369 $self->{tls} or return; # tls session might have gone away in callback 1430 $self->{tls} or return; # tls session might have gone away in callback
1370 } 1431 }
1371 1432
1372 $tmp = Net::SSLeay::get_error ($self->{tls}, -1); 1433 $tmp = Net::SSLeay::get_error ($self->{tls}, -1);
1373
1374 if ($tmp != Net::SSLeay::ERROR_WANT_READ ()) {
1375 if ($tmp == Net::SSLeay::ERROR_SYSCALL ()) {
1376 return $self->_error ($!, 1); 1434 return $self->_tls_error ($tmp)
1377 } elsif ($tmp == Net::SSLeay::ERROR_SSL ()) { 1435 if $tmp != $ERROR_WANT_READ
1378 return $self->_error (&Errno::EIO, 1); 1436 && ($tmp != $ERROR_SYSCALL || $!)
1379 } 1437 && $tmp != $ERROR_ZERO_RETURN;
1380
1381 # all other errors are fine for our purposes
1382 }
1383 1438
1384 while (length ($tmp = Net::SSLeay::BIO_read ($self->{_wbio}))) { 1439 while (length ($tmp = Net::SSLeay::BIO_read ($self->{_wbio}))) {
1385 $self->{wbuf} .= $tmp; 1440 $self->{wbuf} .= $tmp;
1386 $self->_drain_wbuf; 1441 $self->_drain_wbuf;
1387 } 1442 }
1409If it an error to start a TLS handshake more than once per 1464If it an error to start a TLS handshake more than once per
1410AnyEvent::Handle object (this is due to bugs in OpenSSL). 1465AnyEvent::Handle object (this is due to bugs in OpenSSL).
1411 1466
1412=cut 1467=cut
1413 1468
1469our %TLS_CACHE; #TODO not yet documented, should we?
1470
1414sub starttls { 1471sub starttls {
1415 my ($self, $ssl, $ctx) = @_; 1472 my ($self, $ssl, $ctx) = @_;
1416 1473
1417 require Net::SSLeay; 1474 require Net::SSLeay;
1418 1475
1419 Carp::croak "it is an error to call starttls more than once on an AnyEvent::Handle object" 1476 Carp::croak "it is an error to call starttls more than once on an AnyEvent::Handle object"
1420 if $self->{tls}; 1477 if $self->{tls};
1421 1478
1479 $ERROR_SYSCALL = Net::SSLeay::ERROR_SYSCALL ();
1480 $ERROR_WANT_READ = Net::SSLeay::ERROR_WANT_READ ();
1481 $ERROR_ZERO_RETURN = Net::SSLeay::ERROR_ZERO_RETURN ();
1482
1422 $ctx ||= $self->{tls_ctx}; 1483 $ctx ||= $self->{tls_ctx};
1423 1484
1424 if ("HASH" eq ref $ctx) { 1485 if ("HASH" eq ref $ctx) {
1425 require AnyEvent::TLS; 1486 require AnyEvent::TLS;
1426 1487
1427 local $Carp::CarpLevel = 1; # skip ourselves when creating a new context 1488 local $Carp::CarpLevel = 1; # skip ourselves when creating a new context
1489
1490 if ($ctx->{cache}) {
1491 my $key = $ctx+0;
1492 $ctx = $TLS_CACHE{$key} ||= new AnyEvent::TLS %$ctx;
1493 } else {
1428 $ctx = new AnyEvent::TLS %$ctx; 1494 $ctx = new AnyEvent::TLS %$ctx;
1495 }
1429 } 1496 }
1430 1497
1431 $self->{tls_ctx} = $ctx || TLS_CTX (); 1498 $self->{tls_ctx} = $ctx || TLS_CTX ();
1432 $self->{tls} = $ssl = $self->{tls_ctx}->_get_session ($ssl, $self); 1499 $self->{tls} = $ssl = $self->{tls_ctx}->_get_session ($ssl, $self, $self->{peername});
1433 1500
1434 # basically, this is deep magic (because SSL_read should have the same issues) 1501 # basically, this is deep magic (because SSL_read should have the same issues)
1435 # but the openssl maintainers basically said: "trust us, it just works". 1502 # but the openssl maintainers basically said: "trust us, it just works".
1436 # (unfortunately, we have to hardcode constants because the abysmally misdesigned 1503 # (unfortunately, we have to hardcode constants because the abysmally misdesigned
1437 # and mismaintained ssleay-module doesn't even offer them). 1504 # and mismaintained ssleay-module doesn't even offer them).

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines