diff options
Diffstat (limited to 'doc/www.powerfulproxy.com/public_html')
| -rw-r--r-- | doc/www.powerfulproxy.com/public_html/do_it.php | 164 | 
1 files changed, 68 insertions, 96 deletions
| diff --git a/doc/www.powerfulproxy.com/public_html/do_it.php b/doc/www.powerfulproxy.com/public_html/do_it.php index f3e3b14..20ac8de 100644 --- a/doc/www.powerfulproxy.com/public_html/do_it.php +++ b/doc/www.powerfulproxy.com/public_html/do_it.php @@ -1,107 +1,79 @@  <?php  // Copyright Atiti, 2011  // Version 0.1-2 +// Heavily modified by Ivo <Ivo@UCIS.nl> -// Where are we at? +if (!isset($_SERVER['PATH_INFO'])) die('PATH_INFO is not set'); +$pall = explode("/", $_SERVER['PATH_INFO']); +if (count($pall) <= 1) die('Unexpected path format'); +array_shift($pall); +$proto = array_shift($pall); +$host = array_shift($pall); +$path = implode('/', $pall); +array_pop($pall); +$rp = implode('/', $pall); + +/* CONFIGURATION */  $SERVICEURL = "http://powerfulproxy.com/do_it.php/"; -// Do da request -function get_url($url, $data) { -	if (!$url) { -		echo "Invalid use!"; -		die; -	} -   	 $options = array( -        	CURLOPT_RETURNTRANSFER => true,     // return web page -        	CURLOPT_HEADER         => false,    // don't return headers -        	CURLOPT_FOLLOWLOCATION => true,     // follow redirects -       		CURLOPT_ENCODING       => "",       // handle all encodings -        	CURLOPT_USERAGENT      => "AnoNet proxy", // who am i -        	CURLOPT_AUTOREFERER    => true,     // set referer on redirect -        	CURLOPT_CONNECTTIMEOUT => 15,      // timeout on connect -        	CURLOPT_TIMEOUT        => 28,      // timeout on response -        	CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects -		CURLOPT_FAILONERROR    => true, -//		CURLOPT_PROXY	       => "http://b.polipo.srn.ano:8000/", -   	 ); -	$ch = curl_init ($url); -	curl_setopt_array( $ch, $options ); -	$fields_string = ""; -	if (count($data)) { -		foreach($data as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } -		rtrim($fields_string,'&'); -		curl_setopt($ch, CURLOPT_POST, count($data)); -		curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); -	} -	$ret  = curl_exec ($ch); -	if ($error = curl_error($ch))  -		echo 'ERROR: ',$error; -	$info = curl_getinfo($ch); -	return array("data"=>$ret,"info"=>$info); -} -// Rewrite relative paths -function rewriteRelative($html, $base) { -	$server = preg_replace('@^([^\:]*)://([^/*]*)(/|$).*@', '\1://\2/', $base); -	$html = preg_replace('@\<([^>]*) (href|src)="/([^"]*)"@i', '<\1 \2="' . $server . '\3"', $html); -	$html = preg_replace('@\<([^>]*) (href|src)="(([^\:"])*|([^"]*:[^/"].*))"@i', '<\1 \2="' . $base . '\3"', $html); -	return $html; -} -if (isset($_SERVER["PATH_INFO"])) -	$p = $_SERVER["PATH_INFO"]; -if (isset($_SERVER["QUERY_STRING"])) -	$q = $_SERVER["QUERY_STRING"]; -$postdata = $_POST; -$pall = explode("/", $p); -if (count($pall) <= 1) { -	echo "Wrong host format? or smtg."; -	die; -} -$proto = $pall[1]; -$host = $pall[2]; -unset($pall[0]); -unset($pall[1]); -unset($pall[2]); -$path = implode("/", $pall); -// Figure out relative paths -$pi = pathinfo($path); -if ($pi) { -	$rp = @$pi["dirname"]; -} else -	$rp = ""; -if (!$rp) -	$rp = $path; -// Construct request url -$geturl = $proto."://".$host."/".$path; -if ($q) -	$geturl .= "?".$q; // Append query string -$d = get_url($geturl, $postdata); -$data = $d["data"]; -$ct = $d["info"]["content_type"]; -$ct_s = explode(";", $ct); -$found = false; -$match_ct = array("text/html", "text/xml", "text/plain"); -foreach($match_ct as $m) { -	if ($ct_s[0] == $m) -		$found = true; +$REWRITE_CONTENT_TYPES = array('text/html', 'text/xml', 'text/plain'); +$REWRITE_PATTERNS = array( +/* Rewrite complete http/https URLs, enable one of the tree, and no more! */ +//	'@(https?)://(([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@i' => $SERVICEURL.'$1/$2', +//	'@(src|href|action)\s*=\s*(\'|")(https?)://([^\'"]*)\2@i' => '$1=$2'.$SERVICEURL.'$3/$4$2', +	'@(<[^>]*)(src|href|action)\s*=\s*(\'|")(https?)://([^\'"]*)\3@i' => '$1$2=$3'.$SERVICEURL.'$4/$5$3', +/* Rewrite URLs relative to site root, enable one of the tree, and no more! */ +//	'@(src|href|action)\s*=\s*(\'|")/([^\'"]*)\2@i' => '$1=$2'.$SERVICEURL.$proto.'/'.$host.'/$3$2', +	'@(<[^>]*)(src|href|action)\s*=\s*(\'|")/([^\'"]*)\3@i' => '$1$2=$3'.$SERVICEURL.$proto.'/'.$host.'/$4$3', +); +$CURL_OPTIONS = array( +	CURLOPT_USERAGENT	=> "AnoNet proxy", +	CURLOPT_AUTOREFERER	=> TRUE, +	CURLOPT_CONNECTTIMEOUT	=> 15, +	CURLOPT_TIMEOUT		=> 28, +	CURLOPT_MAXREDIRS	=> 10, +	CURLOPT_FAILONERROR	=> FALSE, +	CURLOPT_HEADER		=> 1, +	CURLOPT_FOLLOWLOCATION	=> FALSE, +//	CURLOPT_INTERFACE	=> '0.0.0.0', +//	CURLOPT_PROXY		=> "http://b.polipo.srn.ano:8000/", +//	CURLOPT_PROXYUSERPWD	=> 'username:password', +); +/* END OF CONFIGURATION */ + +$url = $proto."://".$host."/".$path; +if (isset($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING'])) $url .= "?".$_SERVER['QUERY_STRING']; +$ch = curl_init($url); +curl_setopt_array($ch, $CURL_OPTIONS); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); +//curl_setopt($ch, CURLOPT_HEADER, FALSE); +if (count($_POST)) { +	curl_setopt($ch, CURLOPT_POST, TRUE); +	curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);  } -if ($found) { // Only rewrite for proper content -	$ret = rewriteRelative($data, $proto."://".$host."/".$rp."/"); -	$ret = preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', $SERVICEURL.str_replace("http://", "http/", "$1"), $ret); -	$ret = str_replace(".php/http://", ".php/http/", $ret); -	$ret = str_replace(".php/https://", ".php/https/", $ret); +$response = curl_exec($ch); +list($header, $data) = explode("\r\n\r\n", $response, 2);  +if ($error = curl_error($ch)) die('CURL ERROR: '.$error); +$info = curl_getinfo($ch); -	$ret = str_replace("../", "", $ret); -	$items = Array("/src='\/(.*)'/", "/src=\"\/(.*)\"/", "/href='\/(.*)'/", "/href=\"\/(.*)\"/"); -	$ret = preg_replace($items, "src='".$SERVICEURL.$proto."/".$host."/$1'", $ret); -	$ret = preg_replace("/action=\"\/\"/i", "action=\"".$SERVICEURL.$proto."/".$host."/\"", $ret); +header('Status: '.$info['http_code']); +header('Content-Type: '.$info['content_type']); -} else -	$ret = ""; -// Output da shit -header("Content-Type: ".$ct); -if (strlen($ret) == 0) -	echo $data; -else -	echo $ret; +$redirurl = ""; +if ($info['http_code'] === 301) { +	$headers = explode("\r\n", $header); +	foreach($headers as $h) { +		$cur_header = explode(": ", $h); +		if ($cur_header[0] == "Location") { +			$redirurl = preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', $SERVICEURL.str_replace("http://", "http/", "$1"), $cur_header[1]); +			$redirurl = str_replace(".php/http://", ".php/http/", $redirurl); +			header('Location: '.$redirurl); +		} +	} +} else { +	if (in_array(strtok($info['content_type'], ';'), $REWRITE_CONTENT_TYPES)) $data = preg_replace(array_keys($REWRITE_PATTERNS), array_values($REWRITE_PATTERNS), $data, -1, $count); +} +header('Content-Length: '.strlen($data)); +echo $data;  ?> | 
