#!/usr/bin/perl

use strict;

main();

sub main(){
   if (index($ENV{'QUERY_STRING'},"check")>=0){
    my $options="";	    # default options
    my $login="kinoafisha";	    # your login
    my ($i,$j,$answer,$proxy, $url, @proxies, $num);
    my $check_ip="195.208.219.11";
    $answer="<HTML><BODY>";
    $url="http://topfree.virtualave.net/cgi-bin/info.cgi";
    my $the_end=0;

    my (@proxies);
    open(DAT,"<input.txt");
    @proxies = <DAT>;
    close (DAT);
    my($item, $num, $req_res);
    foreach $item(@proxies){
     $num++;
    }
    my $prx_ok=0;
    my @fnames=("bad","good","anonim");
    if ($num){
     $answer.="There are still $num proxies to check<hr>\n";
        for ($i=0; $i<5; $i++){
           $proxy=pop(@proxies);
           if ($proxy){
               $answer.=$proxy."<br>";
               for ($j=0; $j<5; $j++){
                  $req_res=my_http_request($proxy,$url,"");
                  if (index($req_res,"[")!=0){
                   last;
                  }
               }
               if (index($req_res,"[")!=0){
                 $prx_ok=0;
                 if (index($req_res,$check_ip)<0){
                   $prx_ok=2;
                 }
                 else
                 {
                   $prx_ok=1;
                 }
               }
               else {
                $prx_ok=0;
               }
               open(PRX,">>".$fnames[$prx_ok]);
               print PRX $proxy;
               close (PRX);

#               $answer.=$req_res."<hr><br>";
               $answer.=" $fnames[$prx_ok]<hr><br>";
             }
           else{
               $answer.="no proxy<br>";
               $the_end=1;
           }
        }
      }
    else
      {
       $answer="no more proxy..\n";
      }
    unlink("input1.txt");
    if (rename("input.txt","input1.txt")){
        unlink("input.txt");
        open(DAT,">input.txt");
        print DAT @proxies;
        close (DAT);
        if (!$the_end) {
           $answer.="\n<script language=\"JavaScript\">\n";
           $answer.="setTimeout('Reload()',3000);\n";
           $answer.="function Reload(){\n";
           $answer.="window.location.href='tx3.pl?".$ENV{'QUERY_STRING'}."';}</script>\n";
         }
         $answer.="</BODY></HTML>\n";
       }
    else{
      $answer="error on deleting file with proxies list";
    }
    print "Content-type: text/html\nContent-Length: ".length($answer)."\n\n",$answer;
   }
   else {
    my $options="";	    # default options
    my $login="kinoafisha";	    # your login
    my $banner=banner($ENV{'PATH_INFO'} || "/$login",$ENV{'QUERY_STRING'} || $options);
    print "Content-type: text/html\nContent-Length: ".length($banner)."\n\n",$banner;
   }
}

sub banner{
    my ($login,$query)=@_;
    my $mirror="212.188.13.89";		    # nearest mirror IP
    my $timeout=2;			    # timeout
    my $charset=$ENV{'SOURCE_CHARSET'};	    # Russian Apache charset autodetect
    my $headers={
	'REFERER'	    => "http://".$ENV{'SERVER_NAME'}.$ENV{'REQUEST_URI'},   # we need to pass 
	'USER-AGENT'	    => $ENV{'HTTP_USER_AGENT'},				    # these headers
	'X_FORWARDED_FOR'   => $ENV{'HTTP_X_FORWARDED_FOR'},			    # into subrequests
	'REMOTE_ADDR'	    => $ENV{'REMOTE_ADDR'}				    #
    };
    
    $query="&charset=$charset".($query ? "&":"").$query;
    request($login,$mirror,$query,$timeout,$headers) || default();
}

sub default{
    my $banner="<a href=\"http://tx3.design.ru/\" target=\"_top\">tx3</a> - Text Exchange Network";
    "<table cellspacing=0 cellpadding=10 border=1 width=100%><tr><td align=center valign=middle>$banner</td></tr></table>";
}

