#!/usr/bin/perl
srand();

for ($a=0; $a < 100; $a++){
	# -- Form request string
	$theVerb = formRequest();
	$request = "$theVerb" . " / HTTP/1.1\r\nHost:yahoo.com\r\n\r\n"; 

	if (!sendRequest($request)){
		print "Request failed";
	}else{
		#print "Request sent ok";
	}
}

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
#
#
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub sendRequest() {
	my($result) = 0;
	my($i) = 0;
	my($request) = "";
	use IO::Socket;

	$socket = IO::Socket::INET->new
	(
		PeerAddr => "www.yahoo.com",
		PeerPort => 80,
		Proto 	 => "tcp",
		Type 	 => SOCK_STREAM
	)	 or die "Could not open port.\n";

	$request = $_[0];
	print "\n------------------------------------------\n";
	print "$request\n";
	print "------------------------------------------\n";
	print $socket $request;
	
	for ($i=0; $i < 1; $i++){
		$answer = <$socket>;
		print $answer;
	}
	
	sleep(1);
	close ($socket);
	$result = 1;
	return $result;
}

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
#
#
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub formRequest(){
	my($verb);
	my($request) = "";
	
	#
	#-- Verb
	#
	$verb = getVerb();
	return $verb;
	
	#
	#-- URL
	#

	#	
	#-- HTTP version
	#
	
	#
	#--Headers and their values
	#
	
	#
	#-- Entity Body
	#
	
	#
	#-- Trailers
	#
	
	
}

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
#
#
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub getVerb() {
	my(@validVerbArray) 	= ("GET", "PUT", "POST", "HEAD");
	my(@lowercaseVerbArray) = ("get", "put", "post", "head");
	my(@badCharArray)		= ("..\\", " ", "\r\n", "\r", "\n", "*", "\t", "\x0D", 
								"\x0A", "\x0D\x0A", "\x00", "\b", "\e", "\\", "\"", 
								"\'", "\f", "\"\"", "%");
	my($randomVerb);
	my(@verb);
	my($fullVerb)			= "";
	my($isVerbValid);
	my($validProb) 			= .7;
	my($lowercaseProb) 		= .5; 
	my($verbLength)			= 0;
	my($i)					= 0;
	my($randomASCII)		= 0;
	my($badCharProb)		= .2;
	
	#
	#-- Decide whether or not the verb will be valid or invalid
	#
	$isVerbValid = rand();
	#print "**** isVerbValid = $isVerbValid\n";
	
	if ($isVerbValid <= $validProb){
		#print "**** The verb is valid\n";
	
		#
		#-- Choose verb from among an array of valid verbs
		#
	
		$randomVerb = $validVerbArray[ rand(@validVerbArray) ];

		if ($randomVerb eq "GET"){
			@verb = ("G", "E", "T");
		}elsif ($randomVerb eq "PUT"){
			@verb = ("P", "U", "T");
		}elsif ($randomVerb eq "POST") {
			@verb = ("P", "O", "S", "T");
		}elsif($randomVerb eq "HEAD") {
			@verb = ("H", "E", "A", "D");
		}		
	
	}else{
		#print "**** The verb is invalid\n";
	
		#
		#-- Choose lowercase or Random ASCII verb
		#
	
		$randomNumber = rand();
		#print "random number = $randomNumber\n";
		
		if ($randomNumber < $lowercaseProb){
			#
			#-- Choose from among lowercase verb array
			#
			
			$randomVerb = $lowercaseVerbArray[ rand(@lowercaseVerbArray) ];
			
			if ($randomVerb eq "get"){
				@verb = ("g", "e", "t");
			}elsif($randomVerb eq "put"){
				@verb = ("p", "u", "t");
			}elsif($randomVerb eq "post"){
				@verb = ("p", "o", "s", "t");
			}elsif($randomVerb eq "HEAD"){
				@verb = ("h", "e", "a", "d");
			}
		
		}else{
			#
			#-- Choose some random ASCII characters for the verb
			#
		
			$verbLength = int rand(10);
			#print "The verb length is $verbLength\n";
			
			if ($verbLength == 9){
				#-- make the verb uber long
				for($i=0; $i < 1024; $i++){
					$verb[$i] = chr(int rand(255));
				}
				
			}else{
			
				for($i=0; $i < $verbLength; $i++){
					$verb[$i] = chr(int rand(255));
				}
			
				#-- print the ascii array
				#for ($i=0; $i < $verbLength; $i++){
				#	print $verb[$i];
				#}
				#print "\n";

			}
		
		} #-- end choosing random ascii chars for verb
	
	} #-- end choosing invalid verb

	#
	#-- Now that we have our verb, run it though the bad char filter
	#
	$randomNumber = rand();

	if($randomNumber < $badCharProb){
		#-- Let's input some bad characters
		print "==== \@verb is @verb\n";
		@verb = arrayInsert($badCharArray[rand(@badCharArray)], \@verb, int rand(@verb));
		print "==== \@verb is @verb\n";
	}

	#
	#-- Now run the verb through the hex escape filter
	#

	#
	#-- Put together the full verb
	#
	for ($i = 0; $i<@verb; $i++) {
		$fullVerb = "$fullVerb" . "$verb[$i]";
	}
	#print "final verb string = $fullVerb\n";
	
	
	return $fullVerb;
}

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#	This will insert a character into an array
#
#	usage arrayInsert($char, @array, $index);
#
#	$char	-	The character you are inserting into the array
#	@array	-	The array you are inserting $char into
#	$index	-	The index position where the the $char should go.  To put it
#				at the beginning of the arrya, $index would be 0.  To insert
#				$char at the end of the array $index would be @#array+1 .
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

sub arrayInsert(){
	print "** Inserting bad characters **\n";
	my($char) 		= $_[0];
	my($array) 		= $_[1];
	my($index) 		= $_[2];
	my($i)			= 0;	
	my(@newArray)	= ();
	
	for ($i=0; $i<$index; $i++){
		$newArray[$i] = @$array[$i];
	}
	$newArray[$index] = $char;
	print "** the bad char is $char ";
	
	for ($i=$index+1; $i<@array+1; $i++){
		$newArray[$i] = @$array[$i-1];
	}
	
	print "The newArray is @newArray\n";
	return @newArray;
}
