Информация об изменениях

Сообщение RESTinio 0.3: header-only C++14 библиотека с HTTP/Websock с от 17.10.2017 15:08

Изменено 17.10.2017 18:51 so5team

RESTinio 0.3: header-only C++14 библиотека с HTTP/Websock сервером
RESTinio -- это header-only, кросс-платформенный инструмент для встраивания HTTP/Websocket в С++ приложение. Он использует standalone версию ASIO Главная задача -- упростить асинхронную обработку запросов. Чтобы, грубо говоря, обработчик спокойно мог потратить 15 секунд на формирование ответа, но это бы не влияло на параллельные запросы.

Библиотека распространяется под BSD-3-CLAUSE лицензией. Мы говорим, что она находится в состоянии beta-версии, т.к. не уверены, что ее API в достаточной степени стабилизировался и не претерпит ломающих изменений в будущем. Но сама реализация достаточно стабильна (например, на RESTinio было сделано одно из решений для Mail.ru-шного HighloadCup-а, которое заняло 41-е место в финале конкурса).

Вот как будет выглядеть простейший http-сервер, который отвечает на все запросы hello-world сообщением:

#include <iostream>
#include <restinio/all.hpp>

int main()
{
  restinio::run(
    restinio::on_this_thread() // Run server on this thread.
      .port(8080)
      .address("localhost")
      .request_handler([](auto req) {
        return req->create_response().set_body("Hello, World!").done();
      }));

  return 0;
}


В данном примере обработчик запросов предельно прост, но, конечно, RESTinio дает доступ к о всем параметрам запроса, что позволяет делать более сложные обработчики.

Возможности:
  • Асинхронная обработка запросов. В случаях, когда данные для ответа на запрос не могут быть получены сразу (или почти сразу), то можно сохранить хэндл запроса для дальнейшей обработки (например, в другом контексте исполнения) и вернуться к этому запросу, когда все данные будут готовы.
  • HTTP pipelining. Хорошо работает в связке с асинхронная обработка запросов.
  • Контроль за таймаутами. *RESTinio* может помочь в обработке “плохих” соединений, например из которых приходит "GET /", а затем они просто висят.
  • Построители ответов. Например, если нужно тело chunked-encoding, то в *RESTinio* есть и такой билдер.
  • Поддержка TLS (HTTPS).
  • Базовая поддержка websocket. При помощи restinio::websocket::basic::upgrade() можно начать websocket сессию используя соединение, в котором был получен исходный upgrade-запрос.
  • Может быть запущен на стороннем asio::io_context. RESTinio отделен от контекста исполнения, что, например, позволяет запустить 2 сервера используя один asio::io_context или встраивать RESTinio в существующее приложение построенное на ASIO и для этого не потребуется отдельный io_context.
  • Некоторые настройки для оптимизации. Можно задать дополнительные опции для акцептора и сокета. Если RESTinio работает на пуле, то можно задать чтобы соединения принимались параллельно и/или создание внутренних объектов для работы с соединением создавались отдельно, это позволит быстрее принимать новые соединения.

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

Взгляд со стороны, пожелания, предложения и конструктивная критика приветствуются!
RESTinio 0.3: header-only C++14 библиотека с HTTP/Websock с
RESTinio -- это header-only, кросс-платформенный инструмент для встраивания HTTP/Websocket в С++ приложение. Он использует standalone версию ASIO Главная задача -- упростить асинхронную обработку запросов. Чтобы, грубо говоря, обработчик спокойно мог потратить 15 секунд на формирование ответа, но это бы не влияло на параллельные запросы.

Библиотека распространяется под BSD-3-CLAUSE лицензией. Мы говорим, что она находится в состоянии beta-версии, т.к. не уверены, что ее API в достаточной степени стабилизировался и не претерпит ломающих изменений в будущем. Но сама реализация достаточно стабильна (например, на RESTinio было сделано одно из решений для Mail.ru-шного HighloadCup-а, которое заняло 41-е место в финале конкурса).

Вот как будет выглядеть простейший http-сервер, который отвечает на все запросы hello-world сообщением:

#include <iostream>
#include <restinio/all.hpp>

int main()
{
  restinio::run(
    restinio::on_this_thread() // Run server on this thread.
      .port(8080)
      .address("localhost")
      .request_handler([](auto req) {
        return req->create_response().set_body("Hello, World!").done();
      }));

  return 0;
}


В данном примере обработчик запросов предельно прост, но, конечно, RESTinio дает доступ к о всем параметрам запроса, что позволяет делать более сложные обработчики.

Возможности:
  • Асинхронная обработка запросов. В случаях, когда данные для ответа на запрос не могут быть получены сразу (или почти сразу), то можно сохранить хэндл запроса для дальнейшей обработки (например, в другом контексте исполнения) и вернуться к этому запросу, когда все данные будут готовы.
  • HTTP pipelining. Хорошо работает в связке с асинхронной обработкой запросов.
  • Контроль за таймаутами. *RESTinio* может помочь в обработке “плохих” соединений, например из которых приходит "GET /", а затем они просто висят.
  • Построители ответов. Например, если нужно тело chunked-encoding, то в *RESTinio* есть и такой билдер.
  • Поддержка TLS (HTTPS).
  • Базовая поддержка websocket. При помощи restinio::websocket::basic::upgrade() можно начать websocket сессию используя соединение, в котором был получен исходный upgrade-запрос.
  • Может быть запущен на стороннем asio::io_context. RESTinio отделен от контекста исполнения, что, например, позволяет запустить 2 сервера используя один asio::io_context или встраивать RESTinio в существующее приложение построенное на ASIO и для этого не потребуется отдельный io_context.
  • Некоторые настройки для оптимизации. Можно задать дополнительные опции для акцептора и сокета. Если RESTinio работает на пуле, то можно задать чтобы соединения принимались параллельно и/или создание внутренних объектов для работы с соединением создавались отдельно, это позволит быстрее принимать новые соединения.

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

Взгляд со стороны, пожелания, предложения и конструктивная критика приветствуются!