sub request{
    my ($login,$mirror,$query,$timeout,$headers)=@_;
    $query=~tr/ /+/;

    my $banner;
    my $request="GET /cgi-bin/banner$login?ssi=yes$query HTTP/1.0\nHOST: tx3\n";
    while (my ($name,$value)=each %$headers){
	$request.="$name: $value\n" if $value;
    }

    local $SIG{ALRM}= sub { die };
    local $/=undef;

    alarm($timeout);
    eval {
	$banner=http($mirror,$request);
    };
    close(SOCK);

    return "" if $@;
    return "" unless ($banner=~ /^HTTP\/[^ ]* (\d+)/) && ($1==200);
    $banner=~/\r?\n\r?\n/s;
    return $';
}

sub http{
    my ($host,$headers)=@_;
    my $thataddr=gethostbyname($host);

    return "[unable to resolve host name]" unless $thataddr;
    return "[socket create error]" unless socket(SOCK,2,1,6);
    return "[socket connect error]" unless connect(SOCK,pack('S n a4 x8',2,80,$thataddr));
    select(SOCK); $|=1; select(STDOUT);
    print SOCK "$headers\n";
    <SOCK>
}

sub my_http_request{
    my ($proxy,$url,$referrer)=@_;


    my $timeout=5;			    # timeout
    my $charset=$ENV{'SOURCE_CHARSET'};	    # Russian Apache charset autodetect
    my $headers={
#	'REFERER'	    => $referrer,   # we need to pass
	'REFERER'	    => "http://".$ENV{'SERVER_NAME'}.$ENV{'REQUEST_URI'},
	'USER-AGENT'	    => $ENV{'HTTP_USER_AGENT'},				    # these headers
	'X_FORWARDED_FOR'   => $ENV{'HTTP_X_FORWARDED_FOR'},			    # into subrequests
	'REMOTE_ADDR'	    => $ENV{'REMOTE_ADDR'},				    #
        'HTTP_CLIENT_IP'    => "127.0.0.1",
	'ACCEPT'	    => "*/*"#
    };

    return my_request($proxy,$url,$timeout,$headers) || my_default();
}

sub my_default{
    my $banner="[no response]";
}

sub ctime {
    return(scalar(localtime($_[0])));
}

sub load_proxies_list{
 my (@proxies)=@_;
 open(DAT,"<input.txt");
 @proxies = <DAT>;
 close (DAT);
 my($item, $num);
 foreach $item(@proxies)
 {
  $num++;
 }
 return $num;
}

sub get_next_proxy {
 my (@proxies)=@_;
 return(scalar(pop(@proxies)));
}

sub my_request{
    my ($proxy,$url,$timeout,$headers)=@_;
    $url=~tr/ /+/;
    my $result;

    my $request="GET ".$url." HTTP/1.0\n";
    while (my ($name,$value)=each %$headers){
	$request.="$name: $value\n" if $value;
    }

$_=$proxy;
s/ //;
s/\r//;
s/\n//;
$proxy=$_;


    my ($proxy_name,$proxy_port)=split(/:/,$proxy);

#my $answer=">$proxy_name,$proxy_port<";
#print "Content-type: text/html\nContent-Length: ".length($answer)."\n\n",$answer;
#exit;

    local $SIG{ALRM}= sub { die };
    local $/=undef;

    alarm($timeout);

    eval {
	$result=my_http($proxy_name,$proxy_port,$request);
    };
    close(SOCK);
    return "[error on connect]" if $@;
    $result=~/\r?\n\r?\n/s;
    return $';

}

sub my_http{
    my ($host,$port,$request)=@_;
    my $thataddr=gethostbyname($host);

    return "[unable to resolve host name]" unless $thataddr;
    return "[socket create error]" unless socket(SOCK,2,1,6);
    return "[socket connect error]" unless connect(SOCK,pack('S n a4 x8',2,$port,$thataddr));
    select(SOCK); $|=1; select(STDOUT);
    print SOCK "$request\n";
    <SOCK>
}
