Skip to content
Открытый исходный код · MIT

Веб-фреймворк
на чистом Си

Высокопроизводительный сервер для Linux: HTTP/1, HTTP/2 и HTTP/3 (QUIC), WebSocket, базы данных и ORM из коробки — без обратного прокси и рантайм-зависимостей

cwfr — bash live
$
0 req/s p99 0.00 ms0 conn
3HTTP-протоколаHTTP/1.1 · HTTP/2 · HTTP/3
4драйвера баз данныхPostgreSQL · MySQL · Redis · SQLite
~100 µsна запростипичная задержка под нагрузкой
MITоткрытый кодисходный код свободно доступен на GitHub
Быстрый старт

Запустите сервер за пару команд

Склонируйте репозиторий, соберите проект с нужными драйверами баз данных и запустите сервер одной командой.

bash
git clone https://github.com/fraxer/C-web-framework.git
cd C-web-framework/backend

mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release \
  -DINCLUDE_POSTGRESQL=yes \
  -DINCLUDE_MYSQL=yes \
  -DINCLUDE_REDIS=yes \
  -DINCLUDE_SQLITE=yes
cmake --build . -j$(nproc)

./exec/cwfr -c /path/to/config.json
Маршрут — config.json
{
  "/": {
    "GET": {
      "file": "handlers/libindexpage.so",
      "function": "index"
    }
  }
}
Обработчик — handlers/indexpage.c
#include "http.h"

void index(httpctx_t* ctx) {
  ctx->response->send_data(
    ctx->response,
    "Hello world!"
  );
}

Обработчик — это просто функция — Каждый маршрут загружает обработчик из .so-библиотеки. Прочитайте запрос, сформируйте ответ — больше ничего настраивать не нужно.

Руководство по сборке →
Возможности

Всё необходимое в одном фреймворке

Полный набор инструментов для современных веб-сервисов — протоколы, базы данных, безопасность и утилиты из коробки.

HTTP/3 · QUIC

Собственный стек QUIC (RFC 9000) поверх UDP: рукопожатие TLS 1.3 за один RTT, нет блокировки головы очереди, миграция соединений между сетями — телефон перешёл с Wi-Fi на LTE, соединение живо.

  • Параллельные потоки запросов в одном соединении
  • QPACK-сжатие заголовков
  • Трейлеры, 103 Early Hints, 100 Continue
  • Автоанонс через Alt-Svc — клиенты переходят сами
Подробнее →

HTTP/2

Мультиплексирование до 100 потоков, HPACK и защита от Rapid Reset.

  • WebSocket поверх h2 (Extended CONNECT)
  • Трейлеры и 103 Early Hints
  • h2c upgrade для plaintext
Подробнее →

WebSocket

Каналы реального времени с broadcasting и именованными группами.

  • Именованные каналы и фильтрация получателей
  • permessage-deflate сжатие
  • Работает поверх HTTP/1.1 и HTTP/2 (Extended CONNECT)
Подробнее →

HTTP/1.1

Полный сервер и клиент: маршрутизация, виртуальные хосты, TLS.

  • Маршруты с динамическими параметрами
  • Виртуальные хосты, regex-домены, IDN
  • multipart/form-data и загрузка файлов
Подробнее →

Базы данных

Четыре драйвера за единой API с ORM и миграциями.

PostgreSQLMySQLRedisSQLite
  • ORM-модели и prepared statements
  • Миграции схемы из коробки
  • Транзакции и пулы соединений
Подробнее →

Безопасность

Аутентификация, сессии и RBAC без внешних сервисов.

  • PBKDF2-HMAC-SHA256 для паролей
  • Сессии: файлы, Redis, БД (AES-256-GCM)
  • Rate limiting и валидаторы данных
Подробнее →

Хранилище и Email

Локальный FS и S3 плюс транзакционная почта с DKIM.

  • S3-совместимые сервисы
  • multipart-загрузка файлов в хранилище
  • SMTP-клиент и шаблоны писем
Подробнее →

Инструменты

Шаблонизатор, i18n, JSON, JWT и планировщик задач.

  • i18n на gettext: плюрализм, fallback
  • Планировщик: interval, daily, weekly
  • str_t с SSO, HashMap, JSON-парсер
Подробнее →

И это ещё не всё

Горячая перезагрузка обработчиков, логирование, HTTP-клиент, планировщик задач и другое — в документации.

Открыть документацию →
Производительность

Замеры на одной машине

Результаты реальных замеров в контейнерах: обработка JSON, запросы PostgreSQL и отдача статических файлов. Выберите нагрузку, чтобы увидеть результаты и условия.

Разобрать JSON и посчитать ключи первого уровня

POST /count · 1 048 576 байт · 4097 ключей · вложенные объекты и разные типы. Один рабочий процесс приложения, восемь потоков выполнения, одинаковый nginx-прокси и лимиты ресурсов.

Медианы пяти прогонов по 15 секунд.
Фреймворкreq/sp99, мсCPU/запрос, мксRSS медиана, МиБ
cwfr (C)1 90846,133 35284,82
Spring Boot (Java)1 72743,924 124579,70
facil.io (C)8281 896,616 80237,80
Laravel (PHP)823112,999 082315,58
Fiber (Go)679493,5611 145200,59
Fastify (JavaScript)595568,0012 648540,44
Ruby on Rails (Ruby)267295,044 350241,94
Kore + Jansson (C)210448,1621 97673,18
Django (Python)179517,216 00088,33

p99 — 99-й перцентиль времени ответа с точки зрения клиента нагрузки: 99% ответов приходят быстрее. Это сквозное время через прокси, включая ожидание в очередях, а не только работа CPU приложения.

CPU относится к контейнерам приложений; расход прокси приведён отдельно в отчёте. Сервер: 8 логических CPU на 4 физических ядрах, 2 ГиБ на контейнер. Клиент: отдельные ядра, 8 потоков.

RSS — сумма резидентной памяти процессов приложения, включая управляющие процессы; снимается каждые 200 мс под нагрузкой. В таблице медиана медиан пяти прогонов.

Тесты

Проверен тестами, фаззингом и сверен с RFC

Кода тестов больше, чем кода ядра. Каждый слой ловит то, что пропускают другие: unit-тесты фиксируют поведение, фаззеры забрасывают мусором каждый парсер, а интеграционные сценарии перезапускают, перезагружают и нагружают живой сервер.

2 872unit-тестов

108 104 проверки в 137 файлах, прогон ≈ 5 с под AddressSanitizer; HTTP/2 и HTTP/3 ещё и в отдельных раннерах.

295проверок на живой БД

Настоящий SQL против PostgreSQL, у каждого прогона своя схема; есть наборы для MySQL, Redis и SQLite.

47фазз-целей

HTTP/1–3, HPACK, QPACK, QUIC, WebSocket, JSON, JWT и шаблоны. В последнем аудите — ≈ 183 млн входов.

20сценариев на живом сервере

Жёсткая и мягкая перезагрузка, миграция QUIC, 0-RTT, IPv6, лимиты памяти и длительные прогоны.

147/147 · 49/49h2spec · h3spec

Все проверки соответствия HTTP/2 и HTTP/3 пройдены; h2load дал 300 тыс. запросов без единой ошибки.

ASan · TSanа также UBSan и LSan

Ни одной ошибки памяти и ни одной гонки под нагрузкой в 400 тыс. запросов.

Покрытие строк ядра по подсистемам

46 007 исполняемых строк, gcov. По убыванию покрытия тестами.

Тесты (unit + БД)Фаззинг
QUIC88,2%78,6%
WebSocket87,7%77,9%
HTTP/3 · QPACK85,2%71,0%
SMTP · почта73,8%50,8%
HTTP/1.1 · клиент72,9%54,8%
Утилиты70,9%68,9%
Шаблоны, формы, сессии59,3%35,4%
БД и ORM51,5%27,2%
HTTP/2 · HPACK50,7%73,6%
Рантайм сервера41,3%21,2%

Кто какие строки достаёт

Фаззинг достаёт строки, до которых не дошёл ни один тест; вместе слои покрывают больше, чем каждый по отдельности.

70,0%ядра вместе · тесты 65,1% · фаззинг 51,0%
  • Только тесты19,0%
  • Тесты и фаззинг46,0%
  • Только фаззинг5,0%
  • Не достигнуто30,0%

Код тестов и код ядра

Строки на Си, shell и Python, посчитанные одинаково для обеих сторон.

Ядро106 213
Тесты109 877
  • Unit-тесты81 396
  • Фаззинг14 886
  • БД, интеграция, стенды13 595

Как измерено — 1 октября 2026: сборка ядра с --coverage, unit- и БД-раннеры, затем каждая фазз-цель по 60 с. Все 24 стадии — от сборок под ASan и TSan до h3spec — запускает один скрипт ci.sh.

Тесты на GitHub →
Области применения

Где применяется фреймворк

REST API

Высокопроизводительные API для мобильных и веб-приложений

Real-time

Чаты, уведомления и live-обновления через WebSocket

Микросервисы

Микросервисы и монолитные приложения

API Gateway

Маршрутизация и проксирование запросов между сервисами

Админ-панели

Аутентификация, RBAC и CRUD-операции

Загрузка файлов

Локальное и S3-совместимое облачное хранилище

Email-сервисы

Транзакционная отправка писем с DKIM

i18n

Многоязычный контент на базе gettext и плюрализма

Начните прямо сейчас

Создавайте быстрые веб-сервисы на Си

Изучите введение, посмотрите примеры или откройте исходный код на GitHub.

Выпущено под лицензией MIT.