CG/PL: п╬п╠я─п╟п╠п╬я┌п╨п╟ HTTP п╥п╟п©я─п╬я│п╬п╡

От: Alexey Naidyonov <CGatePro_at_mx_ru>
Дата: Tue 07 Nov 2006 - 12:04:36 MSK


Владимир, добрый день.

Возможно ли реализовать механизм для обработки HTTP запросов с помощью CG/PL программ? Например так:

1. В настройках HTTP модуля добавляется настройка "CG/PL Applications":

CG/PL Common URL Prefix: /cgpl
CG/PL Account URL Prefix: /cgpl

URL Task
acd/queuestate acd.ajaxui.getqueuestate acd/queuecmd acd.ajaxui.issuequeuecmd ~/conf/userlist personalconference.ajaxui.getuserlist ...

2. При запросе на URL http://server/cgpl/acd/queuestate или http://server/~username/cgpl/conf/userlist запускается соответствующая задача, которая получает на вход словарь с запросом
(Vars().httpRequest). Задача запускается в специальном режиме, функции,
которые связаны с обработкой сигналов, будут возвращать ошибки, но при этом задача можно стартовать другие задачи и участвовать в обмене сообщениями и синхронизации.

3. В принципе, этот механизм нужен только для управления, понятно, что закачивать/скачивать файлы таким образом никто не будет, у CGP есть для этого более удобные механизмы. Поэтому можно ограничить размер входящего запроса, и отдавать тело запроса в виде строки из словаря
(Vars().httpRequest.body).

4. Для выдачи информации обратно, тем не менее, хочется все-таки иметь возможность писать в поток, чанками.

Зачем это нужно:
- для решения задач управления приложением, когда мы не можем отдать XIMSS. Например, это внешний абонент, который принимает участие в конференции "нашего" абонента. Он авторизован (знанием пин-кода, который дал ему "наш" абонент), но давать ему доступ по XIMSS мы не можем. Опять же, это полностью решается внешним прокси (который к CGP уже может быть подключен по XIMSS), но хотелось бы обойтись без него. Я не буду описывать подробно функции, которые, на мой взгляд, понадобятся, просто приведу кусок кода "как нам было бы удобно". Если есть надежда, что такая возможность появится -- с удовольствием потрачу время на проектирование api с т.з. разработчика.

entry main is
  req = Vars().httpRequest;
  query = TextToObject(req.body);
  if query != null and then IsDictionary(query) then     res = newDictionary();
    res.rc = 200;
    ...
    res.body = ObjectToString(queryResult);     res.header.("Content-Type") = "text/cgp-dictionary";     HTTPSendResponse(res);
  else
    res = newDictionary();
    res.rc = 500;
    res.body = "<HTML><BODY>Error parsing query</BODY></HTML>";     HTTPSendResponse(res);
  end if;
end entry;

entry main is
  req = Vars().httpRequest;
  confId = req.queryParam.("confId");
  if RemoteAuthentication() != null then     res = newDictionary();

    res.rc = 200;
    res.header.("Content-Type") = "text/html";
    res.header.("Transfer-Encoding") = "chunked";
    HTTPSendResponseHeaders(res);
    HTTPOpenStream();
    HTTPWrite("<HTML><BODY>");
    while ... loop
       ...
       HTTPWrite(....);

    end loop;
    HTTPWrite("</BODY></HTML>");
    HTTPCloseStream();
  else
    res = newDictionary();
    res.rc = 403;
    res.body = "<HTML><BODY>Access denied</BODY></HTML>";     HTTPSendResponse(res);
  end if;
end entry;

SY,
--
Alexey Naidyonov
ITooLabs Получено Tue Nov 07 09:04:38 2006

Этот архив был сгенерирован hypermail 2.1.8 : Fri 24 Apr 2015 - 16:15:15 MSK