1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| <? /** * Функция возвращает массив кук по заданному запросу * * @author zg * @param string $uri Адрес запроса * @param array $params Параметры запроса * @param string $method Метод запроса * @return array */ function getUriCookies( $uri, $params = null, $method = null ) { if ( !isset($method) )$method = 'GET'; if ( $method !== 'GET' && $method !== 'POST' ) throw new Exception('Function '. __FUNCTION__ .'(): Invalid method '. $method .'. Must be GET or POST.'); // Парсим запрос $url = parse_url( $uri ); // Получаем данные из адреса запроса $host = isset($url['host']) ? $url['host'] : null; $path = isset($url['path']) ? $url['path'] : null; $query = isset($url['query']) ? $url['query'] : null; // Защита от нулевого хоста if ( !$host ) throw new Exception('Function '. __FUNCTION__ .'(): Invalid hostname in URI "'. $uri .'".'); // Строим массив параметров $outParams = array(); // Заполняем массив параметров из строки запроса if ( isset($query) ) parse_str($query, $outParams); // Добавляем параметры из аргументов функции, если метод GET if ( $method === 'GET' && is_array($params) ) $outParams = array_merge( $outParams, $params ); // Получаем результирующий запрос $query = http_build_query( $outParams ); // Формируем заголовки $headers = array(); // Общие заголовки $headers[] = $method .' '. $path .'?'. $query .' HTTP/1.0'; $headers[] = 'Host: '. $host; // Тело запроса $content = null; // Если метод запроса POST if ( $method === 'POST' && is_array( $params ) ) { // Добавляем параметры запроса $headers[] = 'Content-type: application/x-www-form-urlencoded'; $content = http_build_query($params); } // Дбоавляем к заголовкам тело запроса $headers[] = 'Content-length: '. strlen($content); $headers[] = 'Connection: close'; $headers[] = ''; $headers[] = $content; // Формируем запрос $request = join("rn", $headers); // Открываем сокет для записи $fp = @fsockopen($host, 80, $errno, $error); // Проверка правильности открытия сокета if ( !$fp ) throw new Exception('Function '. __FUNCTION__ .'(): Filed open URL '. $uri .''); // Посылаем запрос fputs($fp, $request); // Массив результата $result = array(); // Считываем ответ построчно while ( !feof($fp) ) { $line = trim(fgets( $fp )); // Меня интерисует только заголовок if ( !$line ) break; // В заголовке меня интерисуют только куки @list($field, $value) = preg_split('/s*:s*/', $line, 2); // Запоминаем найденную куку if ( strtolower($field) === 'set-cookie' ) { // Точнее, запоминаем только само значение куки (недекодированное) $result[] = array_shift(preg_split('/s*;s*/', $value, 2)); } } // Тут можно сделать обработку тела ответа, например, проверку результата логирования // но это специфичный код, поэтому я его опущу // Вывод тела ответа //fpassthru($fp); // Закрываем сокет fclose($fp); // Возвращаем массив результата return $result; } ?> |