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::Server - pure Perl TLS Server

SYNOPSIS

    use Protocol::TLS::Server;

    # Create server object.
    # Load X509 certificate and private key
    my $server = Protocol::TLS::Server->new(
        cert_file => 'server.crt',
        key_file  => 'server.key',
    );

    # You must create tcp server yourself
    my $cv = AE::cv;
    tcp_server undef, 4443, sub {
        my ( $fh, $host, $port ) = @_ or do {
            warn "Client error\n";
            $cv->send;
            return;
        };

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

            # Callback executed when TLS-handshake finished
            on_handshake_finish => sub {
                my ($tls) = @_;
                
                # send application data
                $tls->send("hello");
            },

            # Callback executed when application data received
            on_data => sub {
                my ( $tls, $data ) = @_;
                print $data;

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

        # 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;
            },
        );

        # 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::Server is TLS server library. It's intended to make TLS-server implementations on top of your favorite event loop.

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>