Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- error_reporting(E_ALL);
- set_time_limit(10);
- session_start();
- // тут проверяем пользователя и пр.
- // кукисы будем сохранять между сессиями
- if ( !isset($_SESSION['proxy_cookie']) ) {
- $_SESSION['proxy_cookie'] = array();
- }
- if ( isset($_GET['url']) ) {
- $url = $_GET['url'];
- if ( ( $parts = parse_url($url) ) !== false && isset($parts['scheme']) && isset($parts['host']) ) {
- if ( preg_match('/^https?$/i', $parts['scheme']) ) {
- $ssl = strtolower($parts['scheme']) == 'https' ? 'ssl://' : '';
- $host = strtolower($parts['host']);
- $port = isset($parts['port']) ? $parts['port'] : ($ssl ? 443: 80);
- $uri = ( isset($parts['path']) ? $parts['path'] : '/' ) . ( isset($parts['query']) ? '?' . $parts['query'] : '' );
- $headers = getallheaders();
- $headers['Host'] = $host;
- // запрещаем серверу присылать закодированные данные
- $headers['Accept-Encoding'] = 'identity';
- $headers['Cookie'] = '';
- // заменяем keep-alive на close, чтобы не ждать закрытия соединения
- $headers['Connection'] = 'close';
- if ( isset($_SESSION['proxy_cookie'][$host]) && count($_SESSION['proxy_cookie'][$host]) ) {
- foreach ( $_SESSION['proxy_cookie'][$host] as $name => $value ) {
- $headers['Cookie'] .= "$name=$value; ";
- }
- }
- else {
- $_SESSION['proxy_cookie'][$host] = array();
- }
- // с HTTP/1.1 не хочет работать, возвращает какие-то 0 в конце
- $request = "{$_SERVER['REQUEST_METHOD']} $uri HTTP/1.0\r\n";
- foreach ($headers as $name => $value) {
- if ($value) {
- $request .= "$name: $value\r\n";
- }
- }
- $request .= "\r\n";
- if ( $body = file_get_contents('php://input') ) {
- $request .= $body;
- }
- // если показывает ошибку "fsockopen(): unable to connect to ssl://...", то нужно расскомментировать extension=php_openssl.dll в php.ini
- $fh = fsockopen("$ssl$host", $port, $errno, $errstr, 5);
- if ($fh) {
- fwrite($fh, $request);
- // читаем заголовки
- // потратил полдня пытаясь понять откуда у меня лишние символы и ноль в конце
- // http://ru.wikipedia.org/wiki/Chunked_transfer_encoding
- // парсим заголовки
- preg_match( '/^HTTP\/1\.[01]\s+([1-5]\d{2})/', fgets($fh), $matches );
- $status = @$matches[1];
- if ($status >= 200 && $status < 300) {
- $parse_headers = true;
- $data = '';
- while ( ( $line = fgets($fh) ) != false ) {
- if ($parse_headers) {
- $header = trim($line);
- if ($header == '') {
- $parse_headers = false;
- }
- else if ( preg_match('/^Content-Type:/i', $header) ) {
- header($header);
- }
- // куки сохраняем
- else if ( preg_match('/^Set-Cookie:\s+([^=]+)=([^;]*)/i', $header, $matches) ) {
- list(, $name, $value) = $matches;
- $_SESSION['proxy_cookie'][$host][$name] = $value;
- }
- }
- else {
- $data .= $line;
- }
- }
- echo($data);
- }
- // можно добавить поддержку перенаправления
- else {
- $error = 'запрос не был обработан';
- }
- }
- else {
- $error = mb_convert_encoding($errstr, 'utf-8', 'cp1251');
- }
- }
- else {
- $error = 'протокол не поддерживается';
- }
- }
- else {
- $error = 'неправильный URL';
- }
- }
- else {
- $error = 'не указан адрес';
- }
- if ( isset($error) ) {
- http_response_code(500);
- header('Content-type: text/plain; charset=utf-8');
- echo($error);
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment