stuppid_bot

Untitled

Jun 4th, 2013
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.01 KB | None | 0 0
  1. /**
  2.  * Отправляет http-запрос от имени сервера.
  3.  *
  4.  * @param string $method
  5.  * @param string $url
  6.  * @param array $options['headers'] дополнительные заголовки
  7.  * @param string $options['body'] тело запроса
  8.  * @return mixed
  9.  */
  10. function proxy_request( $method, $url, $options = array() ) {
  11.     $method = strtoupper($method);
  12.     $parts = @parse_url($url);
  13.    
  14.     if ($parts === false) {
  15.         die('url malformed');
  16.     }
  17.    
  18.     $scheme = isset($parts['scheme']) ? strtolower($parts['scheme']) : 'http';
  19.        
  20.     if ($scheme != 'http' && $scheme != 'https') {
  21.         die('only http and https are allowed');
  22.     }
  23.    
  24.     $protocol = $scheme == 'http' ? 'tcp' : 'ssl';      
  25.     $host = strtolower( isset($parts['host']) ? $parts['host'] : getenv('HTTP_HOST') );
  26.     $port = isset($parts['port']) ? $parts['port'] : ($protocol == 'tcp' ? 80 : 443);
  27.     $uri = (isset($parts['path']) ? $parts['path'] : '/') . (isset($parts['query']) ? '?' . $parts['query'] : '');  
  28.     $request = "$method $uri HTTP/1.1\r\n";
  29.     $request .= "Host: $host\r\n";
  30.     $headers = isset($options['headers']) ? $options['headers'] : array();
  31.    
  32.     foreach ($headers as $k => $v) {
  33.         $request .= "$k: $v\r\n";
  34.     }
  35.    
  36.     $request .= "Connection: close\r\n\r\n";
  37.    
  38.     if ( isset($options['body']) ) {
  39.         $request .= $options['body'];
  40.     }
  41.    
  42.     $fp = @fsockopen("$protocol://$host", $port, $errno, $errstr, 5);
  43.    
  44.     if (!$fp) {
  45.         die("could not connect: $errstr ($errno)");
  46.     }
  47.    
  48.     fwrite($fp, $request);  
  49.     $cur = fgets($fp);
  50.    
  51.     if ( !preg_match('#^HTTP/(\d+\.\d+) ([1-5]\d{2})(.*)$#', $cur, $matches) ) {
  52.         die('bad response');
  53.     }
  54.    
  55.     $response = array();
  56.     $response['scheme'] = $scheme;
  57.     $response['host'] = $host;
  58.     $response['port'] = $port;
  59.     $response['uri'] = $uri;
  60.     $response['http_version'] = $matches[1];
  61.     $response['status'] = $matches[2];  
  62.     $response['status_text'] = trim($matches[3]);
  63.     $headers = array();
  64.        
  65.     while ( !feof($fp) ) {
  66.         $line = rtrim( fgets($fp) );
  67.        
  68.         if ($line === '') {
  69.             break;
  70.         }
  71.        
  72.         list($name, $value) = explode(': ', $line, 2);
  73.         $name = strtolower($name);
  74.        
  75.         if ($name == 'set-cookie') {
  76.             if ( !isset($headers[$name]) ) {
  77.                 $headers[$name] = array();
  78.             }
  79.            
  80.             $headers[$name][] = $value;
  81.         }
  82.         else if ( isset($headers[$name]) ) {
  83.             $headers[$name] .= ", $value";
  84.         }
  85.         else {
  86.             $headers[$name] = $value;
  87.         }
  88.     }
  89.    
  90.     $body = '';
  91.     $transfer_encoding = isset($headers['transfer-encoding']) ? strtolower($headers['transfer-encoding']) : '';
  92.     $content_length = (int) @$headers['content-length'];
  93.    
  94.     if ($transfer_encoding == 'chunked') {
  95.         while ( !feof($fp) ) {
  96.             $block = rtrim( fgets($fp) );
  97.             $size = (int) base_convert($block, 16, 10);
  98.             // fread почему-то не читает строку указанного размера
  99.             $chunk = stream_get_contents($fp, $size);
  100.             $body .= $chunk;
  101.             // пропускаем \r\n
  102.             fread($fp, 2);
  103.         }
  104.     }
  105.     else if ($content_length) {
  106.         $body = stream_get_contents($fp, $content_length);
  107.     }
  108.     else {
  109.         while ( !feof($fp) ) {
  110.             $body .= fread($fp, 4096);
  111.         }
  112.     }
  113.    
  114.     $content_encoding = isset($headers['content-encoding']) ? strtolower($headers['content-encoding']) : '';
  115.     // сжатые данные
  116.     if ($content_encoding) {
  117.         if ($content_encoding == 'gzip') {
  118.             $body = gzdecode($body);
  119.         }
  120.         else if ($content_encoding == 'deflate') {
  121.             $body = gzinflate($body);
  122.         }
  123.     }
  124.    
  125.     $response['headers'] = $headers;
  126.     $response['body'] = $body;  
  127.     return $response;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment