url($_GET['url']); $lt->run($_GET['iterate']); /** * * Class, ki na podanem URLju zacne izpolnjevati formo. * Ce je na naslednji strani (ki jo dobi nazaj) zopet forma, nadaljuje izpolnjevanje (za izpolnjevanje celotne ankete na vecih straneh) * * Izpolnjevanje od zacetka se pozene v podanem stevilu iteracij. * */ class LoadTest { private $time_start; private $start; private $url; private $subrequests = false; /** * zabelezimo zacetek izvajanja skripte * */ function __construct () { $this->start = microtime(true); } /** * URL na katerem bomo zaceli izpolnjevati formo * * @param mixed $url */ function url ($url) { $this->url = $url; } /** * pozenemo izpolnjevanje forme v stevilu iteracij * * @param mixed $iterate */ function run ($iterate = 1) { for ($i=1; $i<=$iterate; $i++) { $this->time_start = microtime(true); $this->fill_form($this->url); $time_seconds = microtime(true) - $this->time_start; echo $i.'. form filled in '.$time_seconds.' seconds
'; flush(); @ob_flush(); } $time_seconds = microtime(true) - $this->start; echo '
All '.$iterate.' forms filled in '.$time_seconds.' seconds'; flush(); @ob_flush(); } /** * izpolnjuje nek form, dokler ne pride do strani brez form elementa * * @param string $url * @param mixed $post */ function fill_form ($url, $post=null) { if ($url == '') return; $i = 0; do { list($header, $content) = $this->post_request($url, $post); if ($this->subrequests) { $this->post_request('http://www.1ka.si/admin/survey/minify/g=jsfrontend'); $this->post_request('http://www.1ka.si/admin/survey/script/calendar/calendar.js'); $this->post_request('http://www.1ka.si/admin/survey/script/calendar/lang/calendar-si.js'); $this->post_request('http://www.1ka.si/admin/survey/script/calendar/calendar-setup.js'); $this->post_request('http://www.1ka.si/admin/survey/script/calendar/calendar.css'); $this->post_request('http://www.1ka.si/main/survey/skins/Default.css'); } $url = ''; // ce stran poslje redirect if (strpos($header, 'HTTP/1.1 302 Found') !== false) { $h = explode("\n", $header); foreach ($h AS $l) if (strpos($l, 'Location:') !== false) $location = $l; $url = trim( substr($location, 10) ); $post = null; // obicen page, ki ga gremo parsat } else { $form = $this->parse_form($content); if ( isset($form['action']) ) $url = $form['action']; $form['input'] = $this->randomize_form($form['input']); if ( isset($form['input']) ) $post = $form['input']; } if (++$i >= 10000) { echo 'BREAK'; break; } // preprecimo, da se ne zacikla } while ($url != ''); /*if (strpos($content, 'Hvala za sodelovanje') === false) echo '
'.$header.'
'.$content.'
'; else echo '
KONEC
';*/ } /** * sparsa podano HTML vsebino strani in vrne array s podatki form-a * * @param mixed $content */ function parse_form ($content) { $form = array(); $dom = new DOMDocument(); @$dom->loadHTML($content); $dom->preserveWhiteSpace = false; $form_el = $dom->getElementsByTagName('form'); foreach ($form_el AS $oneform) // na strani mora biti samo en form... ker drugace ne vemo katerega izbrati $form['action'] = $oneform->getAttribute('action'); // gremo cez input polja $inputs = $dom->getElementsByTagName('input'); foreach ($inputs AS $input) { $name = $input->getAttribute('name'); $value = $input->getAttribute('value'); $type = $input->getAttribute('type'); if ($name != '') { $form['input'][$name]['type'] = $type; $form['input'][$name][] = $value; } } return $form; } /** * zrandomizira vrednosti forma * * @param mixed $form */ function randomize_form($form) { /*echo '
';
		echo "\noriginale: ";
		print_r($form);*/
		
		if ( count($form) == 0 ) return $form;
		
		foreach ($form AS $key => $input) {
		
			// radio button - izberemo enega nakljucno
			if ($input['type'] == 'radio') {
				$pos = rand(0, count($input)-2);
				$form[$key] = $input[$pos];
			
			// checkbox (razlika je v tabeli in navadnih, ker imajo razlicen nacin poimenovanja, in se ne da drugace zaznati skupin... zakompliciran..)
			} elseif ($input['type'] == 'checkbox') {
				
				// navaden checkbox - izberemo enega nakljucno
				if ( count($input) > 2 ) {
					$pos = rand(0, count($input)-2);
					$form[$key] = $input[$pos];
					
				// multigrid checkbox - vsak checkbox obkljukamo z verjetnostjo 50% (ker se ne da razbrati vrstic zaradi takega poimenovanja)
				} else {
					foreach ($input AS $k => $v) {
						if ($v != 'checkbox')
							if (rand(0,1) >= 0.5) $form[$key] = $v; else unset($form[$key]);
					}
				}
			
			// textfield - vpisemo nek random string
			} elseif ($input['type'] == 'text') {
				$form[$key] = ($_GET['uniqueID']!=''?$_GET['uniqueID'].'-':'') . substr(sha1(rand(0,1).time()), 0, 10);
			
			
			// ce je samo 1 element, nimamo kaj randomizirat (count je 2, ker je en type)
			} else {
				$form[$key] = $input[0];
				
			}
		
			
		}
		
		/*echo "\nrandomized:";
		print_r($form);
		echo '
';*/ return $form; } /** * en primercek, ki poslje vse parametre. request_show.php pa izpise vse post, get in cookieje ki jih prejme * */ function test_example() { $post = array('test' => 'foobar', 'okay' => 'yes', '6' => 'test'); $get = array ('get'=>'gett', 'get222'=>'123'); $cookie = array ('ena' => 'prvi', 'dva' => 'drugiff'); list($header, $content) = $this->post_request( "http://test.1ka.si/utils/request_show.php?pa_v_urlju=tudi_dela", $post, $get, $cookie ); echo $header.'
'.$content; } /** * naredi request (POST oz GET, nastavi tudi COOKIE) in vrne rezultat * */ function post_request($url, $_post=null, $_get=null, $_cookie=null, $referer='') { if ($referer == '') $referer = $url; if ($_post != null) { $data = array(); while (list($n, $v) = each($_post)) { $data[] = "$n=$v"; } $data = implode('&', $data); } if ($_get != null) { $get = array(); while (list($n,$v) = each($_get)) { $get[] = "$n=$v"; } $get = '?'.implode('&', $get); } else $get = ''; if ($_cookie != null) { $cookie = array(); while (list($n,$v) = each($_cookie)) { $coookie[] = "$n=$v"; } $cookie = implode('; ', $coookie); } // sparsamo url $url = parse_url($url); if ($url['scheme'] != 'http') { die('Only HTTP request are supported !'); } $host = $url['host']; $path = $url['path']; if (isset($url['query'])) $query = ($get==''?'?':'&').$url['query']; else $query = ''; set_time_limit(0); $fp = fsockopen($host, 80); //stream_set_blocking($fp, false); stream_set_timeout($fp, 86400); // posljemo header if ($_post != null) fputs($fp, "POST {$path}{$get}{$query} HTTP/1.1\r\n"); else fputs($fp, "GET {$path}{$get}{$query} HTTP/1.1\r\n"); fputs($fp, "Host: $host\r\n"); fputs($fp, "Referer: $referer\r\n"); if ($_cookie != null) fputs($fp, "Cookie: $cookie\r\n"); fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); if ($_post != null) fputs($fp, "Content-length: ". strlen($data) ."\r\n"); fputs($fp, "Connection: close\r\n\r\n"); if ($_post != null) fputs($fp, $data); $result = ''; while(!feof($fp)) { $result .= fgets($fp, 128); } fclose($fp); // locimo header od podatkov $result = explode("\r\n\r\n", $result, 2); $header = isset($result[0]) ? $result[0] : ''; $content = isset($result[1]) ? $result[1] : ''; // header in podatke vrnemo v arrayu return array($header, $content); } } ?>