зеркало для tinyhttpd (неофициальное зеркало, форкнутый с SourceForge, предназначен для учебных целей)
Проверка CGI требует установки PERL на локальной машине, а также установки perl-cgi
Компиляция для Linux
Чтобы скомпилировать для Linux:
1) Прокомментируйте строку `#include <pthread.h>`.
2) Прокомментируйте строку, которая определяет переменную `newthread`.
3) Прокомментируйте две строки, которые запускают `pthread_create()`.
4) Разкомментируйте строку, которая запускает `accept_request()`.
5) Удалите `-lsocket` из файла `Makefile`.
Каждая функция выполняет следующие действия:
`accept_request`: Обрабатывает один HTTP-запрос, полученный от прослушивания сокета, здесь можно в значительной степени наблюдать процесс работы сервера при обработке запросов.
`bad_request`: Возвращает клиенту сообщение об ошибочном запросе, HTTP-статус 400 BAD REQUEST.
`cat`: Читает файл на сервере и записывает его в сокет.
`cannot_execute`: Основная функция для обработки ошибок, возникающих при выполнении CGI-программы.
`error_die`: Записывает информацию об ошибке в `perror` и завершает работу.
`execute_cgi`: Выполняет CGI-программу, основная функция.
`get_line`: Читает одну строку из сокета, приводя все формы новой строки к единому виду.
`headers`: Записывает HTTP-заголовки в сокет.
`not_found`: Основная функция для обработки случаев, когда запрошенный файл не найден.
`server_file`: Вызывает `cat` для отправки содержимого серверного файла браузеру.
`startup`: Инициализирует службу httpd, включая создание сокета, связывание порта и начало прослушивания.
`unimplemented`: Возвращает браузеру сообщение о том, что используемый метод HTTP не поддерживается.
Рекомендованная последовательность чтения исходного кода: `main` -> `startup` -> `accept_request` -> `execute_cgi`, после понимания основного рабочего процесса следует внимательно изучить каждый функциональный модуль.
(1) При запуске сервера он связывается со специфическим или случайно выбранным портом для предоставления службы httpd.
(2) При получении одного HTTP-запроса (это происходит при принятии соединения через прослушивание порта), производится выделение потока для выполнения функции `accept_request`.
(3) Извлечение метода (GET или POST) и URL из HTTP-запроса. Для метода GET, если есть параметры, указатель `query_string` будет указывать на часть URL после знака вопроса.
(4) Преобразование URL в массив `path`, представляющий путь к файлу на сервере, который запрошен получить браузером. В tinyhttpd серверные файлы находятся в директории `htdocs`. Если URL заканчивается слешем или является директорией, то по умолчанию добавляется `index.html` в `path`, чтобы указать доступ к главной странице.
(5) Если путь к файлу корректен, для GET-запроса без параметров выводится содержимое серверного файла непосредственно в браузер, то есть HTTP-ответ пишется в сокет. Переходим к шагу (10). В других случаях (с параметрами GET, POST-запросах, URL как исполняемых файлов) вызывается функция `execute_cgi` для выполнения CGI-скриптов.
(6) Чтение всего HTTP-запроса и его игнорирование, если это POST-запрос, то определяется значение `Content-Length`. Запись HTTP-статуса 200 в сокет.
(7) Создание двух каналов, `cgi_input` и `cgi_output`, и `fork` нового процесса.
(8) В подпроцессе `stdout` переопределяется для записи в конец канала `cgi_output`, `stdin` переопределяется для чтения из начала канала `cgi_input`, закрывается конец канала `cgi_input` и начало канала `cgi_output`, устанавливаются переменные окружения `request_method`, `query_string` (если это GET) и `content_length` (если это POST), затем используется `execl` для запуска CGI-программы.
(9) В родительском процессе закрывается начало канала `cgi_input` и конец канала `cgi_output`, если это POST-запрос, то данные POST-запроса записываются в канал `cgi_input`, который уже был переопределен для `stdin`, вывод данных из канала `cgi_output` на клиента, входящий в этот канал из `stdout`. Закрытие всех каналов и ожидание завершения подпроцесса. Эта часть довольно запутана, см. ниже для объяснения:
Рисунок 1 Исходное состояние каналов
Рисунок 2 Финальное состояние каналов
(10) Закрытие соединения с браузером, завершение одной HTTP-транзакции, так как HTTP является протоколом без соединения.
Следующее содержание предоставлено автором:
Этот программный продукт защищен авторским правом 1999 года Дж. Дэвидом Блэкстоуном. Разрешается распространять и изменять этот программный продукт на условиях Генеральной общественной лицензии GNU, доступной по адресу http://www.gnu.org/.
Если вы используете эту программу или изучаете код, я буду благодарен узнать об этом и буду очень рад услышать о вашем опыте по адресу jdavidb@sourceforge.net.
Эта программа не предназначена для использования в продакшне. Она предоставляется без всякой гарантии, даже явной гарантии пригодности для конкретного назначения. Я не несу ответственности за возможный ущерб, который может произойти при использовании этой программы на вашей системе.
Я написал этот веб-сервер для выполнения заданий по моему курсу сетевых технологий в 1999 году. Нас проинформировали, что минимум сервер должен выполнять — это обслуживание страниц, и мы могли получить дополнительные баллы за выполнение "дополнительных" функций. Perl помог мне освоить множество функций Unix (я узнал о сокетах и fork
благодаря Perl!), а книги O'Reilly по системным вызовам Unix, CGI и написанию веб-клиентов на Perl помогли мне понять, что я могу сделать свой веб-сервер поддерживающим CGI с минимальными усилиями.
Теперь, если вы член группы разработчиков Apache, вы можете не быть впечатлены. Но мой преподаватель был в шоке. Попробуйте образец скрипта color.cgi
и введите "chartreuse". Это сделало меня казаться более умным, чем я есть, хотя бы временно. :))
Apache это не. Но я надеюсь, что эта программа станет хорошим образовательным инструментом для тех, кто интересуется http/socket программированием, а также системными вызовами Unix. (Здесь используются некоторые учебные примеры использования трубок, переменных окружения, fork
и прочих).
Одна последняя вещь: если вы посмотрели на мой веб-сервер или (вы не в своем уме?!?) использовали его, я буду просто счастлив услышать об этом. Пожалуйста, напишите мне! Я, вероятно, не выпущу крупные обновления, но если я помог вам чему-то научиться, я буду рад узнать об этом!
Удачи в хакинге!
Дж. Дэвид Блэкстоун
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )