PDA

View Full Version : [PHP] Proxy Server - Genymus


Genymus
07-06-2011, 20:35
Salve, torno con un nuovo progetto in cui sono in difficoltà.
Devo creare un http proxy server rigorosamente in php. ne ho fatto unabbozzo, che si connette al server e mi ritorna la pagina web che vado a chiamare.
Posto il codice:
<?php
set_time_limit(0);
while(true) {
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '127.0.0.1', 1000);
socket_listen($socket);
$client = socket_accept($socket);
$input = socket_read($client, 2048);

$url = explode("\r\n", $input);
$row = explode(" ", $url[0]);
$htp = explode("/", $row[1]);
for ($i=0;$i<count($htp);$i++) {
if ($htp[$i] == "") {
break;
}
}
$i++;


$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($server, $htp[$i], 80);
socket_write($server, $input, strlen($input));

$buffer = ('');
while (true) {
$temp = socket_read($server, 1024);
if ($temp!="") { $buffer.=$temp; } else { break; }
}
socket_close($server);
$output = ('');
$temp = explode("\r\n\r\n", $buffer);
for ($i=0;$i<count($temp);$i++) {
$output.= $temp[$i];
}

socket_write($client, ("HTTP/1.0 200 OK\r\nServer: HTTProxy 1.0\r\nConnection: close\r\nContent-Type: text/plain\r\n\r\n".$output));
if ($input=="CMD_SLS_CLOSE") { echo(" Socket Chiusa. Sent: '".$input."'"); break; }
socket_close($client);
socket_close($socket);
}
?>

Posto anche la pagina per la chiusura della socket che, finito il lavoro, resta nel ciclo while infinito:
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, "127.0.0.1", 1000);
$text = ("CMD_SLS_CLOSE");
socket_write($socket, $text, strlen($text));
socket_close($socket);
?>

Anche se il primo codice è solo una bozza (ritorna la pagina html completa anche di header), il funzionamento di un server proxy l'ho capito.
Un problema che mi rode è, ad esempio, che non carica la pagina di google.
E non capisco perchè, il ciclo infinito, non carichi le immagini.

Quello che più mi interessava sapere è questo:
Se dovessi mai fare un download (o ricevere un flusso di dati in stream), non posso certo aspettare che il proxy scarichi tutta la pagina e poi la mandi al computer che la richiede... come faccio quindi a gestire lo stream?
Ho provato a cercare tutorial sulle socket, e mi sono letto quasi tutte le informazioni disponibili sul sito ufficiale di php.

Ricordo che il proxy, non dovrà essere web (con un form di inoltro e una pagina di visualizzazione), ma un semplice inoltro di header con relativi dati (es: CLIENT > PROXY > SERVER > PROXY > CLIENT)... in poche parole devo connettermi modificando le impostazioni da OPZIONI > AVANZATE > RETE > IMPOSTAZIONI ... proxy di Firefox.
Grazie

Genymus