#!/usr/bin/perl $|++; require '../LW2.pm'; %CONFIG = ( proxy_host => '', proxy_auth => 0, proxy_user => '', proxy_pass => '' ); @NORMALHOSTS = ( 'http://www.apache.org/', # latest apache 'http://www.microsoft.com/' # IIS ); @SSLHOSTS = ( 'https://www.microsoft.com/', # IIS SSL 'https://www.redhat.com/', # Apache SSL 'https://www.sun.com' # Sun java web server SSL ); @ERRORHOSTS = ( 'http://www.wiretrip.net:81/', # closed HTTP port 'http://www.google.com:82/', # filtered HTTP port 'http://non-exist.wiretrip.net' # non-exist host ); @ERRORHOSTSSSL = ( 'https://www.wiretrip.net:81/', # closed HTTPS port 'https://www.google.com:82/', # filtered HTTPS port 'https://non-exist.wiretrip.net' # non-exist host ); print STDOUT < 0){ print STDOUT "\nPlease enter in proxy username\n"; $CONFIG{proxy_user} = getinfo('proxy username'); print STDOUT "\nPlease enter in proxy password\n"; $CONFIG{proxy_pass} = getinfo('proxy password'); } } } print STDOUT < 0){ print STDOUT "\tProxy auth type: Basic\n" if($CONFIG{proxy_auth} == 1); print STDOUT "\tProxy auth type: NTLM\n" if($CONFIG{proxy_auth} == 2); print STDOUT "\tProxy username: ", $CONFIG{proxy_user}, "\n"; print STDOUT "\tProxy password: \n"; } } print STDOUT "\nTarget web sites:\n"; @HOSTS = (); push @HOSTS, @NORMALHOSTS; push @HOSTS, @SSLHOSTS if(LW2::ssl_is_available()); push @HOSTS, @ERRORHOSTS; push @HOSTS, @ERRORHOSTSSSL if(LW2::ssl_is_available()); foreach(@HOSTS){ print "\t", $_, "\n"; } print STDOUT "\n\nDoes this look correct?\n"; $res = yesno(); if($res eq 'n'){ print STDOUT <{whisker}->{method} = 'POST'; $REQ->{whisker}->{data} = 'data=' . LW2::uri_escape($PLATFORM . join("\n", @DATA)); if($CONFIG{proxy_host} ne ''){ my @x = split(/:/, $CONFIG{proxy_host}); $REQ->{whisker}->{proxy_host} = $x[0]; $REQ->{whisker}->{proxy_port} = $x[1]; if($CONFIG{proxy_auth} == 1){ LW2::auth_set('proxy-basic', $REQ, $CONFIG{proxy_user}, $CONFIG{proxy_pass}); } if($CONFIG{proxy_auth} == 2){ LW2::auth_set('proxy-ntlm', $REQ, $CONFIG{proxy_user}, $CONFIG{proxy_pass}); } } LW2::http_fixup_request($REQ); if(LW2::http_do_request($REQ,$RESP)){ print STDOUT <{whisker}->{error} EOT exit; } print LW2::dump('resp', $RESP), "\n"; print STDOUT <; $x=~tr/\r\n//d; } while ($x eq ''); return $x; } sub yesno { my $x = ''; do { print STDOUT "Choice [y/n]: "; $x = ; $x=~tr/YyNn//cd; } while ($x eq ''); return lc($x); } sub connect_test { my $host = shift; my $REQ = LW2::http_new_request(); my $RESP = LW2::http_new_response(); $REQ->{whisker}->{host} = ''; $REQ->{whisker}->{port} = 0; LW2::uri_split($host, $REQ); if($REQ->{whisker}->{host} eq '' || $REQ->{whisker}->{port} == 0){ print STDERR "Error: bad host '$host'\n"; return 0; } if($REQ->{whisker}->{ssl}==1 && !LW2::ssl_is_available()){ print STDERR "Skipping SSL site '$host'\n"; return 0; } if($CONFIG{proxy_host} ne ''){ my @x = split(/:/, $CONFIG{proxy_host}); $REQ->{whisker}->{proxy_host} = $x[0]; $REQ->{whisker}->{proxy_port} = $x[1]; if($CONFIG{proxy_auth} == 1){ LW2::auth_set('proxy-basic', $REQ, $CONFIG{proxy_user}, $CONFIG{proxy_pass}); } if($CONFIG{proxy_auth} == 2){ LW2::auth_set('proxy-ntlm', $REQ, $CONFIG{proxy_user}, $CONFIG{proxy_pass}); } } $REQ->{whisker}->{retry} = 0; $REQ->{whisker}->{timeout} = 13; LW2::http_fixup_request($REQ); my %data = ( times => '', nb => $LW2::LW_NONBLOCK_CONNECT, sslka => $LW2::LW_SSL_KEEPALIVE, reqs => '', syns => '', sstate => '' ); my $loop = 0; do { my $bef_nb = $LW2::LW_NONBLOCK_CONNECT; my $bef_ssl = $LW2::LW_SSL_KEEPALIVE; my $start = time; my $res = LW2::http_do_request($REQ,$RESP); my $diff = (time - $start); $RESP->{whisker}->{stats_reqs} ||= 0; $RESP->{whisker}->{stats_syns} ||= 0; $RESP->{whisker}->{socket_state} ||= 0; $data{times} .= ",$diff"; $data{reqs} .= ','.$RESP->{whisker}->{stats_reqs}; $data{syns} .= ','.$RESP->{whisker}->{stats_syns}; $data{sstate} .= ','.$RESP->{whisker}->{socket_state}; $data{nb} .= ','.$LW2::LW_NONBLOCK_CONNECT; if($res){ push @DATA, "$host"; push @DATA, "\t" . make_data_line(\%data); push @DATA, "\tError: " . $RESP->{whisker}->{error}; return 0; } if($RESP->{whisker}->{code} != 200 && ( $RESP->{whisker}->{code} < 300 || $RESP->{whisker}->{code} > 305) ){ push @DATA, "$host"; push @DATA, "\t" . make_data_line(\%data); push @DATA, "\tNon-200/30x response"; return 0; } $loop++; } while($loop < 4); push @DATA, "$host"; push @DATA, "\t" . make_data_line(\%data); return 1; } sub make_data_line { my $hr = shift; $hr->{reqs} =~ s/^,//; $hr->{syns} =~ s/^,//; $hr->{sstate} =~ s/^,//; $hr->{times} =~ s/^,//; my $l = 'time '.$hr->{times}.'/ska '.$hr->{sslka}. '/nb '.$hr->{nb}.'/syn '.$hr->{syns}.'/req '. $hr->{reqs}.'/sock '.$hr->{sstate}; return $l; }