stuppid_bot

Простой прокси сервер на PHP(используется через Ajax)

May 10th, 2013
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 5.03 KB | None | 0 0
  1. <?php
  2.  
  3. error_reporting(E_ALL);
  4. set_time_limit(10);
  5. session_start();
  6. // тут проверяем пользователя и пр.
  7. // кукисы будем сохранять между сессиями
  8. if ( !isset($_SESSION['proxy_cookie']) ) {
  9.     $_SESSION['proxy_cookie'] = array();
  10. }
  11.  
  12. if ( isset($_GET['url']) ) {
  13.     $url = $_GET['url'];
  14.    
  15.     if ( ( $parts = parse_url($url) ) !== false && isset($parts['scheme']) && isset($parts['host']) ) {  
  16.         if ( preg_match('/^https?$/i', $parts['scheme']) ) {
  17.             $ssl = strtolower($parts['scheme']) == 'https' ? 'ssl://' : '';
  18.             $host = strtolower($parts['host']);
  19.             $port = isset($parts['port']) ? $parts['port'] : ($ssl ? 443: 80);
  20.             $uri = ( isset($parts['path']) ? $parts['path'] : '/' ) . ( isset($parts['query']) ? '?' . $parts['query'] : '' );                                                      
  21.             $headers = getallheaders();
  22.             $headers['Host'] = $host;
  23.             // запрещаем серверу присылать закодированные данные
  24.             $headers['Accept-Encoding'] = 'identity';
  25.             $headers['Cookie'] = '';
  26.             // заменяем keep-alive на close, чтобы не ждать закрытия соединения
  27.             $headers['Connection'] = 'close';
  28.            
  29.             if ( isset($_SESSION['proxy_cookie'][$host]) && count($_SESSION['proxy_cookie'][$host]) ) {
  30.                 foreach ( $_SESSION['proxy_cookie'][$host] as $name => $value ) {
  31.                     $headers['Cookie'] .= "$name=$value; ";
  32.                 }
  33.             }
  34.             else {
  35.                 $_SESSION['proxy_cookie'][$host] = array();
  36.             }
  37.            
  38.             // с HTTP/1.1 не хочет работать, возвращает какие-то 0 в конце
  39.             $request = "{$_SERVER['REQUEST_METHOD']} $uri HTTP/1.0\r\n";
  40.            
  41.             foreach ($headers as $name => $value) {
  42.                 if ($value) {
  43.                     $request .= "$name: $value\r\n";
  44.                 }
  45.             }
  46.            
  47.             $request .= "\r\n";
  48.            
  49.             if ( $body = file_get_contents('php://input') ) {
  50.                 $request .= $body;
  51.             }
  52.                      
  53.             // если показывает ошибку "fsockopen(): unable to connect to ssl://...", то нужно расскомментировать extension=php_openssl.dll в php.ini
  54.             $fh = fsockopen("$ssl$host", $port, $errno, $errstr, 5);
  55.            
  56.             if ($fh) {
  57.                 fwrite($fh, $request);
  58.                 // читаем заголовки
  59.                
  60.                 // потратил полдня пытаясь понять откуда у меня лишние символы и ноль в конце
  61.                 // http://ru.wikipedia.org/wiki/Chunked_transfer_encoding
  62.                 // парсим заголовки
  63.                 preg_match( '/^HTTP\/1\.[01]\s+([1-5]\d{2})/', fgets($fh), $matches );
  64.                 $status = @$matches[1];
  65.                
  66.                 if ($status >= 200 && $status < 300) {
  67.                     $parse_headers = true;
  68.                     $data = '';
  69.                    
  70.                     while ( ( $line = fgets($fh) ) != false ) {
  71.                         if ($parse_headers) {
  72.                             $header = trim($line);
  73.  
  74.                             if ($header == '') {
  75.                                 $parse_headers = false;
  76.                             }
  77.                             else if ( preg_match('/^Content-Type:/i', $header) ) {
  78.                                 header($header);
  79.                             }
  80.                             // куки сохраняем
  81.                             else if ( preg_match('/^Set-Cookie:\s+([^=]+)=([^;]*)/i', $header, $matches) ) {
  82.                                 list(, $name, $value) = $matches;
  83.                                 $_SESSION['proxy_cookie'][$host][$name] = $value;
  84.                             }
  85.                         }
  86.                         else {
  87.                             $data .= $line;
  88.                         }
  89.                     }
  90.                    
  91.                     echo($data);
  92.                 }
  93.                 // можно добавить поддержку перенаправления
  94.                 else {
  95.                     $error = 'запрос не был обработан';
  96.                 }              
  97.             }
  98.             else {
  99.                 $error = mb_convert_encoding($errstr, 'utf-8', 'cp1251');
  100.             }
  101.         }
  102.         else {
  103.             $error = 'протокол не поддерживается';
  104.         }
  105.     }
  106.     else {
  107.         $error = 'неправильный URL';
  108.     }
  109. }
  110. else {
  111.     $error = 'не указан адрес';
  112. }
  113.  
  114. if ( isset($error) ) {
  115.     http_response_code(500);
  116.     header('Content-type: text/plain; charset=utf-8');
  117.     echo($error);
  118. }
  119.  
  120. ?>
Advertisement
Add Comment
Please, Sign In to add comment