Skip to content

Commit

Permalink
use class methods instead of constants
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Jan 15, 2017
1 parent 4bcbc03 commit e0d5bff
Show file tree
Hide file tree
Showing 14 changed files with 84 additions and 69 deletions.
2 changes: 1 addition & 1 deletion Changes
@@ -1,7 +1,7 @@

7.19 2017-01-14
- Added module Mojo::IOLoop::TLS.
- Added HAS_NNR and HAS_SOCKS constants to Mojo::IOLoop::Client.
- Added can_nnr and can_socks methods to Mojo::IOLoop::Client.

7.18 2017-01-11
- Fixed support for relative %INC paths in Mojo::Home.
Expand Down
47 changes: 23 additions & 24 deletions lib/Mojo/IOLoop/Client.pm
Expand Up @@ -2,32 +2,32 @@ package Mojo::IOLoop::Client;
use Mojo::Base 'Mojo::EventEmitter';

use Errno 'EINPROGRESS';
use Exporter 'import';
use IO::Socket::IP;
use Mojo::IOLoop;
use Mojo::IOLoop::TLS;
use Scalar::Util 'weaken';
use Socket qw(IPPROTO_TCP SOCK_STREAM TCP_NODELAY);

# Non-blocking name resolution requires Net::DNS::Native
use constant HAS_NNR => $ENV{MOJO_NO_NNR}
use constant NNR => $ENV{MOJO_NO_NNR}
? 0
: eval 'use Net::DNS::Native 0.15 (); 1';
my $NDN = HAS_NNR ? Net::DNS::Native->new(pool => 5, extra_thread => 1) : undef;
my $NDN = NNR ? Net::DNS::Native->new(pool => 5, extra_thread => 1) : undef;

# SOCKS support requires IO::Socket::Socks
use constant HAS_SOCKS => $ENV{MOJO_NO_SOCKS}
use constant SOCKS => $ENV{MOJO_NO_SOCKS}
? 0
: eval 'use IO::Socket::Socks 0.64 (); 1';
use constant READ => HAS_SOCKS ? IO::Socket::Socks::SOCKS_WANT_READ() : 0;
use constant WRITE => HAS_SOCKS ? IO::Socket::Socks::SOCKS_WANT_WRITE() : 0;
use constant READ => SOCKS ? IO::Socket::Socks::SOCKS_WANT_READ() : 0;
use constant WRITE => SOCKS ? IO::Socket::Socks::SOCKS_WANT_WRITE() : 0;

has reactor => sub { Mojo::IOLoop->singleton->reactor };

our @EXPORT_OK = qw(HAS_NNR HAS_SOCKS);

sub DESTROY { shift->_cleanup }

sub can_nnr {NNR}
sub can_socks {SOCKS}

