четверг, 20 сентября 2007 г.

Поиск в Google Maps

Врядли кто-то из жителей Комсомольска-на-Амуре знает где находится улица Путейская. Конечно кроме непосредственно живущих на ней :-). Когда мне там что-то понадобилось, блиц-опрос окружающих ничего не дал. Как ни странно, в итоге мне помог интернет, а конкретно поиск на сервисе Google Maps. Достаточно было в поисковую строку ввести фразу «Комсомольск-на-Амуре, ул. Путейская» и сразу получил карту города отцентрованную на искомой улице. А также возможнось встроить фрагмент карты в веб-страничку, чем здесь и воспользовался:


Просмотреть увеличенную карту

А улица Путейская оказалась в той ещё жопе, не удивительно что раньше я про неё не слышал.

понедельник, 3 сентября 2007 г.

Catalyst, HTTP авторизация и FastCGI

Описанный ранее способ использования http-авторизации в Catalyst проектах упорно не хотел работать с FastCGI протоколом. Использовалось:

  1. Веб-сервер apache версии 2.2.x.
  2. Модуль подержки протокола FactCGI для веб-сервера apache — mod_fascgi версии 2.4.2. Кстати, mod_fastcgi для apache 2.2 без небольшого патча не собирается. Смотри здесь.
  3. Движок Catalyst для обработки запросов по протоколу FastCGI — Catalyst::Engine::FastCGI.

В итоге оказалось две причины:

  1. По протоколу CGI http-заголовок Authorization должен передаваться внешнему приложению в качестве одноименной переменной окружения. Почему-то модуль mod_fastcgi по-умолчанию этого не делает, однако предусматривает специальную опцию -pass-header при передаче запроса FastCGI обработчику. Пример использования в файле конфигурации apache — httpd.conf:

    FastCgiServer                           \
        /root/MyApp/script/myapp_fastcgi.pl \
        -pass-header Authorization
  2. После этого стала доступна переменная окружения Authorization, однако плугин Authentication::Credential::HTTP всё ещё не работал! Дальше пришлось залезть в исходники библиотек Catalyst. Ошибка обнаружилась не в движке Catalyst::Engine::FastCGI, а в его базовом классе Catalyst::Engine::CGI. Из чего с увереностью можно сказать, что и движок Catalyst::Engine::CGI некорректно работает с http-авторизацией. После внесения следующих исправлений всё встало на свои места:

    @@ -95,7 +95,7 @@
     
         # Read headers from %ENV
         while ( my ( $header, $value ) = each %ENV ) {
    -        next unless $header =~ /^(?:HTTP|CONTENT|COOKIE)/i;
    +        next unless $header =~ /^(?:HTTP|CONTENT|COOKIE|Authorization)/i;
             ( my $field = $header ) =~ s/^HTTPS?_//;
             $c->req->headers->header( $field => $value );
         }

На моё сообщение в список рассылки Catalyst не последовало никакой реакции и ошибка сохраняется до сих пор — версия Catalyst::Runtime 5.7010 на текущий момент.