<?php

/*****************************************************************
Пример использования:

RemoteFile::setHeaders(array(
	'X-Requested-With: XMLHttpRequest',
	'Origin: http://vkontakte.ru',
	'Content-Type: application/x-www-form-urlencoded'
));
$headers = RemoteFile::getHeaders('http://cs4603.vkontakte.ru/u50132690/audio/432e2b109b94.mp3');
$html = RemoteFile::getData('http://vkontakte.ru/audio', array(
	'act'	=>'search',
	'q'		=> urlencode($this->_query)
))
*****************************************************************/

/**
 * Класс для работы с удаленными файлами
 * Реализован через библиотеку cURL
 *
 * @package classes
 * @author chez
 **/
class RemoteFile {

	private static $_timeout = 5;		// Таймаут ответа от сервера
	private static $_headers = array();	// Заголовки для отправки на сервер

	/**
	 * Отправка запроса и получение ответа от сервера
	 * Умеет возвращать текст ответа или заголовки
	 *
	 * @param string $url			URL запроса
	 * @param bool $headers			Флаг: возвращать заголовки, а не текст
	 * @param array $post_params	Массив POST-параметров, если установлен, то метод меняется на POST
	 * @return string				Ответ от сервера
	 * @author chez
	 **/
	private static function _exec($url, $headers = false, $post_params = array()) {
		if (count($post_params) > 0) {
			$p = '';
			foreach ($post_params as $key => $val) {
				$p .= '&'. $key .'='. $val;
			}
			$post_params = substr($p, 1);
		}
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_HTTPHEADER, self::$_headers);
		if ($headers) {
			curl_setopt($ch, CURLOPT_HEADER, 1);
			curl_setopt($ch, CURLOPT_NOBODY, 1);
		}
		if (is_string($post_params)) {
			curl_setopt($ch, CURLOPT_POST, 1);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $post_params);
		}
		curl_setopt($ch, CURLOPT_VERBOSE, 1);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, self::$_timeout);
		$r = curl_exec($ch);
		curl_close($ch);
		return $r;
	}

	/**
	 * Получение HTTP-заголовков ответа от сервера
	 *
	 * @param string $url			URL запроса
	 * @param array $post_params	Массив POST-параметров, если установлен, то метод меняется на POST
	 * @return array				Распарсеный массив заголовков
	 * @author chez
	 **/
	public static function getHeaders($url, $post_params = array()) {
		$headers = explode("\r\n", self::_exec($url, true));
		$headers_array = array();

		while(list($i, $header) = each($headers)) {
			if (substr($header, 0, 5) == 'HTTP/') {
				$header = explode(' ', $header);
				$headers_array['http'] = $header[1];
			} elseif ($header != '') {
				preg_match('/^([a-z0-9\-]*):\s(.*)$/Ui', $header, $m);
				$headers_array[strtolower(str_replace('-', '_', $m[1]))] = $m[2];
			}
		}

		return $headers_array;
	}

	/**
	 * Получение ответа от сервера
	 *
	 * @param string $url			URL запроса
	 * @param array $post_params	Массив POST-параметров, если установлен, то метод меняется на POST
	 * @return string				Тело ответа от сервера
	 * @author chez
	 **/
	public static function getData($url, $post_params = array()) {
		return self::_exec($url, false, $post_params);
	}

	/**
	 * Запись заголовков, которые будет отправлены вместе с запросом
	 *
	 * @param array $headers	Индексный массив заголовков
	 * @return void
	 * @author chez
	 **/
	public static function setHeaders($headers) {
		self::$_headers = $headers;
	}
}