Веб-сервер: различия между версиями
Строка 1: | Строка 1: | ||
Веб-сервер должен принимать HTTP запросы, формируемые JS-скриптом на стороне клиента и содержащие запакованные входные параметры вызова серверной функции и идентификатор этой функции. | Веб-сервер должен принимать HTTP запросы, формируемые JS-скриптом на стороне клиента и содержащие запакованные входные параметры вызова серверной функции и идентификатор этой функции. В зависимости от значения идентификатора функции сервер должен обрабатывать запрос самостоятельно<ref>зачем?</ref> либо делегировать вызов внутрипроцессному серверу (DLL, SO) с известной точкой входа: | ||
<source lang=c> | <source lang=c> | ||
Строка 14: | Строка 10: | ||
); | ); | ||
</source> | </source> | ||
Внутрипроцессный сервер, в свою очередь, выполняет функции [[Управляющая подсистема | управляющей подсистемы]]. | |||
Сервер, в свою очередь, должен самостоятельно выполнять соответствуюую операцию, либо делегировать вызов куда-то еще. При завершении обработки сервер должен возвращать ответы браузеру, который отображает их для пользователя. | |||
Дабы сделать реализацию обработчика HTTP-запросов общей, нужно серверу предоставлять динамическую библиотеку, содержащую известную ему точку входа. Эта точка входа на основе переданного ей идентификатора (изначально указанного клиентом в HTTP запросе) выбирает конкретную функцию для выполнения, распаковывает соответствующим образом (т.е. в соответствии с интерфейсом функции) параметры и вызывает ее. | |||
Пока набор конкретных функций можно не рассматривать, и задать лишь интерфейс обобщенной точки входа: | |||
[[Файл:Web-server-interface.jpg|500px|thumb|интерфейсы]] | [[Файл:Web-server-interface.jpg|500px|thumb|интерфейсы]] |
Версия 17:00, 1 декабря 2015
Веб-сервер должен принимать HTTP запросы, формируемые JS-скриптом на стороне клиента и содержащие запакованные входные параметры вызова серверной функции и идентификатор этой функции. В зависимости от значения идентификатора функции сервер должен обрабатывать запрос самостоятельно[1] либо делегировать вызов внутрипроцессному серверу (DLL, SO) с известной точкой входа:
return_code entry_point(
uint ID, //идентификатор операции
byte in_params[in_byte_count], //набор байт, содержащий упакованные входные параметры
uint in_byte_count, //байтовый размер упакованных данных
byte out_params[out_byte_count], //буфер, предоставляемый nginx'ом для хранения выходных параметров вызываемой функции
uint* out_byte_count //На входе - размер буфера out_params, на выходе - фактический размер выходных данных
);
Внутрипроцессный сервер, в свою очередь, выполняет функции управляющей подсистемы.
Сервер, в свою очередь, должен самостоятельно выполнять соответствуюую операцию, либо делегировать вызов куда-то еще. При завершении обработки сервер должен возвращать ответы браузеру, который отображает их для пользователя.
Дабы сделать реализацию обработчика 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.
- ↑ зачем?