package ProFTPD::TestSuite::ProxiedFTP;

use strict;
use vars qw(@ISA);

use Carp;
use Net::FTP;

@ISA = qw(Net::FTP);

my $proxy_info = undef;

sub new {
  my $class = shift;
  my ($addr, $port, $proxy, $timeout) = @_;
  $timeout = 5 unless defined($timeout);
  my $debug = undef;

  $proxy_info = $proxy;

  if ($ENV{TEST_VERBOSE}) {
    $debug = 10;
  }

  my $self = $class->SUPER::new($addr,
    Port => $port,
    Timeout => $timeout,
    Debug => $debug,
  );

  unless ($self) {
    croak($@);
  }

  return $self;
}

# Override response() from Net::Cmd to trigger sending the PROXY command
sub response {
  my $self = shift;

  if (defined($proxy_info)) {
    if (ref($proxy_info)) {
      my ($proto, $src_addr, $dst_addr, $src_port, $dst_port) = @$proxy_info;
      $self->command("PROXY", $proto, $src_addr,  $dst_addr, $src_port, $dst_port);

    } else {
      $self->rawdatasend($proxy_info);
    }

    $proxy_info = undef;
  }

  $self->SUPER::response();
}

sub login {
  my $self = shift;

  unless ($self->SUPER::login(@_)) {
    croak("Failed to login: " . $self->code . " " . $self->message);
  }

  return 1;
}
1;