Skip to content

BatchedFiles/Station922

Repository files navigation

Station922

Компактный вебсервер для 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 располагаются в модуле Mime.bas.

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

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

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

Если запрашиваемый клиентом файл не найден, то сервер ищет файл с расширением *.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

Установка службы Windows

Создание службы

Используем следующий пакетный файл (запуск от администратора):

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

Releases

No releases published

Packages

No packages published