my $asock = new IO::Socket::INET (..., Listen => 5); # accepting socket my $sslsock = new IO::Socket::SSL(..., PeerAddr => ...,); # SSL socket $sslsock->blocking(0); while (1) { my $csock = $asock->accept(); # Accept $csock, connecting socket $csock->blocking(0); my $readsel = new IO::Select($csock, $sslsock); my $writesel = new IO::Select(); # For convenience: translation table for socket to proxy from/to my %proxy = ( $csock => $sslsock, $sslsock => $csock, ); my %buffer; OUTER: while (1) { my ($read, $write, $err) = IO::Select::select($readsel, $writesel, $readsel); foreach (@$read) { my $b; while (defined(my $line = <$_>)) { $b .= $line; } if (!defined($b) && ($_ == $csock or !$_->connected())) { # SSL socket seems to return undef sometimes even # while staying connected... INET socket returns undef if # read and disconnected print "read undef: lost socket connection\n"; last OUTER; } $buffer{$proxy{$_}} .= $b; $writesel->add($proxy{$_}); } foreach (@$write) { if (exists($buffer{$_})) { # Do we need to handle partial writes here? $_->print($buffer{$_}); delete $buffer{$_}; } $writesel->remove($_); } if (@$err) { print "Error conditions: ", join (', ', @$err), "\n"; last OUTER; } } }