Регистрация...

Eserv Forum / E3 / Eserv 3 Web and FTP Servers Support / Parser или проблема PATH_INFO

imported // (v1)
Продукты и услуги Скачать Документация Купить Поддержка Форумы Партнёрам Статьи О компании
Новости
12.10.2009
Переезд завершен
Упёрся в невозможность запустить скрипт на движке Parser. Ругается на некорректный формат вызова. По исходникам движка разобрались, что ему не нравится содержимое PATH_INFO. Причём он там ожидает совсем не то, что под этим понимает стандартный acWEB и я вместе с ним. Думал даже, что я ошибся, разбирая исходники acWEB. Ударился в поиск и наковырял следующее:
В стандарте про PATH_INFO сказано довольно туманно (наилучшее приближение в русском переводе выполнил Кирилл Максимов на Citforum, в оригинале сказано чуть больше, но понятнее от этого не становится), оригинал сождержит в себе ссылки на демонстрационные скрипты, которые (видимо, за давностью лет) куда-то подевались.
Часть авторов, в том числе ряд преподавателей (см. официальную лекцию или её вариант), полагают, что PATH_INFO должна содержать копию REQUEST_URI.
Практики, работающие с Apache (см. материалы лабораторного практикума) и Perl (см. главу из учебника) придерживаются мнения, что в PATH_INFO следует передавать несопоставленный существующему физическому пути остаток URI, не содержащий параметров запроса (то есть, до знака вопроса). Я понимаю так, что это реализовано в Apache и перенесено как стандарт де-факто в acWEB.

Проблема в том, что разработчики Parser придерживаются первой точки зрения, то есть, ожидают в PATH_INFO URI запроса целиком. Подозреваю, что не они одни, а и разработчики PHP тоже, судя по введённому в ISAPI "бардаку" с подменой PATH_INFO. Убедить их вряд ли получится, поэтому есть предложение, подкупающее своей новизной:
  • в acWEB "атомарным" словом назначить REAL_PATH_INFO, прямо в var.f:
  • : REAL_PATH_INFO $PATH_INFO @ STR@ ;
  • там же добавить специальный флажок, его значение можно будет задавать в OnRequest в зависимости от типа обработчика:
  • USER-VALUE PathInfoMode
  • слово PATH_INFO определить единожды в cgi.f или даже в var.f:
  • : PATH_INFO PathInfoMode IF URI ELSE REAL_PATH_INFO THEN ;
    Думаю, что это снимет проблему выбора, что именно в переменную записывать. Точнее, проблема будет переложена на администратора сервера, которому виднее.
P.S. Я ещё не разбирался, что Parser хочет увидеть в ISAPI-режиме (и как это вообще включается), поэтому затрудняюсь сказать, что должно быть предпринято в отношении SCRIPT_NAME.
 
Комментарии к этой версии (05.02.2006 23:28) [~pig] dbf6da8d
АвторДатаТекстtags
ac06.02.2006 04:22
Подстраиваться под IIS, Apache, PHP и Perl я согласен (собственно этим и занимался, поэтому acWEB в нынешнем виде — идеальный компромисс, на котором без донастройки работают практически все популярные скрипты, в т.ч. использующие PATH_INFO). Про Parser я слышал и читал, но не могу вспомнить ни одного полезного изделия на этом движке. Может ну его? Или там уже появился какой-то killer app, достойный поддержки?
imported
pig06.02.2006 11:57
Наш вебмастер — большой поклонник Парсера. То есть, он вообще всё на нём делает. Сейчас заканчивает разработку нашего нового сайта — динамического, с наполнением всеми допущенными сотрудниками и прочими красивостями. Вокруг Парсера достаточно большое сообщество пользователей крутится, отбрасывать их тоже не хочется.
Я бы для себя пропатчил слово, да оно в isapi.f перекрыто, а патчить длиннющий CgiEnvir совсем уж влом.
imported
ac09.02.2006 06:36
Хорошо, разрешим Парсеру жить и под Eserv Новый exe (где его брать — знаете) уже поставил и на этом сайте, так что следите за побочными эффектами, if any. И пишите, что добавить в OnRequest.

А вебмастеру передайте, что создатели Парсера предательски набирают в штат ASP.NET-программеров — не к добру это (для развития парсера)
imported
ac09.02.2006 07:11
pig пишет: P.S. Я ещё не разбирался, что Parser хочет увидеть в ISAPI-режиме (и как это вообще включается), поэтому затрудняюсь сказать, что должно быть предпринято в отношении SCRIPT_NAME.


ISAPI для парсера включается в стартапе так:
S" C:\parser3\parser3isapi.dll" IsapiExtension: PARSER3 а в OnRequest, cоответственно, примерно так:
File *parser*test.html | Isapi PARSER3

Только вот не работает... Parser вызывает переполнение буфера (так Windows при снятии задачи говорит). Так что, до выяснения обстоятельств, используйте CGI-режим.
imported
pig09.02.2006 11:06
В OnRequest должно быть что-то типа:
File *\\phtml-area\\*.html | Cgi C:\parser3\parser3.exe TRUE TO PathInfoMode


P.S. За подсказку про ISAPI спасибо. Недостающее звено!

P.P.S. Слово IsapiExtension: имя расширения получает через ParseStr или NextWord?
imported
ac09.02.2006 12:15
pig пишет: P.P.S. Слово IsapiExtension: имя расширения получает через ParseStr или NextWord?

~ac/lib/win/isapi/isapi.f
Через CREATE, т.е. NextWord.
imported
pig09.02.2006 12:23
Да, забыл... сегодня что-то с головой совсем туго...
В ISAPI-режиме (для PHP точно) надо тоже TRUE TO PathInfoMode
imported
ac09.02.2006 12:30
Я это прямо в код вызова ISAPI поставил:

: EXEC_ISAPI
    TRUE TO PathInfoMode
...
imported
ac09.02.2006 12:32
pig пишет: В OnRequest должно быть что-то типа:
File *\\phtml-area\\*.html | Cgi C:\parser3\parser3.exe TRUE TO PathInfoMode


Так заработали в этом режиме программы вашего вебмастера, можно ставить галочку?
imported
pig09.02.2006 13:34
Опыты отложены на пятницу. Сегодня будем переносить почтовую систему на другой диск, текущий рабочий сыплется.
imported
pig10.02.2006 13:33
Что-то он, гад, ещё хочет. Буду копать дальше. Только бы не SCRIPT_NAME
imported
pig10.02.2006 14:39
А проблема, похоже, именно в SCRIPT_NAME. Если в CGI включаю PathInfoMode, SCRIPT_NAME получается пустой. То есть, в CgiEnvir надо заменить PATH_INFO на REAL_PATH_INFO — кроме собственно передачи PATH_INFO в Environment.

Ещё увидел: DOCUMENT_ROOT передаётся как есть, без учёта смены текущего каталога (если задан был относительно). Наверное, надо ему MakeFullName сделать?
imported
ac10.02.2006 18:02
acWEB.exe с измененным SCRIPT_NAME перезакачал (на наш сайт пока не ставлю). Попробуйте.

DOCUMENT_ROOT — нестандартная переменная (нет в http://hoohoo.ncsa.uiuc.edu/cgi/env.html). Из известных программ её использует только "Битрикс: Управление сайтом", и acWEB с ней совместим и в CGI, и в ISAPI-режиме. Попробуйте ставить в DocumentRoot: полный путь — если это поможет, то можно будет и такую опцию поставить.
imported
pig10.02.2006 20:13
Ещё что-то хочет, негодяй... Всё, больше по пустякам донимать не буду, разберусь сначала сам, какого рожна ему надо.
imported
ac10.02.2006 20:28
Да, если бы они исходники предоставляли, как все приличные люди, было бы проще разобраться — что этот парсер от сервера хочет. Исходник соответствующей части PHP помню наизусть — столько с ним биться пришлось, пока придумал, как ублажить одновременно Perl и PHP в ISAPI
imported
pig11.02.2006 01:06
Исходники есть, раскопаем.
imported
pig14.02.2006 20:21
Полазал, посмотрел, что он на самом деле ожидает. Похоже, что я его неправильно позиционировал. Я думал, что Парсер — обработчик скриптов, а он считает, что он сам скрипт. А то, что я полагал скриптом — это действительно PATH_INFO. Но при этом его категорическое требование — чтобы сам Парсер в REQUEST_URI упомянут не был. Вот цитата из справки по исходникам:
00419 /* 00420 http://parser3/env.html?123 =OK 00421 $request:uri=/env.html?123 00422 REQUEST_URI='/env.html?123' 00423 SCRIPT_NAME='/cgi-bin/parser3' 00424 PATH_INFO='/env.html' 00425 00426 http://parser3/cgi-bin/parser3/env.html?123 =ERROR 00427 $request:uri=/cgi-bin/parser3/env.html?123 00428 REQUEST_URI='/cgi-bin/parser3/env.html?123' 00429 SCRIPT_NAME='/cgi-bin/parser3' 00430 PATH_INFO='/env.html' 00431 */ 00432 size_t script_name_len=strlen(script_name); 00433 size_t uri_len=strlen(env_request_uri); 00434 if(strncmp(env_request_uri, script_name, script_name_len)==0 && 00435 script_name_len != uri_len) // under IIS they are the same 00436 SAPI::die("CGI: illegal call (1)");

Ухожу в глубокую задумчивость...
imported
ac15.02.2006 15:28
А, так может его так и пускать, как самый старорежимный CGI — с указанием exe в урле?

Т.е. так:
Uri /cgi-bin/parser.exe* | Cgi /cgi-bin/parser.exe

(для красоты урла exe можно и убрать из имени файла).
imported
pig15.02.2006 16:26
Думал об этом. Причём давить надо (и для красоты, и чтобы совпало с примером) весь /cgi-bin/и.так.далее. Но не хочется мешать движок с данными — тем более, что Парсер под Апачем каким-то макаром ухитряется жить в совершенно отдельной от данных ветке каталога. Не использует ли он для этого DOCUMENT_ROOT или что-то такое же нестандартное? Поковыряю..
imported
pig17.02.2006 02:39
Сегодня после раздумий завёл его с такой извращённой подменой:
PATH_INFO = SCRIPT_NAME
SCRIPT_NAME = CGI_HANDLER
Попутно выяснил, что в минимальном режиме (без дополнительных пользовательских настроек) Parser нуждается в абсолютном DOCUMENT_ROOT — иначе ругань на Unhandled Exception.

А самое забавное — у Парсера есть возможность указать в настройках собственный отдельный DOCUMENT_ROOT, и тогда его, по идее, можно пускать как обычный скрипт, без извратов. Подумаю теперь над этим.
imported
ac02.03.2006 00:42
http://www.eserv.ru/download/acWEB.exe
  • включает предложенные вами исправления uParserMode. Проверьте, пожалуйста, верно ли я применил патч.
imported
pig02.03.2006 13:13
Всё замечательно работает. Подружили
imported
Работает на Eserv/5.05567 (10.02.2020)