simplified(?) ssl socket usage foerste
authorHeiko Schlittermann <hs@schlittermann.de>
Tue, 29 Dec 2009 15:08:09 +0100
branchfoerste
changeset 46 64adfc60fca9
parent 45 441273fa1663
child 47 ba9f62859590
simplified(?) ssl socket usage
hlog.pl
--- a/hlog.pl	Tue Dec 29 14:06:42 2009 +0100
+++ b/hlog.pl	Tue Dec 29 15:08:09 2009 +0100
@@ -23,8 +23,9 @@
 use Getopt::Long;
 use Pod::Usage;
 use File::Basename;
+use if $ENV{DEBUG} => "Smart::Comments";
 use POSIX qw(:sys_wait_h setsid);
-use Cwd;
+use Cwd qw(abs_path getcwd);
 
 my $ME = basename $0;
 
@@ -119,6 +120,13 @@
         $opt_ssl  = 0;
     }
 
+    foreach ($opt_ssl_key, $opt_ssl_cert) {
+	$_ = abs_path($_) if defined;
+    }
+
+    ### $opt_ssl_key
+    ### $opt_ssl_cert
+
     $authdata = new Authen::hlog(filename => $opt_htpasswd, realm => $opt_realm)
       if $opt_auth;
 
@@ -172,27 +180,35 @@
     }
 
     # start the listener
-    my $listener =
-      $opt_ssl
-      ? new IO::Socket::SSL(
-        LocalAddr     => $opt_addr,
-        LocalPort     => $opt_port,
-        Proto         => "tcp",
-        Listen        => 1,
-        ReuseAddr     => 1,
-        SSL           => $opt_ssl,
-        SSL_key_file  => $opt_ssl_key,
-        SSL_cert_file => $opt_ssl_cert,
-        #debug         => $opt_debug
-      )
-      : new IO::Socket::INET(
+    #    my $listener =
+    #      $opt_ssl
+    #      ? new IO::Socket::SSL(
+    #        LocalAddr     => $opt_addr,
+    #        LocalPort     => $opt_port,
+    #        Proto         => "tcp",
+    #        Listen        => 1,
+    #        ReuseAddr     => 1,
+    #        SSL           => $opt_ssl,
+    #        SSL_key_file  => $opt_ssl_key,
+    #        SSL_cert_file => $opt_ssl_cert,
+    #        #debug         => $opt_debug
+    #      )
+    #      : new IO::Socket::INET(
+    #        LocalAddr => $opt_addr,
+    #        LocalPort => $opt_port,
+    #        Proto     => "tcp",
+    #        Listen    => 1,
+    #        ReuseAddr => 1,
+    #        #debug     => $opt_debug,
+    #      );
+
+    my $listener = new IO::Socket::INET(
         LocalAddr => $opt_addr,
         LocalPort => $opt_port,
         Proto     => "tcp",
         Listen    => 1,
         ReuseAddr => 1,
-        #debug     => $opt_debug,
-      );
+    ) or die "Can't create listener: $!\n";
 
     # go daemon
     chdir("/") or die "Can't chdir to /: $!\n";
@@ -249,11 +265,20 @@
         die "Can't fork: $!\n" if not defined $pid;
         if ($pid == 0) {
             $SIG{CHLD} = "DEFAULT";
-            $listener->close(SSL_no_shutdown => 1);
+            $listener->close();
+            if ($opt_ssl) {
+                $client = IO::Socket::SSL->new_from_fd(
+                    $client,
+                    SSL_server    => 1,
+                    SSL_key_file  => $opt_ssl_key,
+                    SSL_cert_file => $opt_ssl_cert,
+                );
+                $client->start_SSL;
+            }
             handle_request($client);
             exit 0;
         }
-        $client->close(SSL_no_shutdown => 1);
+        $client->close();
 
         # maintenance of logfiles
         if (-s $access > $maxlogsize) {
@@ -293,6 +318,7 @@
 
 sub handle_request($) {
     my $client = shift;
+
     local $_ = <$client>;
 
     # should be HTTP(S)/x.x
@@ -464,85 +490,6 @@
 # PACKAGES
 {
 
-    package IO::Socket::hlog;
-
-    use IO::Socket::INET;
-    use IO::Socket::SSL;
-
-    our (@ISA, $DEBUG);
-
-    sub new {
-
-        my $class = shift;
-
-        my %args = @_;
-        my $ssl  = delete $args{SSL};
-
-        if ($ssl) {
-
-            @ISA = qw(IO::Socket::SSL);
-            $IO::Socket::SSL::DEBUG = $DEBUG ? 3 : 0;
-
-        }
-        else {
-
-            %args = _delete_ssl_args(%args);
-            @ISA  = qw(IO::Socket::INET);
-
-        }
-
-        my $self;
-        unless ($self = $class->SUPER::new(%args)) {
-
-            return;
-
-        }
-
-        print "$class: $self created\n" if $DEBUG;
-
-        return $self;
-
-    }
-
-    sub close {
-
-        my $self = shift;
-        print "$self: closing\n" if $DEBUG;
-
-        my %args = @_;
-
-        %args = _delete_ssl_args(%args) unless $self->_is_ssl;
-
-        return $self->SUPER::close(%args);
-
-    }
-
-    sub errstr {
-
-        return IO::Socket::SSL::errstr if _is_ssl();
-
-        return $@;
-
-    }
-
-    sub _delete_ssl_args {
-
-        my %args = @_;
-        map { delete $args{$_} if /^SSL/; } keys %args;
-        return %args;
-
-    }
-
-    sub _is_ssl {
-
-        my $self = shift;
-        return $ISA[0] eq "IO::Socket::SSL";
-
-    }
-}
-
-{
-
     # authentication
     package Authen::hlog;
 
@@ -641,7 +588,6 @@
     }
 }
 
-
 __END__
 
 =head1 NAME