Компактный вебсервер для Windows, написанный на фрибейсике.
Сервер работает «из коробки», необходимо лишь прописать пути к сайтам в файле конфигурации. Доступен в виде обычного исполняемого файла, так и в виде службы Windows.
Настройки сервера и сайтов хранятся в обычных INI‐файлах.
Лежат в файле «WebServer.ini» в каталоге с программой. Пример:
[WebServer]
WorkerThreads=4
MemoryPoolCapacity=10
KeepAliveInterval=120
- WorkerThreads
- Количество рабочих потоков. По умолчанию равно количеству процессоров.
- MemoryPoolCapacity
- Количество предварительно созданных куч памяти для клиентских контекстов. По умолчанию 10.
- KeepAliveInterval
- Интервал времени (в секундах), после которого клиент будет принудительно отключён из‐за простоя. По умолчанию 120.
Лежат в файле «WebSites.ini» в каталоге с программой. Каждая секция в файле описывает отдельный сайт, определяемый HTTP‐заголовком Host
, для каждого сайта необходимо создавать отдельную секцию. Вебсервер считает, что example.org
и www.example.org
— это разные сайты, поэтому каждый такой сайт требует отдельной секции. Пример:
Если имя сайта содержит нелатинские символы, то имя сайта следует указывать в кодировке punicode.
[localhost]
Host=localhost
VirtualPath=/
PhisycalDir=
CanonicalUrl=http://localhost
IsMoved=0
TextFileCharset=utf-8
UtfBomFileOffset=3
ListenAddress=localhost
ListenPort=80
UseSsl=0
ConnectBindAddress=0.0.0.0
ConnectBindPort=0
Methods=GET,HEAD
ReservedFileBytes=0
DefaultFileName=default.htm
EnableDirectoryListing=0
EnableGetAllFiles=0
UserName=
Password=
- Host
- Имя сайта.
- VirtualPath
- Виртуальное имя сайта. Используется в сообщениях об ошибках.
- PhisycalDir
- Физический каталог, где расположены файлы сайта, корневой каталог сайта. Если этот параметр пустой или отсутствует, то корневым каталогом считается текущая директория.
- CanonicalUrl
- Каноническое имя сайта. Указывается вместе с протоколом, без завершающего слэша на конце.
- IsMoved
- Если параметр не равен нулю, то сайт перемещён на другой ресурс. В этом случае параметр `CanonicalUrl` указывает правильное назначение. Используется для перенаправления с `example.org` на `www.example.org`.
- TextFileCharset
- Кодировка текстовых файлов. Сервер будет добавлять ко всем текстовым файлам в заголовок `ContentType` эту строку. Например: `html` файлы будут отправлены с заголовком `ContentType: text/html;charset=utf-8`.
- UtfBomFileOffset
- Длина метки BOM в байтах. Эти байты не будут отправлены клиенту. Когда текстовый файл содержит метку BOM, но вы не хотите чтобы сервер отправлял эти байты. Для кодировки `utf-8` указываем 3, для кодировки `utf-16` — 2.
- ListenAddress
- Сетевой адрес, к которому будет привязан вебсервер. По умолчанию сервер слушает `localhost`.
- ListenPort
- Порт для прослушивания. По умолчанию 80 (стандартный HTTP порт).
- UseSsl
- Использовать защищённое соединение.
- ConnectBindAddress
- Адрес, к которому будет привязываться сервер для выполнения метода CONNECT.
- ConnectBindPort
- Порт, к которому будет привязываться сервер для выполнения метода CONNECT.
- Methods
- Список методов, которые обслуживает сайт. Например: `GET, HEAD`.
- ReservedFileBytes
- Размер зарезервированного буфера для больших файловых операций. Если сайт используется для отдачи больших файлов на десятки и сотни мегабайт, можно указать размер зарезервированного буфера для уменьшения нагрузки на диск. Например, можно указать значение 8126464 (8 мегабайт).
- DefaultFileName
- Имя файла по умолчанию. Если клиент запросил ресурс без имени файла `http://www.example.org`, то сервер будет просматривать каталог на наличие файлов по умолчанию. Если параметр указан, то сервер не будет искать файлы, и сразу выдаст содержимое конкретного файла, как если бы клиент запросил файл `http://www.example.org/default.htm`.
- EnableDirectoryListing
- Листинг директорий сайта. По умолчанию 0 (выключен). Для включения установите в 1.
- EnableGetAllFiles
- Выдача всех файлов, даже если не найден тип содержимого MIME. По умолчанию 0 (выключено). Для включения установите в 1.
- UserName
- Имя пользователя.
- Password
- Пароль.
Таким образом при стандартных настройках, чтобы получить доступ к сайту, необходимо в браузере набрать http://localhost/
Максимальное количество сайтов, поддерживаемое вебсервером: 64.
Сервер обрабатывает методы DELETE, GET, HEAD, OPTIONS, PUT и TRACE.
Если URL запрашиваемого ресурса не содержит полный путь к файлу, например, клиент запрашивает http://localhost/
, то сервер ищет в каталоге сайта файлы в порядке очерёдности:
- default.xml
- default.xhtml
- default.htm
- default.html
- index.xml
- index.xhtml
- index.htm
- index.html
Если ни один из этих файлов не найден, то сервер отправляет ошибку «404 Not Found» в общем случае или «410 Gone» если найдёт файл default.xml.410
.
MIME меняются довольно редко, нет нужны каждый раз считывать информацию о них из файлов конфигурации или реестра, поэтому в сервере жёстко прописаны стандартные MIME типы содержимого и расширения файлов.
Константы с расширениями файлов, функции обработки MIME располагаются в модуле Mime.bas
.
В структуру типов документа также встроен флаг, отвечающий за текстовое содержимое. Если функции из модуля Mime.bas
определят, что запрашиваемый клиентом документ является текстом (например: text/plain
, text/html
, application/xml
, application/xhtml
), то для такого файла сервер отправит кодировку, указанную в настройках сайта.
Когда клиент запрашивает файл с незарегистрированным расширением, то сервер не может найти для него MIME тип. В таком случае сервер ответит ошибкой «403 Forbidden». Таким образом клиенту не будут отправлены файлы конфигурации *.config
.
Если запрашиваемый клиентом файл не найден, то сервер ищет файл с расширением *.410
. Если он будет найден, то сервер отправит ошибку «410 Gone». Если не найден, то будет отправлена ошибка «404 Not Found».
Ошибка «404 Not Found» подразумевает, что файл не найден, но в будущем может появиться по этому пути. Ошибка «410 Gone» используется для указания того, что файл раньше существовал по этому пути, но теперь удалён навсегда и клиентам следует удалить все ссылки на такой файл. Для индикации этого случая предусмотрен файл с двойным расширением *.410
.
Сервер не умеет сжимать файлы «на лету», однако он умеет отдавать уже готовое сжатое содержимое. Для этого сжатое содержимое должно располагаться в специальном файле с двойным расширением. Для сжатия типа gzip
используется расширение *.gz
, для сжатия deflate
— расширение *.deflate
.
Например, имеем файл default.htm
. Сжатое содержимое должно располагаться в файле default.htm.gz
.
Для текстовых файлов кодировка определяется по расширению оригинального файла и добавляется в заголовок Content-Type
.
Сервер проверяет существование сжатых вариантов оригинального файла. Если таковые имеются, то в заголовке Vary
устанавливает строку Accept-Encoding
. Затем сервер просматривает заголовок запроса клиента Accept-Encoding
. Если в заголовке указан подходящий тип сжатого содержимого, то сервер отправляет соответствующий сжатый файл:
Поддерживаемый тип сжатия | Отправляемый клиенту файл |
---|---|
gzip | *.gz |
deflate | *.deflate |
Вебсервер можно скомпилировать как обычное консольное приложение и как службу Windows.
Для сборки используем пакетный файл следующего содержания:
set FBC_32="Путь к каталогу компилятора\fbc32.exe"
set FBC_64="Путь к каталогу компилятора\fbc64.exe"
set OPTIONS=-O 3 -gen gcc -Wc -ffunction-sections,-fdata-sections -Wl --gc-sections
%FBC_32% -m Station922 -l crypt32 -x Station922_x86.exe %OPTIONS% src\*.bas src\*.RC
%FBC_64% -m Station922 -l crypt32 -x Station922_x64.exe %OPTIONS% src\*.bas src\*.RC
Используем следующий пакетный файл (запуск от администратора):
set current_dir=%~dp0
sc create Station922 binPath= "%current_dir%Station922.exe /service" start= "auto" DisplayName= "WebServer written in FreeBASIC"
sc start Station922
Используем следующий пакетный файл (запуск от администратора):
sc stop Station922
sc delete Station922