From 19985dbb8c0aa66dc4bf7905abc1148de909097d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Luka=20=C5=A0ijanec?= Date: Tue, 11 Jan 2022 12:35:47 +0100 Subject: prvi-commit --- utils/load_test.php | 322 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 322 insertions(+) create mode 100644 utils/load_test.php (limited to 'utils/load_test.php') diff --git a/utils/load_test.php b/utils/load_test.php new file mode 100644 index 0000000..544b6d6 --- /dev/null +++ b/utils/load_test.php @@ -0,0 +1,322 @@ +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); + } + +} + +?> \ No newline at end of file -- cgit v1.2.3