Re[3]: fir: другая HTTP/WebSocket либа с zero-copy внутри бе
От: pkl  
Дата: 20.10.17 11:18
Оценка: 10 (1)
Здравствуйте, MTD, Вы писали:

MTD>Здравствуйте, pkl, Вы писали:


pkl>>Входной HTTP/1.1 протокол парсится с минимальным кол-вом копирований данных.

pkl>>Распарсенный HTTP представляет собой просто набор указателей на разные места во входном буфере, куда данные залетели изначально.
pkl>>Нет привязки к boost или другой сетевой библиотеке, на нижнем уровне лежит класс TCP сервера, реализованный на epoll, но можно подменить что угодно своё с похожим API.
pkl>>Написано по мотивам внутренностей nginx. Минимум new/delete, всё переиспользуется.

MTD>Крайне интересно звучит. Какие планы по развитию или чисто just for fun? Обработчики запросов где и как обрабатываются?

Just For Fun конечно, я есть частное лицо, а не организация. Планы могут быть когда ты можешь их гарантировать, а что может гарантировать частное лицо без договора.
Примерные планы — юзать как основное сетевое двигло в своих fun-проектах, дорабатывать по мере надобности, рефакторить как накатит волна.

TCPServerEpoll — это шаблонный класс, куда нужно передать класс фабрики ресурсов. Когда приходит TCP-коннект, то TCPServerEpoll лезет в фабрику ресурсов и говорит "дай объект коннекта для типа 70", где 70 — это то что указал юзер при открытии порта на прослушивание. Объект может быть new или взят из списка свободных (кеш).

Фабрика понимает, что 70 — это HTTP коннект, например. Там их всего несколько типов из коробки, есть например примитивный "bin" протокол для общения демонов между собой. Все коннекты наследуют класс Connection, методы которого eventRead(), eventWrite(), eventClose() и дёргает TCPServerEpoll при соответствующих событиях.

Далее внутри каждого конкретного дочернего типа Connection есть свои eventRead() и т.п. Но общее одно — сам читай из дескриптора данные куда тебе надо.

Преследуя политику минимального копирования данных, TCPServerEpoll не пытается сам читать данные во временные буферы, которые потом отдаёт абстрактному коннекшну. Сделано как в nginx: пускай коннекшн сам решает надо ли ему вообще читать эти данные и пускай сам читает СРАЗУ в тот буфер где они будут нужны и столько сколько нужно, а не занимается копированием из нашего буфера. Поэтому в ConnectionHTTP например, в зависимости от состояния (что мы сейчас пытаемся прочитать — хидеры или BODY) данные читаются в разные буферы и т.п. Вот стартовая процедура чтения данных в ConnectionHTTP https://github.com/pavelkolodin/fir/blob/master/net/connection_http.h#L285 — она читает и разбирает headers.

Есть понятие Responder. Это тип "отвечальщик" — там "хендлеры" и живут ( пример Responder ) Responder передаётся как шаблонный в фабрику. Когда ConnectionHTTP допринимал запрос и понял что запрос нормальный, он говорит фабрике — дай Responder, я буду отвечать! Далее делается что-то типа responder->dataHTTP(this) и ответ отправляется обратно. У Responder должны быть методы dataHTTP, dataWS, dataBin, closeHTTP, closeWS, closeBin иначе не скомпилицца. Это и есть хендлеры. В них тебе дают голые headers, cookies, body и делай с ними что хочешь. Есть там какой-то ответный буфер, туда можно запилить ответ и вернуться, а ConnectionHTTP сам отправит ответ.

ConnectionHTTP на конечных автоматах — данные могут приходить любыми кусочками.

Некоторые штуки не реализованы — например нет поддержки gzip, нет HTTP Range_requests, нет ещё какой-то важной фигни. Зато из коробки есть miltipart/form-data -- можно запощенные HTTP-формочки парсить.

ConnectionWebSocket реализован тоже на конечных автоматах, работает стабильно. В нём есть пара лишних копирований данных (из-за непоняток с вопросами владения буферами). Также в нём отсутствует пара каких-то второстепенных моментов, типа отработки PING\PONG, хотя может и запилено — не помню. В продакшене на http://fintank.ru этот ConnectionWebSocket вроде стабильно работает часами, но я бы над ним ещё поработал.

В целом fir надо немного отрефакторить, там часть написана когда я ещё малолетним дебилом был — под c++14 надо причёсывать, про кеш CPU подумать, lock-free внедрить, мьютексов дурацких повыкидывать если есть...
Отредактировано 20.10.2017 11:26 pkl . Предыдущая версия . Еще …
Отредактировано 20.10.2017 11:25 pkl . Предыдущая версия .
Re[4]: fir: другая HTTP/WebSocket либа с zero-copy внутри бе
От: uzhas Ниоткуда  
Дата: 23.10.17 05:54
Оценка:
Здравствуйте, pkl, Вы писали:

pkl>В целом fir надо немного отрефакторить, там часть написана когда я ещё малолетним дебилом был — под c++14 надо причёсывать, про кеш CPU подумать, lock-free внедрить, мьютексов дурацких повыкидывать если есть...


прежде всего автотесты нужны.
автотесты — это программки, которые говорят OK/FAIL при запуске. а те тесты, что в репе лежат, лучше удалить
Re: RESTinio 0.4: header-only C++14 библиотека с HTTP/Websock
От: so5team https://stiffstream.com
Дата: 27.12.17 14:20
Оценка: 6 (2) +1
Завершены работы над версией 0.4. В ней мы доделали многое из того, что хотели иметь в RESTinio-1.0, и теперь можно рассматривать RESTinio-0.4 как стабильную бета версию. Полный список изменений можно увидеть тут.

Репозиторий проекта: https://bitbucket.org/sobjectizerteam/restinio-0.4

Документация: https://stiffstream.com/en/docs/restinio/0.4
Re: RESTinio 0.4.1 released!
От: so5team https://stiffstream.com
Дата: 30.01.18 14:34
Оценка: 2 (1)
Очередное обновление RESTinio (v.0.4.1)!

Что нового:


Основной репозиторий RESTinio находится на bitbucket (есть github зеркало).

Документация находится здесь.
RESTinio-0.4.3 с поддержкой sendfile
От: so5team https://stiffstream.com
Дата: 06.03.18 11:24
Оценка:
Мы обновили свою легковесную C++14 библиотеку для встраивания HTTP-входа в C++ приложения до версии 0.4.3.

Основные изменения в RESTinio со времени последнего анонса:

Библиотека живет на bitbucket-е (https://bitbucket.org/sobjectizerteam/restinio-0.4) c зеркалом на github-е (https://github.com/Stiffstream/restinio), документация доступна у нас на сайте (https://stiffstream.com/en/docs/restinio/0.4/). Распространяется под BSD-3-CLAUSE лицензией.

Мы создавали RESTinio для того, чтобы иметь возможность асинхронной обработки входящих запросов в случаях, когда для формирования ответа нужно обратиться к медленно отвечающему стороннему сервису. Иногда обращения к таким сторонним сервисам нужно делать посредством HTTP. Для таких целей широко используется Си-шная библиотека libcurl. Подружить асинхронную обработку входящих запросов посредством RESTinio с асинхронной обработкой исходящих запросов посредством libcurl можно несколькими способами. Подробнее эту тему мой коллега раскрыл в небольшой серии статей: часть 1, часть 2, часть 3.

Развитие RESTinio продолжается. У нас есть свои идеи о том, что можно было бы добавить в следующих версиях библиотеки. Но нам было бы очень интересно услышать пожелания от тех, кто смотрел на RESTinio, но еще не начал её использовать:
Отредактировано 06.03.2018 16:36 so5team . Предыдущая версия .
RESTinio-0.4.4 с поддержкой компрессии
От: so5team https://stiffstream.com
Дата: 05.04.18 17:13
Оценка: 2 (1)
RESTinio обновился до версии 0.4.4.

Что изменилось:

Библиотека по-прежнему живет на bitbucket-е (https://bitbucket.org/sobjectizerteam/restinio-0.4) c зеркалом на github-е (https://github.com/Stiffstream/restinio), документация доступна у нас на сайте (https://stiffstream.com/en/docs/restinio/0.4/). Распространяется под BSD-3-CLAUSE лицензией.
Отредактировано 05.04.2018 19:13 so5team . Предыдущая версия . Еще …
Отредактировано 05.04.2018 17:14 so5team . Предыдущая версия .
c++ http server
Re: RESTinio-0.4.5.1 с портом под vcpkg
От: so5team https://stiffstream.com
Дата: 08.05.18 11:41
Оценка:
RESTinio обновился до версии 0.4.5.1.

Что изменилось:

Библиотека по-прежнему живет на bitbucket-е (https://bitbucket.org/sobjectizerteam/restinio-0.4) c зеркалом на github-е (https://github.com/Stiffstream/restinio), документация доступна у нас на сайте (https://stiffstream.com/en/docs/restinio/0.4/). Распространяется под BSD-3-CLAUSE лицензией.
Re: Пример проекта, который использует RESTinio
От: so5team https://stiffstream.com
Дата: 09.07.18 11:34
Оценка:
Мы написали Shrimp небольшой демо-проект, в котором, среди всего прочего, используется и RESTinio. На хабре можно почитать достаточно подробную статью о нем: Shrimp: масштабируем и раздаем по HTTP картинки на современном C++ посредством ImageMagic++, SObjectizer и RESTinio.

Если совсем коротко, то Shrimp -- это небольшой сервис, который раздает отмасштабированные картинки из заданной директории.

Репозиторий на bitbucket: https://bitbucket.org/sobjectizerteam/shrimp-demo
Зеркало на github: https://github.com/Stiffstream/shrimp-demo
Re[2]: RESTinio 0.3: header-only C++14 библиотека с HTTP/Webso
От: so5team https://stiffstream.com
Дата: 09.07.18 11:48
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>1. Каково ваше позиционирование фреймворка? Какова его ниша?


Вот здесь
Автор: so5team
Дата: 09.07.18
нагляднее про позиционирование и возможное применение. Совсем коротко напомним: RESTinio развивается как инструмент для прикручивания REST API к уже существующему C++ному коду. Особенно, если прикладная обработка запросов занимается сотни/тысячи/десятки тысяч миллисекунд (как в задачах по обработке больших объемов данных) и, поэтому нужен асинхронный HTTP-сервер, который не будет блокировать IO-контексты на время прикладной обработки запроса.

Еще поднималась тема nginx-а перед приложением с RESTinio внутри. Этот сценарий выставления REST API наружу настолько очевиден, что его не было смысла даже обсуждать. Как раз для демо-страничка для shrimp-а подобным образом и организована: наружу смотрит nginx с SSL-ем, а за ним стоит C++ное приложение с RESTinio внутри.
Re[2]: Пример проекта, который использует RESTinio
От: so5team https://stiffstream.com
Дата: 17.08.18 09:16
Оценка:
Здравствуйте, so5team, Вы писали:

S>Если совсем коротко, то Shrimp -- это небольшой сервис, который раздает отмасштабированные картинки из заданной директории.


S>Репозиторий на bitbucket: https://bitbucket.org/sobjectizerteam/shrimp-demo

S>Зеркало на github: https://github.com/Stiffstream/shrimp-demo

Если кому-то интересно, то ссылки еще на две статьи, которые рассказывают о дальнейшем развитии этого демо проекта:

"Развиваем Shrimp: контролируем параллельные запросы, логируем через spdlog и еще…"
"Делаем Shrimp еще полезнее: добавляем перекодирование картинок в другие форматы"
Re[2]: RESTinio 0.4.1 released!
От: Igore Россия  
Дата: 17.08.18 09:46
Оценка:
Здравствуйте, so5team, Вы писали:

S> Поддержка Boost::ASIO. Boost::ASIO, начиная с версии 1.66, включает в себя изменения, сделанные ранее в stand-alone версии ASIO, поэтому стало возможным добавить интеграцию с Boost версией ASIO, которую мы собираемся поддерживать и в дальнейшем. Подробнее смотрите в документации.


А Boost.Beast не смотрели, можете что нибудь рассказать, про сравнение с этой библиотекой.
Re[3]: RESTinio 0.4.1 released!
От: so5team https://stiffstream.com
Дата: 17.08.18 11:09
Оценка: 2 (1)
Здравствуйте, Igore, Вы писали:

I>А Boost.Beast не смотрели, можете что нибудь рассказать, про сравнение с этой библиотекой.


По неполиткорректному мнению одного из участников нашей команды, Boost.Beast -- это какая хрень незаслуженно распиаренный и слишком низкоуровневый конструктор, который может быть полезен всего двум категориям пользователей:

Всем остальным, кому нужно просто добавить HTTP в свой C++ный код и кто не хочет писать простыни кода, лучше держаться от Boost.Beast подальше. Если хотите наглядности в подтверждении этой мысли, то просто поищите пример HelloWorld для Boost.Beast и для RESTinio (или для CROW, RestBed или C++REST SDK). А еще лучше, какой-нибудь пример, который использует что-то вроде Express.js для роутинга запросов. Что-то вроде вот этого примера из нашего README:
#include <restinio/all.hpp>

using namespace restinio;

template<typename T>
std::ostream & operator<<(std::ostream & to, const optional_t<T> & v) {
    if(v) to << *v;
    return to;
}

int main() {
    // Create express router for our service.
    auto router = std::make_unique<router::express_router_t<>>();
    router->http_get(
            R"(/data/meter/:meter_id(\d+))",
            [](auto req, auto params) {
                const auto qp = parse_query(req->header().query());
                return req->create_response()
                        .set_body(
                                fmt::format("meter_id={} (year={}/mon={}/day={})",
                                        cast_to<int>(params["meter_id"]),
                                        opt_value<int>(qp, "year"),
                                        opt_value<int>(qp, "mon"),
                                        opt_value<int>(qp, "day")))
                        .done();
            });

    router->non_matched_request_handler(
            [](auto req){
                return req->create_response( 404, "Not found").connection_close().done();
            });

    // Launching a server with custom traits.
    struct my_server_traits : public default_single_thread_traits_t {
        using request_handler_t = restinio::router::express_router_t<>;
    };

    restinio::run(
            restinio::on_this_thread<my_server_traits>()
                    .address("localhost")
                    .request_handler(std::move(router)));

    return 0;
}

Возможно, тогда станет лучше понятно, что Boost.Beast -- это для мазохистов специфических задач, а RESTinio и ему подобные -- для обычных разработчиков.
Re[2]: fir: другая HTTP/WebSocket либа с zero-copy внутри без п
От: chaotic-kotik  
Дата: 20.08.18 12:06
Оценка:
Здравствуйте, pkl, Вы писали:

pkl>В протоколе WebSocket zero-copy соблюдено плохо, можно оптимизировать.


zero-copy в смысле kernel bypass используется?
Re: Re: RESTinio 0.4.8 released!
От: so5team https://stiffstream.com
Дата: 21.08.18 10:51
Оценка:
Очередная итерация в развитии RESTinio.

Что нового в этой версии:

Библиотека живет на bitbucket-е (https://bitbucket.org/sobjectizerteam/restinio-0.4) c зеркалом на github-е (https://github.com/Stiffstream/restinio).

Документация доступна у нас на сайте (https://stiffstream.com/en/docs/restinio/0.4/). А также появилась doxygen документация: https://stiffstream.com/en/docs/restinio/0.4-api/

Распространяется под BSD-3-CLAUSE лицензией.

PS Ранее были выпущена, но здесь не публиковалась v.0.4.7
Re: Наглядное сравнение с Boost.Beast
От: so5team https://stiffstream.com
Дата: 12.09.18 13:48
Оценка: 2 (1)
Автор Boost.Beast будет делать доклад на CppCon-2018 для которого он подготовил небольшой пример на базе Boost.Beast-а.
Мы, для сравнения выразительности и удобства использования двух библиотек, сделали тот же самый пример, но на базе RESTinio:

https://bitbucket.org/sobjectizerteam/beast-cppcon2018-vs-restinio

Можно наглядно сравнить сколько и какого кода потребуется написать с использованием разных библиотек.
Re[2]: Наглядное сравнение с Boost.Beast
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 14.09.18 05:37
Оценка:
Здравствуйте, so5team, Вы писали:

S>Автор Boost.Beast будет делать доклад на CppCon-2018 для которого он подготовил небольшой пример на базе Boost.Beast-а.

S>Мы, для сравнения выразительности и удобства использования двух библиотек, сделали тот же самый пример, но на базе RESTinio:

Осталось рассказать об этом на CppCon
Re[3]: Наглядное сравнение с Boost.Beast
От: so5team https://stiffstream.com
Дата: 14.09.18 07:11
Оценка:
Здравствуйте, kaa.python, Вы писали:

S>>Автор Boost.Beast будет делать доклад на CppCon-2018 для которого он подготовил небольшой пример на базе Boost.Beast-а.

S>>Мы, для сравнения выразительности и удобства использования двух библиотек, сделали тот же самый пример, но на базе RESTinio:

KP>Осталось рассказать об этом на CppCon


Пока участвовать в заграничных конференциях у нас не получается по ряду более чем объективных причин. Поэтому пока распространяем информацию посредством Интернета.
Re: v.0.5.0: возможность работы с кастомными версиями http-parser
От: so5team https://stiffstream.com
Дата: 04.06.19 09:49
Оценка:
Со времени последнего анонса в RESTinio было исправлено несколько ошибок и было добавлено несколько новых фич. В частности, в версии 0.5.0 добавлена возможность работы RESTinio с кастомизированными версиями библиотеки http-parser. Это позволяет реализовать обработку в RESTinio нестандартных HTTP-методов.

Допустим, что следует написать REST-сервис, который должен реагировать на нестандартные методы ENCODE и DECODE. Для этого потребуется:


После этого можно будет использовать константы http_encode и http_decode при работе с RESTinio, например:
auto make_request_handler() {
    auto router = std::make_unique< restinio::router::express_router_t<> >();

    router->add_handler(http_encode, "/data", [](auto req, auto params) {...});
    router->add_handler(http_decode, "/data", [](auto req, auto params) {...});
    ...
    return router;
}


Примечание. Для реализации этой функциональности из RESTinio был удален тип http_method_t, а вместо него введен тип http_method_id_t. Если в вашем коде использовался http_method_t, то при обновлении на v.0.5.0 вам придется внести изменения в свой код.

Также в версии 0.5.0 был удален ряд вещей, которые были помечены как "deprecated" в предыдущих версиях RESTinio.

Сам RESTinio живет на BitBucket-е с зеркалом на GitHub.

Документацию можно найти здесь, а здесь находится сгенерированный Doxygen-ом справочник по API.

В общем-то, в последнее время в RESTinio попадает то, о чем просят пользователи. Так что если вы хотите увидеть что-то в RESTinio, то дайте нам знать.
Re[2]: v.0.5.0: возможность работы с кастомными версиями http-parser
От: Denis Ivlev  
Дата: 04.06.19 16:11
Оценка: -1
Здравствуйте, so5team, Вы писали:

S>Со времени последнего анонса в RESTinio было исправлено несколько ошибок


Прочитал как "наделано ошибок". Простите)
Re[3]: v.0.5.0: возможность работы с кастомными версиями http-parser
От: so5team https://stiffstream.com
Дата: 04.06.19 16:28
Оценка:
Здравствуйте, Denis Ivlev, Вы писали:

S>>Со времени последнего анонса в RESTinio было исправлено несколько ошибок


DI>Прочитал как "наделано ошибок". Простите)


Да вы своим ослоумием и "полезными" комментариями здесь резко выделяетесь, так что продолжайте. Публике нужны развлечения.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.