пятница, 4 сентября 2009 г.

Учим сниппет FeedX работать через SSL

На днях по работе столкнулся с необходимостью забирать XML с веб-сервиса, парсить его и показывать на сайте. Так как разработка идёт на MODx, то сразу же решил, что для этой задачи буду пользоваться сниппетом FeedX - готовое решение, которое, к тому же неплохо себя зарекомендовало на других проектах. И всё бы ничего, если бы не одно "но". Веб-сервис, с которым предстояло работать, функционирует через SSL протокол, а FeedX его не понимает.

После беглого поиска выяснилось, что с такой задачей либо никто не сталкивался, либо пожадничал делиться решением :) Так или иначе решения я не нашёл и принялся писать своё. Так как ничего особо сложного в нём нет, то и разжёвывать ничего не буду. Берите и пользуйтесь :)

  1. Модифицируем код сниппета и добавляем в него ещё один параметр - &ssl:
    $params['ssl'] = isset($ssl) ? intval($ssl) : 0;
    // Set &ssl to 1 for SSL support
  2. Далее редактируем feedx.class.inc.php. В строке 275 находим
    // Retrieve and parse feed
    if (function_exists('curl_init'))
    {
    // Use curl to retrieve feed
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $this->config['url']);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $this->config['timeout']);
    $xml = curl_exec($curl);
    if (curl_errno($curl) !== 0) $success = false; // An error occured
    curl_close($curl);
    }
    и меняем на
    // Retrieve and parse feed
    if (function_exists('curl_init'))
    {
    if ($this->config['ssl']==1) {
    // Use SSL cURL call to retrieve feed
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);
    curl_setopt($curl, CURLOPT_URL,$this->config['url']);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    $xml=curl_exec ($curl);
    if (curl_errno($curl) !== 0) $success = false; // An error occured
    curl_close ($curl);
    } else {
    // Use curl to retrieve feed
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $this->config['url']);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $this->config['timeout']);
    $xml = curl_exec($curl);
    if (curl_errno($curl) !== 0) $success = false; // An error occured
    curl_close($curl);
    }
    }

Вот и всё! Теперь при вызове FeedX-а просто укажите в параметрах &ssl=`1` и сниппет отработает через SSL протокол.

Комментариев нет: