]>Вебсервер Station922

Вебсервер Station922

Компактный вебсервер для Windows, написанный на фрибейсике. Умеет обрабатывать методы CONNECT, GET, HEAD, PUT, DELETE, TRACE и OPTIONS.

Сервер работает «из коробки», необходимо лишь прописать пути к сайтам в файле конфигурации. Для ведения журнала сетевых соединений сервер создаёт каталог «logs» в папке с программой.

Вебсервер назван в честь запрещённого видеофайла station922.mkv.

Конфигурация сервера и сайтов

Настройки сервера и сайтов хранятся в обычных INI‐файлах. Для поддержки юникодных путей рекомендется сохранять такие файлы в кодировке UTF-16 LE.

Серверные настройки

Лежат в файле «WebServer.ini» в каталоге с программой. Пример:

Код INI‐файл
[WebServer]
ListenAddress=0.0.0.0
Port=80
ConnectBindAddress=0.0.0.0
ConnectBindPort=0

Описание

ListenAddress
Сетевой адрес, к которому будет привязан вебсервер. По умолчанию 0.0.0.0, то есть сервер будет ожидать соединений со всех сетевых интерфейсов.
Port
Порт для прослушивания. По умолчанию 80 (стандартный HTTP порт).
ConnectBindAddress
Адрес, к которому будет привязываться сервер для выполнения метода CONNECT. По умолчанию 0.0.0.0.
ConnectBindPort
Порт, к которому будет привязываться сервер для выполнения метода CONNECT. По умолчанию 0, это значит, что система будет сама выбирать порт для привязки.

Методы CONNECT и PUT

Для своей работы эти методы требуют имени пользователя и пароля. Если имя пользователя и пароль не прописаны, то вебсервер будет отвечать на методы ошибкой «401 Unauthorized».

Создай в папке с программой файл «users.config» (текстовый INI‐файл) примерно следующего содержания:

Код INI‐файл
[admins]
user=password

Описание

user
Имя пользователя для авторизации
password
Пароль пользователя.

Для метода PUT аналогичный файл должен лежать в корневой директории сайта.

Настройки сайтов

Лежат в файле «WebSites.ini» в каталоге с программой. Каждая секция в файле описывает отдельный сайт, определяемый HTTP‐заголовком «Host», для каждого сайта необходимо создавать отдельную секцию. Вебсервер считае, что example.org, www.example.org и www.example.org:80 — разные сайты, каждый из которых требует отдельной секции. Пример:

Код INI‐файл
[localhost]
VirtualPath=/
PhisycalDir=c:\programming\сайты\localhost\
IsMoved=0
MovedUrl=http://localhost

Описание

VirtualPath
Виртуальное имя сайта. Используется в сообщениях об ошибках.
PhisycalDir
Физический каталог, где расположены файлы сайта, корневой каталог сайта.
IsMoved
Флаг перенаправления на другой сайт. Например, клиент делает запрос на example.org, а настоящий сайт находится на www.example.org. В таком случае необходимо установить 1 для перенаправления.
MovedUrl
Адрес сайта, куда сервер будет перенаправлять при установленном флаге перенаправления. Необходимо начинать с «http://»

Таким образом при стандартных настройках, чтобы получить доступ к сайту, необходимо в браузере набрать http://localhost/

Максимальное количество сайтов, поддерживаемое вебсервером: 50.

Файлы по умолчанию

Если URL запрашиваемого ресурса не содержит полный путь к файлу, например, клиент запрашивает http://localhost/, то сервер ищет в каталоге сайта файлы в порядке очерёдности:

Если ни один из этих файлов не найден, то сервер отправляет ошибку «404 Not Found» в общем случае или «410 Gone» если найдёт файл default.xml.410.

Внутренняя кухня сервера

MIME и расширения файлов

MIME меняются довольно редко, нет нужны каждый раз считывать информацию о них из файлов конфигурации или реестра, поэтому в сервере жёстко прописаны стандартные MIME типы содержимого и расширения файлов.

Константы с расширениями файлов, функции обработки MIME располагаются в модуле Mime.bas.

В структуру типов документа также встроен флаг, отвечающий за текстовое содержимое. Если функции из модуля Mime.bas определят, что запрашиваемый клиентом документ является текстом (например: text/plain, text/html, application/xml), то для такого файла сервер попытается найти метку порядка следования байт (BOM) и на основании их определить кодировку документа. Возможные варианты:

Когда клиент запрашивает файл с незарегистрированным расширением, то сервер не может найти для него MIME тип. В таком случае сервер ответит ошибкой «403 Forbidden». Таким образом клиенту не будут отправлены файлы конфигурации *.config.

Сжатое содержимое

Сервер не умеет сжимать файлы «на лету», однако он умеет отдавать уже готовое сжатое содержимое. Для этого сжатое содержимое должно располагаться в специальном файле с двойным расширением. Для сжатия типа gzip используется расширение *.gz, для сжатия deflate — расширение *.deflate.

Например, клиент запрашивает файл default.htm и передаёт поддерживаемый тип сжатия gzip в заголовке Accept-Encoding. Если файл default.htm.gz существует, то сервер отправит его вместо оригинального default.htm. Однако данные о дате последней модификации и ETag будут рассчитываться от оригинального файла.

Кодировка текстовых файлов определяется по оригинальному файлу и добавляется в заголовки ответа. Несмотря на то, что для кодировок UTF-8 и UTF-16 LE сервер не отправляет клиенту метку BOM, то есть первые три или два байта, сервер отправляет сжатый файл полностью как есть. Поэтому для UTF-8 и UTF-16 BE файлов в стажом файле должна отсутствовать метка BOM.

Файл с дополнительными заголовками ответа

Сервер отправляет клиенту минимальное количество заголовков для правильного отображения файла в браузере. Однако иногда их бывает недостаточно или требуется переопределить некоторые их них. Для такого случая применяются файлы типа *.headers.

Файл с дополнительными заголовками следует создавать как текстовый файл в кодировке ASCII, где перечисляются заголовки ответов, каждый на новой строке. Например, для файла default.htm файл с заголовками default.htm.headers может иметь вид:

Код Plain text
Content-Language: ru
Content-Type: application/xml

При чтении такого файла сервер добавляет значения заголовков в коллекцию перед тем как сформировать ответ. С помощью файла с дополнительными заголовками можно переопределить тип документа, указать используемый язык документа, необходимое время кеширования и так далее. Сервер не будет добавлять нераспознанные заголовкив коллекцию.

Код Plain text
Accept-Ranges
Age
Allow
Cache-Control
Content-Encoding
Content-Language
Content-Location
Content-MD5
Content-Range
Content-Type
ETag
Expires
Last-Modified
Location
Pragma
Proxy-Authenticate
Retry-After
Set-Cookie
Trailer
Upgrade
Via
Warning
WWW-Authenticate

Однако таким файлом нельзя переопределить следующие заголовки:

Код Plain text
Connection
Content-Length
Date
Keep-Alive
Server
Transfer-Encoding
Vary

Ошибки «404 Not Found» и «410 Gone»

Если запрашиваемый клиентом файл не найден, то сервер ищет файл с расширением *.410. Если он будет найден, то сервер отправит ошибку «410 Gone». Если не найден, то будет отправлена ошибка «404 Not Found».

Ошибка «404 Not Found» подразумевает, что файл не найден, но в будущем может появиться по этому пути. Ошибка «410 Gone» используется для указания того, что файл раньше существовал по этому пути, но теперь удалён навсегда и клиентам следует удалить все ссылки на такой файл. Для индикации этого случая предусмотрен файл с двойным расширением *.410.

Компиляция

Вебсервер можно скомпилировать как обычное консольное приложение и как службу Windows.

Обычная версия

Код Batch file
fbc.exe -mt -x "WebServer.exe" Main.bas WebServer.bas Network.bas ThreadProc.bas ReadHeadersResult.bas WebUtils.bas ProcessCgiRequest.bas ProcessConnectRequest.bas ProcessDeleteRequest.bas ProcessDllRequest.bas ProcessGetHeadRequest.bas ProcessOptionsRequest.bas ProcessPutRequest.bas ProcessTraceRequest.bas base64.bas Mime.bas Http.bas WebSite.bas HeapOnArray.bas WriteHttpError.bas StreamSocketReader.bas WebRequest.bas URI.bas AppendingBuffer.bas WebResponse.bas

В виде службы Windows

Код Batch file
fbc.exe -mt -x "WebServer.exe" -d service=true WebServerService.bas WebServer.bas Network.bas ThreadProc.bas ReadHeadersResult.bas WebUtils.bas ProcessCgiRequest.bas ProcessConnectRequest.bas ProcessDeleteRequest.bas ProcessDllRequest.bas ProcessGetHeadRequest.bas ProcessOptionsRequest.bas ProcessPutRequest.bas ProcessTraceRequest.bas base64.bas Mime.bas Http.bas WebSite.bas HeapOnArray.bas WriteHttpError.bas StreamSocketReader.bas WebRequest.bas URI.bas AppendingBuffer.bas WebResponse.bas

Для уменьшения кода и размера исполняемого файла в сервере не содержится методов автоматической регистрации службы. Для этого можно использовать утилиту sc:

Код Batch file
set current_dir=%~dp0
sc create FreeBASICWebServer binPath= "%current_dir%WebServer.exe" start= "auto"
sc start FreeBASICWebServer

Ссылки

Скачать вебсервер можно с официального хранилища Station922 на гитхабе.

Поделись ссылочкой в социальных сетях