… | |
… | |
2063 | sub _dotls { |
2063 | sub _dotls { |
2064 | my ($self) = @_; |
2064 | my ($self) = @_; |
2065 | |
2065 | |
2066 | my $tmp; |
2066 | my $tmp; |
2067 | |
2067 | |
2068 | if (length $self->{_tls_wbuf}) { |
2068 | while (length $self->{_tls_wbuf}) { |
2069 | while (($tmp = Net::SSLeay::write ($self->{tls}, $self->{_tls_wbuf})) > 0) { |
2069 | if (($tmp = Net::SSLeay::write ($self->{tls}, $self->{_tls_wbuf})) <= 0) { |
2070 | substr $self->{_tls_wbuf}, 0, $tmp, ""; |
2070 | $tmp = Net::SSLeay::get_error ($self->{tls}, $tmp); |
|
|
2071 | |
|
|
2072 | return $self->_tls_error ($tmp) |
|
|
2073 | if $tmp != $ERROR_WANT_READ |
|
|
2074 | && ($tmp != $ERROR_SYSCALL || $!); |
|
|
2075 | |
|
|
2076 | last; |
2071 | } |
2077 | } |
2072 | |
2078 | |
2073 | $tmp = Net::SSLeay::get_error ($self->{tls}, $tmp); |
2079 | substr $self->{_tls_wbuf}, 0, $tmp, ""; |
2074 | return $self->_tls_error ($tmp) |
|
|
2075 | if $tmp != $ERROR_WANT_READ |
|
|
2076 | && ($tmp != $ERROR_SYSCALL || $!); |
|
|
2077 | } |
2080 | } |
2078 | |
2081 | |
2079 | while (defined ($tmp = Net::SSLeay::read ($self->{tls}))) { |
2082 | while (defined ($tmp = Net::SSLeay::read ($self->{tls}))) { |
2080 | unless (length $tmp) { |
2083 | unless (length $tmp) { |
2081 | $self->{_on_starttls} |
2084 | $self->{_on_starttls} |
… | |
… | |
2095 | $self->{_tls_rbuf} .= $tmp; |
2098 | $self->{_tls_rbuf} .= $tmp; |
2096 | $self->_drain_rbuf; |
2099 | $self->_drain_rbuf; |
2097 | $self->{tls} or return; # tls session might have gone away in callback |
2100 | $self->{tls} or return; # tls session might have gone away in callback |
2098 | } |
2101 | } |
2099 | |
2102 | |
2100 | $tmp = Net::SSLeay::get_error ($self->{tls}, -1); |
2103 | $tmp = Net::SSLeay::get_error ($self->{tls}, -1); # -1 is not neccessarily correct, but Net::SSLeay doesn't tell us |
2101 | return $self->_tls_error ($tmp) |
2104 | return $self->_tls_error ($tmp) |
2102 | if $tmp != $ERROR_WANT_READ |
2105 | if $tmp != $ERROR_WANT_READ |
2103 | && ($tmp != $ERROR_SYSCALL || $!); |
2106 | && ($tmp != $ERROR_SYSCALL || $!); |
2104 | |
2107 | |
2105 | while (length ($tmp = Net::SSLeay::BIO_read ($self->{_wbio}))) { |
2108 | while (length ($tmp = Net::SSLeay::BIO_read ($self->{_wbio}))) { |