Small HTTP сервер

Содержание:




Что это и зачем оно нужно ?

Эта очень небольшая утилита ( менее 15 Kb!!!) превращает ваш компьютер в полноценный Web-сервер. Сама программа задействует минимальное количество системных ресурсов, функционирование сервера не должно сказаться на производительности вашего компьютера. Сервер может работать в локальной сети или даже на DialUp-е. Веб-мастера могут запускать эту утилиту даже на своем локальном компьютере, и не входя в сеть отлаживать CGI-скрипты.

Наверно этот HTTP сервер имеет самый маленький размер. Но это вовсе не означает, что возможности этого сервера меньше чем возможности других подобных программ.

Возможности.

Содержание


Так же одним из достоинств этой программы является ее компактность. Ее работа не должна мешать вашей! Она задействует минимум системных ресурсов, ровно столько сколько необходимых для быстрой передачи данных, и сразу же освобождает их после передачи. Для обеспечения такого режима работы мне пришлось несколько ограничить, те возможности которые могли бы быть.

Ограничения.

  • Абсолютно одновременно могут обрабатываться не более чем заданное при установке или запуске число запросов. По умолчанию 12. Для среднего сайта имеющего до 3000 посещений в сутки это более чем достаточно. При этом ежесуточный исходящий трафик может достигать 24*3600*12*1.92 = 1.99 Гб !!! (При средней скорости передачи данных 1.92 Кб/с.)
  • Сервер поддерживает только методы GET, POST и HEAD.

    Содержание



    Как ...?

    -- Да очень просто -- распаковывайте с сохранением дерева каталогов, запускайте http.exe и все ! Если Ваш браузер не настроен на работу через прокси, то даже не входя в сеть вы можете сами сходить на свой сайт используя стандартный IP-адрес http://127.0.0.1/. Если у вас нет собственного DNS-имени, это не страшно. Любой пользователь может попасть ваш сайт используя Ваш IP адрес. Указывайте его при регистрации на поисковых серверах.


    Каталоги и имена файлов.

    Сервер поддерживает определенные имена каталогов. Так если вы не задали ключа dir=имя_каталога в командной строке то Ваш сайт начинается с подкаталога заданного при установке, (по умолчанию WWW) . Файлы могут передаваться только из него и из всех вложенных в него подкаталогов, кроме /CGI-BIN/ Предполагается, что в каталоге /CGI-BIN/ находятся исполняемые CGI-скрипты, и при получении запроса на файл из /CGI-BIN/ сервер пытается его запустить. При этом если файл имеет расширение *.pl то запускается Perl-интерпретатор, который должен быть либо в PATH-е, либо указан при установке, либо его полное имя должно быть указано в командной строке perl=имя. Запрос файла с расширениями *.phtml,*.pht,*.php приводит к попытке запуска PHP интерпретатора, которому передается указанный файл. Например если Вы распаковали программу в каталог С:\HTTP то по вашему IP-адресу можно будет забирать файлы из каталога C:\HTTP\WWW т.е. http://127.0.0.1/test.htm==C:\HTTP\WWW\test.htm. А CGI в этом случае запускаются из C:\HTTP\WWW\CGI-BIN\ Если Вы создали в каталоге WWW подкаталог WWW\IMAGES и записали туда файл bgr.gif то получить его можно http://127.0.0.1/images/bgr.gif и т.д. В любом случае, если имя файла не задано, т.е. запрос кончается на '/' то сервер автоматически подставляет имя файла по умолчанию заданное при установке, либо в командной строке, сохраняя структуру каталогов. Так http://127.0.0.1/My/ эквивалентно http://127.0.0.1/My/index.htm. Задать другой файл по умолчанию можно с помощью опции def=имя в командной строке.
    Сервер определяет тип файла по расширению.

    Содержание



    Параметры командной строки.

    В большинстве случаев дополнительная настройка не требуется, но если вдруг вы захотели что-то поменять непосредственно под себя, то можете указать это в командной строке.
  • port=## задает номер порта вместо 80
  • max=## задает максимальное число подключений вместо 12
  • def=name.ext задает файл по умолчанию вместо index.htm
  • perl=name.exe задает perl-интерпритатор.
  • dir=root_dir_name задает корневой коталог вашего веб сайта.
  • log=name.log задает файл-протокола.
  • nolog запрещает сохранение протокола.
  • share=dir Если вы хотите что бы Ваши CGI скрипты забирали и сохраняли данные в каком либо специальном каталоге, задайте этот параметр при установке или используйте этот ключ.
  • hide При запуске сворачиваться в трей.
  • ext=".ext;application;.ext;application;..." Позволяет связать данные расширения CGI с приложениями или DLL через которые они должны запускаться.
  • hostpath=hostname;path Может повторятся несколько раз. Поддержка виртуальных хостов. Так можно создать на своей машине несколько разных хост-имен и связать каждое имя со своим Веб-директорием.

    Ни до ни после знака равенства не должно быть пробелов. Если вы указывайте параметр содержащий в своем имени пробелы, заключите его в кавычки. Пример командной строки:
    http.exe port=1080 max=24 def=index.html perl=C:\PERL\BIN\perl.exe php="C:\PROGRAM FILES\PHP\php.exe"  nolog
    Так же есть возможность загружать конфигурационные параметры из текстового файла. Для этого в командной строке нужно указать @имя_файла. Например:
    http.exe @cfg1.cfg
    В этом файле будут распознаваться те же ключевые слова, что и в командной строке. Так же он может содержать комментарии начинающиеся с символа '#'. Вот пример такого файла:
    log=C:\TEMP\http.log
    perl=C:\PERL\BIN\perlis.dll  # supported !!!
    max=12  def=index.stm
    @www.cfg  # include other configuration file
    hostpath=www.name.www;C:\WWW1
    hostpath=max.name.www;C:\WWW2
    # ...
    # End of file
    


    Содержание



    Запуск скриптов.

    Как уже говорилось, скрипты запускаются из поддиректории /CGI-BIN/ При этом поддерживается интерфейс CGI/1.1 подробное описание которого можно найти например на http://Web.Golux.Com/coar/cgi/ При запуске строка запроса передается как в командной строке так и в переменной окружения QUERY_STRING. После запуска выходной поток скрипта напрямую транслируется пользователю приславшему запрос. Скрипт, обязательно должен выдавать строку Content-Type: тип\r\n или Location: url релокейшена.. Также могут следовать другие служебные строки, например Content-Length: xx\r\n или Date: Завершается служебная информация последовательностью \r\n\r\n. Если вы пишите на Си или Перле то обратите внимание на то, что функции вывода в тестовом режиме сами преобразуют символ \n в последовательность \r\n. На Паскале функция writeln завершает вывод этими символами.

    Содержание


    Server Side Includes (SSI)

  • SSI значительно расширяет Ваши возможности, позволяя динамически вставлять, документы или результаты работы CGI в произвольные места запрошенного документа.
  • Когда удаленный пользователь запрашивает у Вас файл имеющий расширение *.SHT, *.SHTM, *.SHTML сервер отдает его с учетом встречающихся в нем SSI тегов.
  • SSI тег имеет следующий формат:
    <!--#имя_тега {переменная="значение" } -->
  • Внутри "значения" могут применятся подстановки HTTP переменных или переменных полей формы запроса. Имя переменной начинается с символа '$' и далее может быть заключено в фигурные скобки {}, если Вы хотите объединить полученное значение с последующим текстом исключая пробелы. Например значением "$USER_AGENT" является соответствующая строка идентифицирующая браузер, а если вы хотите объединить ее с текстом "_12345" то используйте "${USER_AGENT}_12345" Для включения в значение символа '$' используйте '\$', для '\' -- '\\', для '"' -- '\"' и т.д. Если при подстановке, соответствующая переменная не найдена подставляется значение "undefined".

    Данная версия сервера поддерживает следующие теги:

    include
    <!--#include virtual="patch/file_name" -->
    <!--#include file="full_patch/file_name" -->
    Оба варианта этой директивы включают в документ содержимое файла file_name. В первом случае документ ищется начиная с каталога сервера. Во втором случае начиная с каталога текущего документа, и это может быть любой файл на машине, т.е. если маршрут начинается с "/" или "X:" то каталог текущего документа не подставляется. В обоих случаях path вообще может быть опущен. Если в результате подстановки обнаруживается, что запрашиваемый документ находится на сервере в подкаталоге /CGI-BIN/ то он воспринимается как CGI и запускается. Выходной поток соответственно транслируется, начало до последовательности "\r\n\r\n" убирается. При этом если в имени не содержалось символа '?' то CGI передается исходный запрос, с которым обратились к родительскому документу. Если обнаружен '?' то дальнейшая последовательность будет передана как запрос, она должна быть соответственно преобразована Вами.

    exec
    <!--#exec cgi="file_name" -->
    <!--#exec cmd="full_patch/file_name" -->
    Запуск скрипта. Все аналогично include. В первом случае файл запускается из коталога CGI-BIN, во втором должен быть задан полный маршрут.

    fsize и lastmod
    <!--#fsize virtual="patch/file_name" -->
    <!--#fsize file="full_patch/file_name" -->
    <!--#lastmod virtual="patch/file_name" -->
    <!--#lastmod file="full_patch/file_name" -->
    Подставляет размер или дату последней модификации файла.

    echo
    <!--#echo var="var" -->
    Выводит значение переменной.

    printenv
    <!--#printenv -->
    Выводит все переменные.

    break
    <!--#break -->
    Вызывает прекращение обработки документа.

    if -- elif -- else -- endif
    <!--#if expr="выражение" -->
    текст
    <!--#elif expr="выражение" -->
    текст
    <!--#elif expr="выражение" -->
    текст
    ...
    <!--#else -->
    текст
    <!--#endif -->
    Подстановка по условию. Текст будет передаваться пользователю в зависимости от истинности условий. Выражение может содержать переменные и значения разделенные знаками логических операций и скобками:
    ! -- перед выражением -- простое отрицание
    = или == -- равно
    != -- не равно
    <,>,<=,>= -- соответственно.
    && между выражениями логическое и.
    || между выражениями логическое или.
    str1~str2 -- результат истина, если строка str2 является частью строки str1.
    Если вообще нет никакого знака сравнения, то значение выражения сравнивается с "undefined". Части elif и else могут быть пропущены. Часть elif может повторяться сколько угодно раз. Обязательно долен быть закрывающий тег endif.

    set
    <!--#set var="переменная" value="значение" -->
    Добавление или изменение значения переменной. Не стоит злоупотреблять этой опцией, так как и количество переменных которые можно добавить и размер буфера под них ограничены.

    Содержание



    Заключение.

    В заключении я не могу не выразить свою глубочайшую признательность, программистам написавшим прекрасный компилятор GNU C++, с помощью которого откомпилирована эта программа. Я благодарю GNU за то , что они подарили мне возможность писать самые лучшие программы, используя самый лучший компилятор.
    Вы можете посмотреть GNU ресурсы:
  • DJGPP -- домашняя страница трансляции GNU GCC в среду DOS.
    Я пользовался именно этой версией, своими библиотеками, вызывающими WIN32 API и своей программкой строящей Windows PE *.exe из COFF a.out.
  • GNU -- Собственно сам сайт GNU.


    М. Феоктистов


    Содержание


    Click Here!       Aport Ranker      

    Шкафы купе Mr.DooRS в С-Петербурге