home *** CD-ROM | disk | FTP | other *** search
- # NOTE: Derived from blib/lib/Net/SSLeay.pm.
- # Changes made here will be lost when autosplit is run again.
- # See AutoSplit.pm.
- package Net::SSLeay;
-
- #line 1560 "blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/ssl_read_until.al)"
- ### from patch by Clinton Wong <clintdw@netcom.com>
-
- # ssl_read_until($ssl [, $delimit [, $max_length]])
- # if $delimit missing, use $/ if it exists, otherwise use \n
- # read until delimiter reached, up to $max_length chars if defined
-
- sub ssl_read_until ($;$$) {
- my ($ssl,$delim, $max_length) = @_;
- local $[;
-
- # guess the delim string if missing
- if ( ! defined $delim ) {
- if ( defined $/ && length $/ ) { $delim = $/ }
- else { $delim = "\n" } # Note: \n,$/ value depends on the platform
- }
- my $len_delim = length $delim;
-
- my ($got);
- my $reply = '';
-
- # If we have OpenSSL 0.9.6a or later, we can use SSL_peek to
- # speed things up.
- # N.B. 0.9.6a has security problems, so the support for
- # anything earlier than 0.9.6e will be dropped soon.
- if (&Net::SSLeay::OPENSSL_VERSION_NUMBER >= 0x0090601f) {
- $max_length = 2000000000 unless (defined $max_length);
- my ($pending, $peek_length, $found, $done);
- while (blength($reply) < $max_length and !$done) {
- #Block if necessary until we get some data
- $got = Net::SSLeay::peek($ssl,1);
- last if print_errs('SSL_peek');
-
- $pending = Net::SSLeay::pending($ssl) + blength($reply);
- $peek_length = ($pending > $max_length) ? $max_length : $pending;
- $peek_length -= blength($reply);
- $got = Net::SSLeay::peek($ssl, $peek_length);
- last if print_errs('SSL_peek');
- $peek_length = blength($got);
-
- #$found = index($got, $delim); # Old and broken
-
- # the delimiter may be split across two gets, so we prepend
- # a little from the last get onto this one before we check
- # for a match
- my $match;
- if(blength($reply) >= blength($delim) - 1) {
- #if what we've read so far is greater or equal
- #in length of what we need to prepatch
- $match = substr $reply, blength($reply) - blength($delim) + 1;
- } else {
- $match = $reply;
- }
-
- $match .= $got;
- $found = index($match, $delim);
-
- if ($found > -1) {
- #$got = Net::SSLeay::read($ssl, $found+$len_delim);
- #read up to the end of the delimiter
- $got = Net::SSLeay::read($ssl,
- $found + $len_delim
- - ((blength $match) - (blength $got)));
- $done = 1;
- } else {
- $got = Net::SSLeay::read($ssl, $peek_length);
- $done = 1 if ($peek_length == $max_length - blength($reply));
- }
-
- last if print_errs('SSL_read');
- debug_read(\$reply, \$got) if $trace>1;
- last if $got eq '';
- $reply .= $got;
- }
- } else {
- while (!defined $max_length || length $reply < $max_length) {
- $got = Net::SSLeay::read($ssl,1); # one by one
- last if print_errs('SSL_read');
- debug_read(\$reply, \$got) if $trace>1;
- last if $got eq '';
- $reply .= $got;
- last if $len_delim
- && substr($reply, blength($reply)-$len_delim) eq $delim;
- }
- }
- return $reply;
- }
-
- # end of Net::SSLeay::ssl_read_until
- 1;
-