sub connect {
my ($self, $args) = (shift, ref $_[0] ? $_[0] : {@_});

Expand All @@ -41,7 +41,7 @@ sub connect {
$_ && s/[[\]]//g for @$args{qw(address socks_address)};
my $address = $args->{socks_address} || ($args->{address} ||= '127.0.0.1');
return $reactor->next_tick(sub { $self && $self->_connect($args) })
if !HAS_NNR || $args->{handle};
if !NNR || $args->{handle};

# Non-blocking name resolution
my $handle = $self->{dns} = $NDN->getaddrinfo($address, _port($args),
Expand Down Expand Up @@ -128,7 +128,7 @@ sub _try_socks {
return $self->_try_tls($args) unless $args->{socks_address};
return $self->emit(
error => 'IO::Socket::Socks 0.64+ required for SOCKS support')
unless HAS_SOCKS;
unless SOCKS;

my %options = (ConnectAddr => $args->{address}, ConnectPort => $args->{port});
@options{qw(AuthType Username Password)}
Expand Down Expand Up @@ -235,6 +235,19 @@ global L<Mojo::IOLoop> singleton.
L<Mojo::IOLoop::Client> inherits all methods from L<Mojo::EventEmitter> and
implements the following new ones.
=head2 can_nnr
my $bool = Mojo::IOLoop::Client->can_nnr;
True if L<Net::DNS::Native> 0.15+ is installed and non-blocking name resolution
support enabled.
=head2 can_socks
my $bool = Mojo::IOLoop::Client->can_socks;
True if L<IO::Socket::SOCKS> 0.64+ is installed and SOCKS5 support enabled.
=head2 connect
$client->connect(address => '127.0.0.1', port => 3000);
Expand Down Expand Up @@ -329,20 +342,6 @@ Path to the TLS key file.
=back
=head1 CONSTANTS
L<Mojo::IOLoop::Client> implements the following constants, which can be
imported individually.
=head2 HAS_NNR
True if L<Net::DNS::Native> 0.15+ is installed and non-blocking name resolution
support enabled.
=head2 HAS_SOCKS
True if L<IO::Socket::SOCKS> 0.64+ is installed and SOCKS5 support enabled.
=head1 SEE ALSO
L<Mojolicious>, L<Mojolicious::Guides>, L<http://mojolicious.org>.
Expand Down
6 changes: 3 additions & 3 deletions lib/Mojo/IOLoop/Server.pm
Expand Up @@ -4,7 +4,7 @@ use Mojo::Base 'Mojo::EventEmitter';
use Carp 'croak';
use IO::Socket::IP;
use Mojo::IOLoop;
use Mojo::IOLoop::TLS 'HAS_TLS';
use Mojo::IOLoop::TLS;
use Scalar::Util 'weaken';
use Socket qw(IPPROTO_TCP TCP_NODELAY);

Expand Down Expand Up @@ -65,7 +65,7 @@ sub listen {
@$self{qw(args handle)} = ($args, $handle);

croak 'IO::Socket::SSL 1.94+ required for TLS support'
if !HAS_TLS && $args->{tls};
if !Mojo::IOLoop::TLS->can_tls && $args->{tls};
}

sub port { shift->{handle}->sockport }
Expand Down Expand Up @@ -166,7 +166,7 @@ implements the following new ones.
=head2 generate_port
my $port = $server->generate_port;
my $port = Mojo::IOLoop::Server->generate_port;
Find a free TCP port, primarily used for tests.
Expand Down
29 changes: 13 additions & 16 deletions lib/Mojo/IOLoop/TLS.pm
@@ -1,33 +1,33 @@
package Mojo::IOLoop::TLS;
use Mojo::Base 'Mojo::EventEmitter';

use Exporter 'import';
use Mojo::File 'path';
use Mojo::IOLoop;
use Scalar::Util 'weaken';

# TLS support requires IO::Socket::SSL
use constant HAS_TLS => $ENV{MOJO_NO_TLS}
use constant TLS => $ENV{MOJO_NO_TLS}
? 0
: eval 'use IO::Socket::SSL 1.94 (); 1';
use constant READ => HAS_TLS ? IO::Socket::SSL::SSL_WANT_READ() : 0;
use constant WRITE => HAS_TLS ? IO::Socket::SSL::SSL_WANT_WRITE() : 0;
use constant READ => TLS ? IO::Socket::SSL::SSL_WANT_READ() : 0;
use constant WRITE => TLS ? IO::Socket::SSL::SSL_WANT_WRITE() : 0;

has reactor => sub { Mojo::IOLoop->singleton->reactor };

our @EXPORT_OK = ('HAS_TLS');

# To regenerate the certificate run this command (18.04.2012)
# openssl req -new -x509 -keyout server.key -out server.crt -nodes -days 7300
my $CERT = path(__FILE__)->dirname->child('resources', 'server.crt')->to_string;
my $KEY = path(__FILE__)->dirname->child('resources', 'server.key')->to_string;

sub DESTROY { shift->_cleanup }

sub can_tls {TLS}

sub negotiate {
my ($self, $args) = (shift, ref $_[0] ? $_[0] : {@_});

return $self->emit(error => 'IO::Socket::SSL 1.94+ required for TLS support')
unless HAS_TLS;
unless TLS;

my $handle = $self->{handle};
return $self->emit(error => $IO::Socket::SSL::SSL_ERROR)
Expand Down Expand Up @@ -162,6 +162,12 @@ global L<Mojo::IOLoop> singleton.
L<Mojo::IOLoop::TLS> inherits all methods from L<Mojo::EventEmitter> and
implements the following new ones.
=head2 can_tls
my $bool = Mojo::IOLoop::TLS->can_tls;
True if L<IO::Socket::SSL> 1.94+ is installed and TLS support enabled.
=head2 negotiate
$tls->negotiate(server => 1, tls_version => 'TLSv1_2');
Expand Down Expand Up @@ -229,15 +235,6 @@ TLS protocol version.
Construct a new L<Mojo::IOLoop::Stream> object.
=head1 CONSTANTS
L<Mojo::IOLoop::TLS> implements the following constants, which can be
imported individually.
=head2 HAS_TLS
True if L<IO::Socket::SSL> 1.94+ is installed and TLS support enabled.
=head1 SEE ALSO
L<Mojolicious>, L<Mojolicious::Guides>, L<http://mojolicious.org>.
Expand Down
13 changes: 7 additions & 6 deletions lib/Mojolicious/Command/version.pm
@@ -1,8 +1,8 @@
package Mojolicious::Command::version;
use Mojo::Base 'Mojolicious::Command';

use Mojo::IOLoop::Client qw(HAS_NNR HAS_SOCKS);
use Mojo::IOLoop::TLS 'HAS_TLS';
use Mojo::IOLoop::Client;
use Mojo::IOLoop::TLS;
use Mojolicious;

has description => 'Show versions of available modules';
Expand All @@ -12,9 +12,10 @@ sub run {
my $self = shift;

my $ev = eval 'use Mojo::Reactor::EV; 1' ? $EV::VERSION : 'n/a';
my $socks = HAS_SOCKS ? $IO::Socket::Socks::VERSION : 'n/a';
my $tls = HAS_TLS ? $IO::Socket::SSL::VERSION : 'n/a';
my $ndn = HAS_NNR ? $Net::DNS::Native::VERSION : 'n/a';
my $socks
= Mojo::IOLoop::Client->can_socks ? $IO::Socket::Socks::VERSION : 'n/a';
my $tls = Mojo::IOLoop::TLS->can_tls ? $IO::Socket::SSL::VERSION : 'n/a';
my $nnr = Mojo::IOLoop::Client->can_nnr ? $Net::DNS::Native::VERSION : 'n/a';

print <<EOF;
CORE
Expand All @@ -25,7 +26,7 @@ OPTIONAL
EV 4.0+ ($ev)
IO::Socket::Socks 0.64+ ($socks)
IO::Socket::SSL 1.94+ ($tls)
Net::DNS::Native 0.15+ ($ndn)
Net::DNS::Native 0.15+ ($nnr)
EOF

Expand Down
12 changes: 11 additions & 1 deletion t/mojo/daemon.t
@@ -1,6 +1,9 @@
use Mojo::Base -strict;

BEGIN { $ENV{MOJO_REACTOR} = 'Mojo::Reactor::Poll' }
BEGIN {
$ENV{MOJO_NO_SOCKS} = $ENV{MOJO_NO_TLS} = 1;
$ENV{MOJO_REACTOR} = 'Mojo::Reactor::Poll';
}

use Test::More;
use FindBin;
Expand Down Expand Up @@ -323,6 +326,13 @@ ok !$tx->keep_alive, 'will not be kept alive';
is $tx->res->code, 200, 'right status';
is $tx->res->body, 'Whatever!', 'right content';

# No TLS support
eval {
Mojo::Server::Daemon->new(listen => ['https://127.0.0.1'], silent => 1)
->start;
};
like $@, qr/IO::Socket::SSL/, 'right error';

# Abstract methods
eval { Mojo::Server->run };
like $@, qr/Method "run" not implemented by subclass/, 'right error';
Expand Down
5 changes: 3 additions & 2 deletions t/mojo/daemon_ipv6_tls.t
Expand Up @@ -3,13 +3,14 @@ use Mojo::Base -strict;
BEGIN { $ENV{MOJO_REACTOR} = 'Mojo::Reactor::Poll' }

use Test::More;
use Mojo::IOLoop::TLS 'HAS_TLS';
use Mojo::IOLoop::TLS;

plan skip_all => 'set TEST_IPV6 to enable this test (developer only!)'
unless $ENV{TEST_IPV6};
plan skip_all => 'set TEST_TLS to enable this test (developer only!)'
unless $ENV{TEST_TLS};
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!' unless HAS_TLS;
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!'
unless Mojo::IOLoop::TLS->can_tls;

# To regenerate all required certificates run these commands (07.01.2016)
# openssl genrsa -out domain.key 1024
Expand Down
5 changes: 3 additions & 2 deletions t/mojo/ioloop_tls.t
Expand Up @@ -3,11 +3,12 @@ use Mojo::Base -strict;
BEGIN { $ENV{MOJO_REACTOR} = 'Mojo::Reactor::Poll' }

use Test::More;
use Mojo::IOLoop::TLS 'HAS_TLS';
use Mojo::IOLoop::TLS;

plan skip_all => 'set TEST_TLS to enable this test (developer only!)'
unless $ENV{TEST_TLS};
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!' unless HAS_TLS;
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!'
unless Mojo::IOLoop::TLS->can_tls;

# To regenerate all required certificates run these commands (12.12.2014)
# openssl genrsa -out ca.key 1024
Expand Down
5 changes: 3 additions & 2 deletions t/mojo/tls.t
Expand Up @@ -3,11 +3,12 @@ use Mojo::Base -strict;
BEGIN { $ENV{MOJO_REACTOR} = 'Mojo::Reactor::Poll' }

use Test::More;
use Mojo::IOLoop::TLS 'HAS_TLS';
use Mojo::IOLoop::TLS;

plan skip_all => 'set TEST_TLS to enable this test (developer only!)'
unless $ENV{TEST_TLS};
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!' unless HAS_TLS;
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!'
unless Mojo::IOLoop::TLS->can_tls;

use Mojo::IOLoop;
use Socket;
Expand Down
5 changes: 3 additions & 2 deletions t/mojo/user_agent_online.t
Expand Up @@ -6,11 +6,12 @@ BEGIN {
}

use Test::More;
use Mojo::IOLoop::TLS 'HAS_TLS';
use Mojo::IOLoop::TLS;

plan skip_all => 'set TEST_ONLINE to enable this test (developer only!)'
unless $ENV{TEST_ONLINE};
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!' unless HAS_TLS;
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!'
unless Mojo::IOLoop::TLS->can_tls;

use IO::Socket::INET;
use Mojo::IOLoop;
Expand Down
9 changes: 5 additions & 4 deletions t/mojo/user_agent_socks.t
Expand Up @@ -3,14 +3,15 @@ use Mojo::Base -strict;
BEGIN { $ENV{MOJO_REACTOR} = 'Mojo::Reactor::Poll' }

use Test::More;
use Mojo::IOLoop::Client 'HAS_SOCKS';
use Mojo::IOLoop::TLS 'HAS_TLS';
use Mojo::IOLoop::Client;
use Mojo::IOLoop::TLS;

plan skip_all => 'set TEST_SOCKS to enable this test (developer only!)'
unless $ENV{TEST_SOCKS};
plan skip_all => 'IO::Socket::Socks 0.64+ required for this test!'
unless HAS_SOCKS;
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!' unless HAS_TLS;
unless Mojo::IOLoop::Client->can_socks;
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!'
unless Mojo::IOLoop::TLS->can_tls;

use Mojo::IOLoop;
use Mojo::IOLoop::Server;
Expand Down
5 changes: 3 additions & 2 deletions t/mojo/user_agent_tls.t
Expand Up @@ -3,11 +3,12 @@ use Mojo::Base -strict;
BEGIN { $ENV{MOJO_REACTOR} = 'Mojo::Reactor::Poll' }

use Test::More;
use Mojo::IOLoop::TLS 'HAS_TLS';
use Mojo::IOLoop::TLS;

plan skip_all => 'set TEST_TLS to enable this test (developer only!)'
unless $ENV{TEST_TLS};
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!' unless HAS_TLS;
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!'
unless Mojo::IOLoop::TLS->can_tls;

use Mojo::IOLoop;
use Mojo::Server::Daemon;
Expand Down
5 changes: 3 additions & 2 deletions t/mojo/websocket_proxy_tls.t
Expand Up @@ -3,11 +3,12 @@ use Mojo::Base -strict;
BEGIN { $ENV{MOJO_REACTOR} = 'Mojo::Reactor::Poll' }

use Test::More;
use Mojo::IOLoop::TLS 'HAS_TLS';
use Mojo::IOLoop::TLS;

plan skip_all => 'set TEST_TLS to enable this test (developer only!)'
unless $ENV{TEST_TLS};
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!' unless HAS_TLS;
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!'
unless Mojo::IOLoop::TLS->can_tls;

use Mojo::IOLoop;
use Mojo::Server::Daemon;
Expand Down
5 changes: 3 additions & 2 deletions t/mojolicious/tls_lite_app.t
Expand Up @@ -3,11 +3,12 @@ use Mojo::Base -strict;
BEGIN { $ENV{MOJO_REACTOR} = 'Mojo::Reactor::Poll' }

use Test::More;
use Mojo::IOLoop::TLS 'HAS_TLS';
use Mojo::IOLoop::TLS;

plan skip_all => 'set TEST_TLS to enable this test (developer only!)'
unless $ENV{TEST_TLS};
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!' unless HAS_TLS;
plan skip_all => 'IO::Socket::SSL 1.94+ required for this test!'
unless Mojo::IOLoop::TLS->can_tls;

use Mojo::IOLoop;
use Mojo::UserAgent;
Expand Down

0 comments on commit e0d5bff

Please sign in to comment.