qhttp Code
Status: Pre-Alpha
Brought to you by:
alpa4ino
Проект ghttp. Qhttp - простейший http сервер. Сервер работает по принципу многопоточности и мультиплексирования. Каждый поток может прослушивать несколько клиентских соединений. Количество потоков и соединений устанавливаются в конфигурационном файле. Принцип работы следующий. Главный поток, реализованный в классе qhttp::manager, создает дочерние потоки - сервлеты, qhttp::servlet. Количество сервлетов указано в конфигурационном файле. С каждым сервлетом главный поток устанавливает постоянное соединение посредством объекта qhttp::duplex_channel, являющемся по существу оберткой над posix pipe. В дальнейшем вся синхронизация между главным потоком и сервлетами осуществляется через эти каналы. Главный поток слушает порт, указанный в конфигурационном файле. При получении нового соединения, он находит наименее загруженный в данный момент сервлет и передает ему по вышеупомянутому каналу дескриптор сокета. Каждый сервлет постоянно опрашивает этот канал с помощью системного вызова poll. При получении нового дескриптора, он добавляет его в список опрашиваемых дескрипторов для мониторинга с помощую системного вызова poll и обрабатывает запрос с помощью объекта qhttp::worker. Далее на основе разных параметров http запроса создается соответствуйщий запросу обработчик, который делает всю работу, подготавливает http ответ. Объект qhttp::worker отправляет запрос обратно клиенту. Если не установлен режим keep-alive, сокет закрывается, сервлет освобождает ресурсы связанные с данным запросом и посылает по каналу сообщение главному потоку о том что соединение обратотано. В настоящий момент worker может создать только один тип обработчика - обработчик мутода GET, возвращающий содержимое файлов целиком. TODO: Достаточно много TODO. Обработка разных методов http, оптимизация разбора http запросов. Locations, обработка главный потоком сообщений от сервлетов через poll или select, логгирование. В настоящий момент приложение не демонизируется. Нужно написать скрипт, которые запускает приложение qhttp, останавливает, перезапускает его и т.д. INSTALL: Запустите утилиту make в дирректории проекта и убедитесь что qhttp файл создан. RUN: В начальной версии приложение не демонизируется, поеэтому его можно запустить в консоли так: ./qhttp <имя конфигурационного файла> или ./qhttp <config file> & В последнем случае на запускающего возлагается задача отправления процессу сигнала kill для завершения приложения. Шаблон конфигурационного файла находится в главной дирректории проекта под названием qhttp.config BEFORE RUN: Перед запуском необходимо убедиться в правильной установке следующих переменных в конфигурационном файле: portno - порт, который будет прослушивать сервер, должен быть свободен virtual_path - корневая дирректория где сервер будет осуществлять поиск всех документов default_page - имя файла по умолчанию. Должно быть в vaitual_path. error400 - полное имя файла ошибки 400, может находься в любом месте на локальном диске error404 - полное имя файла ошибки 404, может находься в любом месте на локальном диске error502 - полное имя файла ошибки 500, может находься в любом месте на локальном диске