You are viewing a plain text version of this content. The canonical link for it is here.
Posted to test-commits@perl.apache.org by rj...@apache.org on 2018/10/21 09:19:44 UTC
svn commit: r1844473 - /perl/Apache-Test/trunk/lib/Apache/TestRequest.pm
Author: rjung
Date: Sun Oct 21 09:19:44 2018
New Revision: 1844473
URL: http://svn.apache.org/viewvc?rev=1844473&view=rev
Log:
IO::Socket::SSL has getline() which reads decoded
lines, but the handling of the complex SSL read/write
method is incomplete.
So revert r1844425 and add another impl of getline()
that is motivated (mostly copied) from Net::SSLeay::ssl_read_all().
Unfortunately for that we need access to the internal
$ssl field in IO::Socket::SSL which can only be gotten
via the internal method _get_ssl_object().
Probably time for an enhancement request for
IO::Socket::SSL.
Modified:
perl/Apache-Test/trunk/lib/Apache/TestRequest.pm
Modified: perl/Apache-Test/trunk/lib/Apache/TestRequest.pm
URL: http://svn.apache.org/viewvc/perl/Apache-Test/trunk/lib/Apache/TestRequest.pm?rev=1844473&r1=1844472&r2=1844473&view=diff
==============================================================================
--- perl/Apache-Test/trunk/lib/Apache/TestRequest.pm (original)
+++ perl/Apache-Test/trunk/lib/Apache/TestRequest.pm Sun Oct 21 09:19:44 2018
@@ -304,9 +304,44 @@ sub vhost_socket {
}
}
+#IO::Socket::SSL::getline does not correctly handle OpenSSL *_WANT_*.
+#Could care less about performance here, just need a getline()
+#that returns the same results with or without ssl.
+#Inspired from Net::SSLeay::ssl_read_all().
+my %getline = (
+ 'IO::Socket::SSL' => sub {
+ my $self = shift;
+ # _get_ssl_object in IO::Socket::SSL only meant for internal use!
+ # But we need to compensate for unsufficient getline impl there.
+ my $ssl = $self->_get_ssl_object;
+ my ($got, $rv, $errs);
+ my $reply = '';
+
+ while (1) {
+ ($got, $rv) = Net::SSLeay::read($ssl, 1);
+ if (! defined $got) {
+ my $err = Net::SSLeay::get_error($ssl, $rv);
+ if ($err != Net::SSLeay::ERROR_WANT_READ() and
+ $err != Net::SSLeay::ERROR_WANT_WRITE()) {
+ $errs = Net::SSLeay::print_errs('SSL_read');
+ last;
+ }
+ next;
+ }
+ last if $got eq ''; # EOF
+ $reply .= $got;
+ last if $got eq "\n";
+ }
+
+ wantarray ? ($reply, $errs) : $reply;
+ },
+);
+
sub getline {
my $sock = shift;
- $sock->getline();
+ my $class = ref $sock;
+ my $method = $getline{$class} || 'getline';
+ $sock->$method();
}
sub socket_trace {
Re: svn commit: r1844473 -
/perl/Apache-Test/trunk/lib/Apache/TestRequest.pm
Posted by Rainer Jung <rj...@apache.org>.
See also: https://github.com/noxxi/p5-io-socket-ssl/issues/77
Am 21.10.2018 um 11:19 schrieb rjung@apache.org:
> Author: rjung
> Date: Sun Oct 21 09:19:44 2018
> New Revision: 1844473
>
> URL: http://svn.apache.org/viewvc?rev=1844473&view=rev
> Log:
> IO::Socket::SSL has getline() which reads decoded
> lines, but the handling of the complex SSL read/write
> method is incomplete.
>
> So revert r1844425 and add another impl of getline()
> that is motivated (mostly copied) from Net::SSLeay::ssl_read_all().
>
> Unfortunately for that we need access to the internal
> $ssl field in IO::Socket::SSL which can only be gotten
> via the internal method _get_ssl_object().
>
> Probably time for an enhancement request for
> IO::Socket::SSL.
>
> Modified:
> perl/Apache-Test/trunk/lib/Apache/TestRequest.pm
>
> Modified: perl/Apache-Test/trunk/lib/Apache/TestRequest.pm
> URL: http://svn.apache.org/viewvc/perl/Apache-Test/trunk/lib/Apache/TestRequest.pm?rev=1844473&r1=1844472&r2=1844473&view=diff
> ==============================================================================
> --- perl/Apache-Test/trunk/lib/Apache/TestRequest.pm (original)
> +++ perl/Apache-Test/trunk/lib/Apache/TestRequest.pm Sun Oct 21 09:19:44 2018
> @@ -304,9 +304,44 @@ sub vhost_socket {
> }
> }
>
> +#IO::Socket::SSL::getline does not correctly handle OpenSSL *_WANT_*.
> +#Could care less about performance here, just need a getline()
> +#that returns the same results with or without ssl.
> +#Inspired from Net::SSLeay::ssl_read_all().
> +my %getline = (
> + 'IO::Socket::SSL' => sub {
> + my $self = shift;
> + # _get_ssl_object in IO::Socket::SSL only meant for internal use!
> + # But we need to compensate for unsufficient getline impl there.
> + my $ssl = $self->_get_ssl_object;
> + my ($got, $rv, $errs);
> + my $reply = '';
> +
> + while (1) {
> + ($got, $rv) = Net::SSLeay::read($ssl, 1);
> + if (! defined $got) {
> + my $err = Net::SSLeay::get_error($ssl, $rv);
> + if ($err != Net::SSLeay::ERROR_WANT_READ() and
> + $err != Net::SSLeay::ERROR_WANT_WRITE()) {
> + $errs = Net::SSLeay::print_errs('SSL_read');
> + last;
> + }
> + next;
> + }
> + last if $got eq ''; # EOF
> + $reply .= $got;
> + last if $got eq "\n";
> + }
> +
> + wantarray ? ($reply, $errs) : $reply;
> + },
> +);
> +
> sub getline {
> my $sock = shift;
> - $sock->getline();
> + my $class = ref $sock;
> + my $method = $getline{$class} || 'getline';
> + $sock->$method();
> }
>
> sub socket_trace {
>
>