среда, 22 января 2014 г.

Вывод 404-й страницы в Symfony2 с учётом авторизации

Появилась задача для 404-й ошибки выводить разные шаблоны в зависимости от того авторизован ли пользователь. Оказалось что стандартными средствами Symfony это сделать не получится, так как с версии 2.1 система рутинга запускается до компонента security:
The Firewall listener is now registered after the Router listener. This means that specific Firewall URLs (like /login_check and /logout) must now have proper routes defined in your routing configuration. Also, if you have a custom 404 error page, make sure that you do not use any security related features such as is_granted on it.
Источник - https://github.com/symfony/symfony/blob/master/UPGRADE-2.1.md#security

Получается, что в шаблоне 404-й страницы или переопределив контроллер для данной страницы не получится определить авторизован пользователь или нет.

Также обнаружился тикет на гитхабе где авторы Symfony разводят руками и говорят, что это меньшее зло из того что может получиться если вернуть данную возможность обратно - https://github.com/symfony/symfony/issues/8414
fabpot commented:
Well, the decision to let Symfony behaves like this has been well thought out at the time we changed the behavior. We faced a challenge: it was either this bug or many other ones that were bigger in my book.
Of course, anyone can prove me wrong by having a look at the code and see if a patch can fix it. But I don't see how we can "fix" this issue and not re-introduce the other ones (everything is covered with tests so if a patch creates a regression here, we will have failing tests).
Примечательно, что это первое ограничение такого плана с которым удалось столкнуться.

пятница, 17 декабря 2010 г.

Парсинг кириллических доменов через Curl

Появилась задача распарсить содержание сайта с кириллическим доменом.
Попробовал вставить ссылку в стандартную обёртку для Curl в PHP. Оказалось, что Curl не работает с такими ссылками. Чего и следовало ожидать :)

Покопавшись в Интернете, нашёл следующую информацию:
Для интернационализированных доменных имен решение, предлагаемое ICANN, основано на использовании преобразования Puny Code, которое трансформирует набор кодовых символов Unicode (как правило, UTF-8) в цепь символов ASCII уникальным и обратимым способом. Например, в названии доменного имени «académie-française.org» буквы с апострофами не являются кодами ASCII. Puny Code преобразует данное доменное имя в «xn—acadmie-franaise-npb1a.org», а, например, http://русский.idn.icann.org превращает в http://xn—h1acbxfam.idn.icann.org. При этом знаки, не являющиеся кодами ASCII, пропадают в таком названии.
Взято отсюда: http://www.emag.iis.ru/arc/infosoc/emag.nsf/BPA/69dd2e0bf42863e8c325758a003fd78d

Из сказанного выше следует,что до кириллических  доменов можно достучаться ещё и по альтернативному адресу закодированному в Puny Code. Как показывает тестирование, как браузер, так и Curl отлично понимают адреса закодированные через Puny Code. То есть в принципе есть возможность распарсить кириллический домен, нужно только знать его закодированный адрес.

Для перекодирования доменного имени можно воспользоваться готовым решением., которое представлено тут http://www.phpclasses.org/browse/file/5845.html

Приведу решение на PHP для перекодирования доменного имени и получения содержимого страницы через Curl.

<?php

include_once('idna_convert.class.php');

$url = 'http://кириллическийдомен.рф';

$converter = new idna_convert();
$domain = parse_url($url, PHP_URL_HOST);
$encoded_domain = $converter->encode($domain);
$url = str_replace($domain, $encoded_domain, $url);

$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_TIMEOUT, 30);
curl_setopt($resource, CURLOPT_MAXREDIRS, 10);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($resource);

curl_close($resource);
?>
Код максимально упрощён для понимания сути решения.