The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Protocol::TLS::Client - pure Perl TLS Client

SYNOPSIS

    use Protocol::TLS::Client;

    # Create client object
    my $client = Protocol::TLS::Client->new();

    # You must create tcp connection yourself
    my $cv = AE::cv;
    tcp_connect 'example.com', 443, sub {
        my $fh = shift or do {
            warn "error: $!\n";
            $cv->send;
            return;
        };
        
        # socket handling
        my $h;
        $h = AnyEvent::Handle->new(
            fh       => $fh,
            on_error => sub {
                $_[0]->destroy;
                print "connection error\n";
                $cv->send;
            },
            on_eof => sub {
                $h->destroy;
                print "that's all folks\n";
                $cv->send;
            },
        );


        # Create new TLS-connection object
        my $con = $client->new_connection(

            # SERVER NAME (FQDN)
            'example.com',

            # Callback executed when TLS-handshake finished
            on_handshake_finish => sub {
                my ($tls) = @_;

                # Send some application data
                $tls->send("hi there\n");
            },
            
            # Callback executed when application data received
            on_data => sub {
                my ( $tls, $data ) = @_;
                print $data;
                
                # send close notify and close application level connection
                $tls->close;
            }
        );

        # Handshake start
        # Send TLS records to socket
        while ( my $record = $con->next_record ) {
            $h->push_write($record);
        }

        # low level socket operations (read/write)
        $h->on_read(
            sub {
                my $handle = shift;
                
                # read TLS records from socket and put them to $con object
                $con->feed( $handle->{rbuf} );
                $handle->{rbuf} = '';

                # write TLS records to socket
                while ( my $record = $con->next_record ) {
                    $handle->push_write($record);
                }

                # Terminate connection if all done
                $handle->push_shutdown if $con->shutdown;
                ();
            }
        );
        ();
    };

    # finish
    $cv->recv;

DESCRIPTION

Protocol::TLS::Client is TLS client library. It's intended to make TLS-client implementations on top of your favorite event loop.

METHODS

new

Initialize new client object

    my $client = Procotol::TLS::Client->new( %options );

Availiable options:

cert_file => /path/to/cert.crt

Path to client certificate to perform client to server authentication

key_file => /path/to/cert.key

Path to private key for client certificate

new_connection

Create new TLS-connection object

    my $con = $client->new_connection( 'F.Q.D.N', %options );

'F.Q.D.N' - fully qualified domain name

%options - options hash

Availiable options:

on_handshake_finish => sub { ... }

Callback invoked when TLS handshake completed

    on_handshake_finish => sub {
        my ($tls) = @_;

        # Send some application data
        $tls->send("hi there\n");
    },
on_data => sub { ... }

Callback executed when application data received

    on_data => sub {
        my ( $tls, $data ) = @_;
        print $data;

        # send close notify and close application level connection
        $tls->close;
    }

LICENSE

Copyright (C) Vladimir Lettiev.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

AUTHOR

Vladimir Lettiev <thecrux@gmail.com>