помогите написать скрипт для тунеля (или proxy). Чтобы все запросы клиента полностью ("1 в 1") передавались на другой сервер, и возвращались клиенту, так чтобы он не видел что соединение происходит на серверной частм. Желательно чтобы все работало на всех версиях php начиная с 5.0 Вот что я попробовал сделать сам, но это почемуто не работает на 5.2.x Код | <?php $TO_HOST="google.com"; $TO_PORT=80; if (!function_exists('getallheaders')) { function getallheaders() { foreach ($_SERVER as $name => $value) { if (substr($name, 0, 5) == 'HTTP_') { $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; } } return $headers; } }
function myraw($host) { $method=$_SERVER['HTTP_METHOD']; if (!isset($method)) { $method=$_SERVER['REQUEST_METHOD']; } $protocol=$_SERVER['SERVER_PROTOCOL']; if (!isset($protocol)) { $protocol="HTTP/1.1"; } $raw=$method." ".$_SERVER['REQUEST_URI']." ".$protocol."\r\n"; foreach(getallheaders() as $key=>$value) { if ($key == 'Host') { $raw .="Host: ".$host."\r\n"; } else { $raw .=$key.': '.$value."\r\n"; } } $body=@file_get_contents('php://input'); $raw .="\r\n".$body; $log .="raw: ".$raw."\n"; return $raw; } $req=myraw($TO_HOST); $fp = fsockopen($TO_HOST, $TO_PORT, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br/>\n"; } else { fwrite($fp, $req); $quit=false; $len=-1; $state=0; $chunk=-1; while (!$quit) { if ($state==0) { $readed=fgets($fp,128);
header($readed); if (strlen(trim($readed))==0) { $state=1; if ($chunk==0) { $nc=fgets($fp, 1024); $chunk=hexdec($nc); } $quit = $len==0; } else if (strpos($readed,"HTTP")===0) { $codeline=split(" ",$readed); } else if (strpos($readed,"Content-Length: ")===0) { $len=(int)substr($readed, 16); } else if (strpos($readed,"Transfer-Encoding: chunked")===0) { $chunk=0; header_remove("Transfer-Encoding"); } } else if ($state==1) { if ($chunk>=0) { if ($chunk==0) { $quit = true; } else { $readed=fread($fp,$chunk); echo $readed; $chunk -= strlen($readed); if ($chunk==0) { if (fgets($fp, 1024) != "\r\n") { die('error in chunk-decoding'); } $nc=fgets($fp, 1024); $chunk=hexdec($nc); } } } else { if ($len<0) { $readed=fread($fp, 1024); } else { $readed=fread($fp,$len); $len-=strlen($readed); $quit = $len<=0; } echo $readed; } } $quit|=feof($fp); } fclose($fp); }
?>
|
--------------------
Много чего интересного...
|