# HG changeset patch # User Heiko Schlittermann # Date 1262095689 -3600 # Node ID 64adfc60fca9207c3ff7702a1dd8e9e395d692d3 # Parent 441273fa1663266da4ee63fb766381109e9d8188 simplified(?) ssl socket usage diff -r 441273fa1663 -r 64adfc60fca9 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