define(DOC,"[^\"]+"); // Hosts that may be redirected $PERMITED_HOSTS=array('www.zopa.com','www.pizda.ru'); function error($title="Error",$text){ echo "\n\n"; echo "\n"; echo " \n"; echo " \n"; echo "
".$title."
".$text."
\n"; echo "\n\n"; exit; } function build_url_prefix($host){ global $PHP_SELF; return $PHP_SELF.'?host='.urlencode($host).'&page='; } function build_url($host,$page,$suff=""){ if(eregi("(http|mailto|ftp):",$suff) || eregi("^#",$suff)) return $suff; $newp = $page; if(eregi("^/(.*)",$suff) || eregi("^(http|ftp)://(.*)",$suff)) $newp = $suff; else if(eregi("/$",$page)) $newp .= $suff; else if($suff != "") $newp = dirname($page).'/'.$suff; $newp = preg_replace("/\\\(['\"])/","\\1",$newp); $newp = preg_replace("/&/","&",$newp); $newp = urlencode($newp); return build_url_prefix($host).$newp; } function build_attr($attr,$host,$page,$suff=""){ return $attr.'="'.build_url($host,$page,$suff).'"'; } function build_css_url($host,$page,$suff=""){ return 'url("'.build_url($host,$page,$suff).'")'; } function parse_line($host,$page,$line){ $out = $line; if(eregi("href=\"(".DOC.")\"",$out)) $out = preg_replace('/href=\"(\S*)\"/ie','build_attr("href",$host,$page,"\\1")',$out); if(eregi("href=(".DOC.")",$out)) $out = preg_replace('/href=(\S*)/ie','build_attr("href",$host,$page,"\\1")',$out); if(eregi("src=\"(".DOC.")",$out)) $out = preg_replace('/src=\"(\S*)\"/ie','build_attr("src",$host,$page,"\\1")',$out); if(!eregi("url\(\"(http|ftp):",$out) && eregi("url\(\"(".DOC.")\"\)",$out)) $out = preg_replace('/url[(]\"(\S*)\"[)]/ie','build_css_url($host,$page,"\\1")',$out); //print htmlspecialchars($line)." -< ".htmlspecialchars($out)."
\n"; return $out; } $page = preg_replace("/\\\(['\"])/","\\1",$page); $check=false; foreach($PERMITED_HOSTS as $h){ if($h == $host){ $check=true; break; } } if($host == '' || !$check) error('access denied',"host $host not suported"); if($page == '') $page = '/'; if(($sock = fsockopen($host,80))){ fputs($sock, "GET $page HTTP/1.1\r\n". "Host: $host\r\n". "User-Agent: Mozilla/5.0\r\n". "Accept: text/html,text/plain,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1\r\n". "Accept-Language: en-us,ru;q=0.7,he;q=0.3\r\n". "Connection: close\r\n". ($PHP_AUTH_USER && $PHP_AUTH_PW? "Authorization: Basic ".base64_encode($PHP_AUTH_USER.':'.$PHP_AUTH_PW)."\r\n":''). "\r\n\r\n"); $contenttype = ''; $contentlength = ''; $auth = ''; $authhdr = ''; while(($out = fgets($sock,1024)) != ""){ if(!eregi("^HTTP",$out) && !eregi("^[a-z0-9\.\-]*:",$out)) break; if(eregi('^HTTP/1.1 401',$out)) $auth = 1; else if(eregi("^HTTP/1.1 301",$out)){ header('Location: '.build_url($host,$page).'/'); } if(eregi("^HTTP/1.1 404",$out)) header('HTTP/1.0 404 Not Found'); if(eregi("^Content-Type:",$out)) $contenttype = $out; else if(eregi("^Content-Length:",$out)) $contentlength = $out; else if(eregi("^WWW-Authenticate:",$out,$m)) $authhdr = $out; } header($contenttype); if($contentlength) header($contenttype); if($auth){ if($authhdr) header($authhdr); else header('WWW-Authenticate: Basic realm="Autentication Needed"'); header('HTTP/1.1 401 Unauthorized'); } if(eregi("text/html",$contenttype)){ if($contentlength){ while(($out = fgets($sock,1024)) != ''){ print parse_line($host,$page,$out); } } else{ while(($out = fgets($sock,1024)) != ''){ $bytes = hexdec(chop($out)); if($bytes > 0){ $out = @fread($sock,$bytes); // print "bytes = $bytes
\n"; //$arr = explode(chr(10),$out); $arr = preg_split('//',$out); $line = ''; foreach($arr as $c){ if($c == "\n"){ print parse_line($host,$page,$line.$c); $line = ''; } else $line .= $c; } if($line != '') print parse_line($host,$page,$line); // $arr = explode(chr(10),$out); // foreach($arr as $line) // print parse_line($host,$page,$line)."\n"; } } } } else if(eregi("text/css",$contenttype)){ while(($out = fgets($sock,1024)) != ''){ print parse_line($host,$page,$out); } } else{ header('Content-Disposition:filename="'.urldecode(basename($page)).'"'); while(($out = fread($sock,1024)) != ""){ print $out; } } fclose($sock); } else{ error('access denied',''); } ?>