Мы выпустили RESTinio 0.6.1!

2019.11.13

Эта версия содержит вспомогательные инструменты для упрощения работы с HTTP-полями.

В предыдущих версиях в RESTinio были только средства проверки наличия конкретного HTTP-поля и получения этого поля в первоначальном, еще неразобранном виде. Проверка корректности формата значения поля и разбор значения на отдельные составляющие ложилась на самого пользователя.

Начиная с версии 0.6.1 RESTinio предоставляет ряд вспомогательных средств, которые выполняют разбор содержимого HTTP-полей. Например, вот так теперь можно получить доступ к содержимому поля Content-Type:

#include <restinio/all.hpp>
#include <restinio/helpers/http_field_parsers/content-type.hpp>

...

auto on_request(const restinio::request_handle_t & req) {
   namespace hfp = restinio::http_field_parsers;
   // Get the content of Content-Type field and parse it.
   const auto content_type = hfp::content_type_value_t::try_parse(
         // value_of will throw if there is no Content-Type.
         req->header().value_of(restinio::http_field::content_type));
   if(content_type) {
      // Now we can access values of Content-Type directly.
      if("text" == content_type->media_type.type &&
            "plain" == content_type->media_type.subtype) {
         // It is text/plain content. Try to detect charset for it.
         const auto charset = hfp::find_first(
               content_type->media_type.parameters,
               "charset");
         if(charset) {
            ... // Handling existing charset value.
         }
         else {
            ... // Handling missing charset value.
         }
         ... // Some processing.
      }
      else if("application" == content_type->media_type.type &&
            "json" == content_type->media_type.subtype) {
         // It is application/json content.
         ... // Some processing.
      }
   }
   else {
      // There is some error with parsing of Content-Type value.
      ... // Some error handling code.
   }
}

В версии 0.6.1 таким образом реализована поддержка HTTP-полей Accept, Cache-Control, Content-Encoding, Content-Disposition, Content-Type. Средства разбора других HTTP-полей будут добавляться в последующих версиях RESTinio. Вы можете повлиять на скорость этого процесса если сообщите нам, поддержку каких HTTP-полей вы хотели бы видеть в RESTinio в первую очередь.

С помощью этих средств в RESTinio был добавлен набор вспомогательных функций для работы с multipart телами запросов. Так, в версии 0.6.1 пройтись по всем частям multipart тела можно посредством вспомогательной функции enumerate_parts из пространства имен restinio::multipart_body:

#include <restinio/all.hpp>
#include <restinio/helpers/multipart_body.hpp>

...

auto on_post(const restinio::request_handle_t & req) {
   using namespace restinio::multipart_body;
   const auto result = enumerate_parts( *req,
      [](parsed_part_t part) {
         ... // Some actions with the current part.
         return handling_result_t::continue_enumeration;
      },
      "multipart""form-data" );
   if(result) {
      ... // Producing positive response.
   }
   else {
      ... // Producing negative response.
   }
   return restinio::request_accepted();
}

Одно из применений запросов с multipart телами -- это загрузка файлов на сервер. RESTinio 0.6.1 предлагает средства для упрощения реализации этой операции (но сама реализация все-таки остается задачей пользователя). Вспомогательная функция enumerate_parts_with_files из пространства имен restinio::file_upload позволяет перечислить все части multipart тела, в которых выполняется загрузка файла согласно RFC1867:

#include <restinio/all.hpp>
#include <restinio/helpers/file_upload.hpp>

...

auto on_post(const restinio::request_handle_t & req) {
   using namespace restinio::file_upload;

   const auto result = enumerate_parts_with_files( *req,
      [](part_description_t part) {
         ... // Some actions with the current uploaded file.
         return handling_result_t::continue_enumeration;
      } );
   if(result) {
      ... // Producing positive response.
   }
   else {
      ... // Producing negative response.
   }
   return restinio::request_accepted();
}

В состав штатных примеров RESTinio теперь входит пример file_upload, который демонстрирует простой сценарий использования enumerate_parts_with_files.

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

Новая версия RESTinio доступна в основном репозитории на github, а так же через системы управления зависимостями vcpkg и conan.

Документация находится здесь.

Также доступна Doxygen документация: RESTinio-0.6 API Reference.

Если вам чего-то не хватает в RESTinio и вы хотели бы увидеть в RESTinio нужную вам функциональность, то можете сообщить нам об этом через Issues на github или Google-группу, либо же написав на info@stiffstream.com. Вы так же можете заказать у нас доработку RESTinio под свои нужды.