<?php
set_time_limit(0);
ini_set( "display_errors", 0);

    //ini_set('upload_max_filesize', '15M');  
    //ini_set('post_max_size', '15M');  
    //ini_set('max_input_time', 300);  
    //ini_set('max_execution_time', 300); 

/**
 make an http POST request and return the response content and headers
 @param string $url    url of the requested script
 @param array $data    hash array of request variables
 @return returns a hash array with response content and headers in the following form:
 array ('content'=>'<html></html>'
 , 'headers'=>array ('HTTP/1.1 200 OK', 'Connection: close', ...)
 )
 */
function http_post ($url, $data)
{
	$data_url = http_build_query ($data);
	$data_len = strlen ($data_url);

	return array ('content'=>file_get_contents ($url, false, stream_context_create (array ('http'=>array ('method'=>'POST'
	, 'header'=>"Connection: close\r\nContent-Length: $data_len\r\n"
	, 'content'=>$data_url
    , 'timeout' => 180
	),"ssl"=>array("verify_peer"=>false,"verify_peer_name"=>false))))
	, 'headers'=>$http_response_header
	);
}

function do_post_request($url, $postdata, $files = null) 
{ 
    $data = ""; 
    $boundary = "---------------------".substr(md5(rand(0,32000)), 0, 10); 
       
    //Collect Postdata 
    foreach($postdata as $key => $val) 
    { 
        $data .= "--$boundary\n"; 
        $data .= "Content-Disposition: form-data; name=\"".$key."\"\n\n".$val."\n"; 
    } 
     
    $data .= "--$boundary\n"; 
    
    //Collect Filedata 
    foreach($files as $key => $file) 
    { 
        $fileContents = file_get_contents($file['tmp_name']); 
        
        $data .= "Content-Disposition: form-data; name=\"{$key}\"; filename=\"{$file['name']}\"\n"; 
        $data .= "Content-Type: image/jpeg\n"; 
        $data .= "Content-Transfer-Encoding: binary\n\n"; 
        $data .= $fileContents."\n"; 
        $data .= "--$boundary--\n"; 
    } 
  
    $params = array('http' => array( 
           'method' => 'POST', 
           'header' => 'Content-Type: multipart/form-data; boundary='.$boundary, 
           'content' => $data
        ), "ssl"=>array("verify_peer"=>false,"verify_peer_name"=>false)); 

   $ctx = stream_context_create($params); 
   $fp = fopen($url, 'rb', false, $ctx); 
   
   if (!$fp) { 
      throw new Exception("Problem with $url, $php_errormsg"); 
   } 
  
   $response = @stream_get_contents($fp); 
   if ($response === false) { 
      throw new Exception("Problem reading data from $url, $php_errormsg"); 
   } 
   return $response; 
}
/**
 Log
 @param string $url    url of the requested script
 @param array $data    hash array of request variables
 @return returns a hash array with response content and headers in the following form:
 */
function logFile($text)
{
	$ddf = fopen('./log/jsonfwd.log','a');
	fwrite($ddf,"[".date("r")."] [JSONFWD] $text \n");
	fclose($ddf);
}

/**
 * Indents a flat JSON string to make it more human-readable.
 *
 * @param string $json The original JSON string to process.
 *
 * @return string Indented version of the original JSON string.
 */
function indent($json) {

    $result      = '';
    $pos         = 0;
    $strLen      = strlen($json);
    $indentStr   = '  ';
    $newLine     = "\n";
    $prevChar    = '';
    $outOfQuotes = true;

    for ($i=0; $i<=$strLen; $i++) {

        // Grab the next character in the string.
        $char = substr($json, $i, 1);

        // Are we inside a quoted string?
        if ($char == '"' && $prevChar != '\\') {
            $outOfQuotes = !$outOfQuotes;
        
        // If this character is the end of an element, 
        // output a new line and indent the next line.
        } else if(($char == '}' || $char == ']') && $outOfQuotes) {
            $result .= $newLine;
            $pos --;
            for ($j=0; $j<$pos; $j++) {
                $result .= $indentStr;
            }
        }
        
        // Add the character to the result string.
        $result .= $char;

        // If the last character was the beginning of an element, 
        // output a new line and indent the next line.
        if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes) {
            $result .= $newLine;
            if ($char == '{' || $char == '[') {
                $pos ++;
            }
            
            for ($j = 0; $j < $pos; $j++) {
                $result .= $indentStr;
            }
        }
        
        $prevChar = $char;
    }

    return $newLine.$result;
}
?>

<?php

$q = trim($_GET['q']);
logFile('[URL_LLEGANDO]'.$q);
if ($q) {
	$q=str_replace(';','&',$q);
	
	$urls = explode(' ', $q);
	
	for ($i=0; $i<count($urls); $i++) {
		$url = $urls[$i];
		logFile('[URL]'.$url);
		if($_FILES==NULL)
		{
		$data = http_post($url, $_POST);

		logFile("Subiendo sin archivos");
		}
		else
		{
		$data = do_post_request($url, $_POST, $_FILES);
		logFile("Subiendo con archivos");
		}
		// Añadimos manejo de respuestas tipo String
        if(is_string($data)) {
            $json = $data;
        } else {
            $json = $data['content'];
        }
		echo $json;
		logFile('[CONTENIDO] '.indent($json));
	}
}
if($_GET['s']){
	echo "<script>alert(salida)</script>";
}
?>
