Создание основы приложения: формы и её элементов. Для выполнения задачи потребуется всего одна форма. И следующие поля ввода на ней: для задания порта, имя пользователя, пароль пользователя, путь к папке проекта и его индексу, название страницы управления, имя администратора, пароль администратора. Также нужны два чекбокса для: вклбчения/выключения авторизации и страницы управления. Для вызова диалога обзора и открытия файлов поставим кнопку. И ещё две: для запуска сервера и для завершения работы приложения. Подписи к элементам управления (Label’ы) ставим по усмотрению.
Затем положим на форму компонент idHTTPServer, находящийся на вкладке компонентов INDY Servers. Другие, требующиеся нам не визуальные компоненты, это Timer и OpenDialog.
Программирование приложения. Фактически, вся работа будет связана с событием IdHTTPServer1CommandGet ( AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo ). Где нужные нам параметры – ARequestInfo и AResponseInfo.
Для того чтобы был запрос ввода пароля, когда нам это нужно, на событие onCommandGet, сразу после описания процедуры (т.е. перед begin) ставим следующее:
procedure AuthFailed; begin AResponseInfo.AuthRealm :='Авторизация на SHTTPS:'; end;
Смотрим: в структуре AResponseInfo AuthRealm предназначен для запроса авторизации с текстом, ему присвоенным. Сразу после begin ставим AResponseInfo.Server : = 'версия сервера' ; AResponseInfo . CacheControl : = 'no-cache' ; Это задаст версию сервера и укажет браузеру не кэшировать документы с сервера. Потом проверяем состояние чекбокса для авторизации (нужна/нет). Если нужна, то проверка: (ARequestInfo.AuthUsername <> ‘имя_пользователя’) or (ARequestInfo.AuthPassword <> ‘пароль’). В случае непрохождения её вызов AuthFailed.
После просто обрабатываем введённый адрес, находящийся в ARequestInfo.Document (см. структуру ARequestInfo). При запросе “/” показываем индексный файл. А при запросе вида “/1/file.htm” отдаём файл 1/file.htm.
Для передачи файла используем AResponseInfo.ContentStream := TFileStream.Create (‘filename’,fmOpenRead).
При запросе страницы управления в нашем случае отдаём не файл с диска, а html-код, непосредственно генерирующийся здесь. Потому что нужно получить и показать в полях ввода страницы управления их текущие значения. Страница управления будет похожа видом на форму сервера. Часть её исходного кода шаблонна и будет задана фрагментами в Resourcestring, откуда эти фрагменты будут вставляться в ContentText (AResponseInfo) вперемежку с иными вставками.
Получается, что в html-странице управления будет форма и поля ввода. При отправке, их значения методом POST будут направлены серверу. Считывать их на сервере можно из структуры ARequestInfo, в которой они есть Params.values. Полностью обращаться: ARequestInfo.Params.Values['имя_элемента'].
Запуск сервера производится так: idHTTPServer1.DefaultPort := #порта; idHTTPServer1.Active:=true; (Порт указываем именно перед запуском). Для остановки сервера через страницу управления нужен таймер, по которому выполнится Application.Terminate. Напрямую вызвать в ходе IdHTTPServer1CommandGet завершение приложения нельзя, следует делать активным таймер.
Заключение. Для разработки ПО Sample HTTPServer использовалась среда Дельфи 7.0, упаковщик исполняемых файлов UPX 1.95. Весь код данного ПО, кроме автокода модулей Дельфи и структур ARequestInfo, AResponseInfo, взятых из исходного кода SvrHTTPIndy.pas был написан автором.
Сама статья и ПО были созданы в учебных целях, а также как основа будующей статьи, посвящённой созданию программы-сервера удалённого администрирования на основе idHTTPServer, без отдельного клиента (управление по http). ПО предложено только для сопровождения статьи и его использование в качестве сервера неактуально, но возможно. Статью (как и исходный код) можно дополнять, переопубликовывать, ссылаясь на первоисточник, при этом критика ожидаема и желательна.