Веб-сервер: различия между версиями

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
Строка 2: Строка 2:


<source lang=c>
<source lang=c>
return_code entry_point(
return_code entry_point( //возвращается код ошибки chsvlib (ноль в случае успешного завершения)
   uint ID, //идентификатор операции
   uint ID, //идентификатор операции
   byte in_params[in_byte_count], //набор байт, содержащий упакованные входные параметры
   byte in_params[in_byte_count], //набор байт, содержащий упакованные входные параметры
   uint in_byte_count, //байтовый размер упакованных данных
   uint in_byte_count, //байтовый размер упакованных данных
   byte** out_params[out_byte_count], //буфер, который внутрипроцессным сервером выделяется и инициализируется ответом на запрос.
   byte** out_params[out_byte_count], //буфер, который выделяется внутрипроцессным сервером и инициализируется ответом на запрос.
   uint*  out_byte_count //На выходе - фактический размер выходных данных
   uint*  out_byte_count //На выходе - размер выходных данных
);
);
</source>
</source>


Внутрипроцессный сервер, в свою очередь, выполняет функции [[Управляющая подсистема | управляющей подсистемы]].
Внутрипроцессный сервер, в свою очередь, выполняет функции [[Управляющая подсистема | управляющей подсистемы]].
 
Также задана функция освобождения внутрипроцессного сервера:
Сервер, в свою очередь, должен самостоятельно выполнять соответствуюую операцию, либо делегировать вызов куда-то еще. При завершении обработки сервер должен возвращать ответы браузеру, который отображает их для пользователя.
<source lang=c>
return_code_t FreeData(void* pData);
</source>


Дабы сделать реализацию обработчика HTTP-запросов общей, нужно серверу предоставлять динамическую библиотеку, содержащую известную ему точку входа. Эта точка входа на основе переданного ей идентификатора (изначально указанного клиентом в HTTP запросе) выбирает конкретную функцию для выполнения, распаковывает соответствующим образом (т.е. в соответствии с интерфейсом функции) параметры и вызывает ее.
Дабы сделать реализацию обработчика HTTP-запросов общей, нужно серверу предоставлять динамическую библиотеку, содержащую известную ему точку входа. Эта точка входа на основе переданного ей идентификатора (изначально указанного клиентом в HTTP запросе) выбирает конкретную функцию для выполнения, распаковывает соответствующим образом (т.е. в соответствии с интерфейсом функции) параметры и вызывает ее.

Версия 23:02, 3 декабря 2015

Веб-сервер должен принимать HTTP запросы, формируемые JS-скриптом на стороне клиента и содержащие запакованные входные параметры вызова серверной функции и идентификатор этой функции. В зависимости от значения идентификатора функции сервер должен обрабатывать запрос самостоятельно[1] либо делегировать вызов внутрипроцессному серверу (DLL, SO) с известной точкой входа:

return_code entry_point( //возвращается код ошибки chsvlib (ноль в случае успешного завершения)
  uint ID, //идентификатор операции
  byte in_params[in_byte_count], //набор байт, содержащий упакованные входные параметры
  uint in_byte_count, //байтовый размер упакованных данных
  byte** out_params[out_byte_count], //буфер, который выделяется внутрипроцессным сервером и инициализируется ответом на запрос.
  uint*  out_byte_count //На выходе - размер выходных данных
);

Внутрипроцессный сервер, в свою очередь, выполняет функции управляющей подсистемы. Также задана функция освобождения внутрипроцессного сервера:

return_code_t FreeData(void* pData);

Дабы сделать реализацию обработчика HTTP-запросов общей, нужно серверу предоставлять динамическую библиотеку, содержащую известную ему точку входа. Эта точка входа на основе переданного ей идентификатора (изначально указанного клиентом в HTTP запросе) выбирает конкретную функцию для выполнения, распаковывает соответствующим образом (т.е. в соответствии с интерфейсом функции) параметры и вызывает ее.

Пока набор конкретных функций можно не рассматривать, и задать лишь интерфейс обобщенной точки входа:


интерфейсы

Эта функция, предоставляемая so библиотекой, должна вызываться по следующей схеме:

1. Получение размера выходных данных:

uint output_size = 0;
entry_point(operation_id,  input_parameters, input_parameters_size, 0, address_of(output_size));

2. Выделение памяти для выходных параметров веб-сервером и вызов функции еще раз:

byte output[output_size];
entry_point(operation_id,  input_parameters, input_parameters_size, output, address_of(output_size));

3. Передача выходных параметров клиенту, который их распоковывает и отображает пользователю.

обращения

Написал простенькую so и клиент этой so, демонстрирующую такой протокол на примере простых типов данных и трех простеньких операций. Пока залил на гугл диск: https://drive.google.com/open?id=0B7qfTPtc54icQ3A2MWllbjhHaDQ.

  1. зачем?