🌱Light and powerful C++ web framework for highly scalable and resource-efficient web application. It's zero-dependency and easy-portable.

Oat++ Logo


oatpp build status Language grade: C/C++ Join the chat at https://gitter.im/oatpp-framework/Lobby



  • Hey, meet the new oatpp version 1.2.5! See the changelog for details.
  • Check out the new oatpp ORM - read more here.

Oat++ is a modern Web Framework for C++. It's fully loaded and contains all necessary components for effective production level development. It's also light and has a small memory footprint.



Join Our Community

Quick Overview


Build Powerful API And Document It With Swagger-UI

See ApiController for more details.

  info->summary = "Get one User by userId";

  info->addResponse<Object<UserDto>>(Status::CODE_200, "application/json");
  info->addResponse<Object<StatusDto>>(Status::CODE_404, "application/json");
  info->addResponse<Object<StatusDto>>(Status::CODE_500, "application/json");

  info->pathParams["userId"].description = "User Identifier";
ENDPOINT("GET", "users/{userId}", getUserById,
         PATH(Int32, userId))
  return createDtoResponse(Status::CODE_200, m_userService.getUserById(userId));

Access Databases And Keep Your Data Consistent

See Oat++ ORM for more details.

      "INSERT INTO users (username, email, role) VALUES (:username, :email, :role);",
      PARAM(oatpp::String, username), 
      PARAM(oatpp::String, email), 
      PARAM(oatpp::Enum<UserRoles>::AsString, role))

Frequently Asked Questions

Q: "Oat++" name?

  • "Oat" is something light, organic, and green. It can be easily cooked and consumed with no effort.
  • "++" gives a hint that it is "something" for C++.

Q: What is the main area of Oat++ application?

Oat++ is used for many different purposes, from building REST APIs that run on embedded devices to building microservices and highly-loaded cloud applications.

But the majority of use cases appears to be in IoT and Robotics.

Q: How portable is Oat++?

Theoretically, Oat++ can be easily ported everywhere where you have threads and network stack. With an additional comparably small effort, it can be ported almost everywhere depending on how much you strip it and what would be the final binary size.

See supported platforms for additional info.

Q: What is the size of a minimal Oat++ application?

About 1Mb, depending on C/C++ std-lib and oatpp version.

Q: Which Oat++ API to choose, Simple or Async?

Always choose Simple API wherever possible. Simple API is more developed and makes the code cleaner.

Async API is designed for small, specific tasks that run at high concurrency levels ex.:

  • Serving file downloads to a large number of concurrent users (1K users and more).
  • Streaming to a large number of clients (1K or more).
  • Websocket Chat servers.

For all other purposes use simple API.



  • REST Service - A complete example of a "CRUD" service (UserService) built with Oat++. REST + Swagger-UI + SQLite.
  • REST Client - Example project of how-to use Retrofit-like client wrapper (ApiClient) and how it works.


  • Can Chat - Feature-complete rooms-based chat for tens of thousands users. Client plus Server.
  • WebSocket - Collection of oatpp WebSocket examples.
  • YUV Websocket Stream - Example project how-to create a YUV image stream from a V4L device (i.E. Webcam) using websockets.


  • SQLite - A complete example of a "CRUD" service. REST + Swagger-UI + SQLite.
  • PostgreSQL - Example of a production-grade entity service storing information in PostgreSQL. With Swagger-UI and configuration profiles.
  • MongoDB - Example project how to work with MongoDB using oatpp-mongo mondule. Project is a web-service with basic CRUD and Swagger-UI.


  • Example-IoT-Hue - Example project how-to create an Philips Hue compatible REST-API that is discovered and controllable by Hue compatible Smart-Home devices like Amazon Alexa or Google Echo.


  • HTTP Live Streaming Server - Example project on how to build an HLS-streaming server using Oat++ asynchronous API.
  • YUV Websocket Stream - Example project how-to create a YUV image stream from a V4L device (i.E. Webcam) using websockets.


  • TLS With Libressl - Example project how-to setup secure connection and serve via HTTPS.


Asynchronous API

  • Async Service - Example project on how to use asynchronous API to handle a large number of simultaneous connections.
  • Could it run on iOS or android ?

    Could it run on iOS or android ?

    Since both of them support the clang compiler.

    opened by NeoChow 67
  • Integrate into existing application which uses libevent epoll

    Integrate into existing application which uses libevent epoll

    Hi All,

    We are looking to integrate a reset server into our existing application. I am looking for some pointers on the same. Please note we are already running our libevent epoll and want to handle with the same. Is this possible?

    rgds Balaji

    Help Wanted 
    opened by bkannadassan 36
  • Missing Atomic library

    Missing Atomic library


    I was able to cross-compile a simple API for Clang ARM. But when I run the executable I get the following error: ./{executable}: error while loading shared libraries: libatomic.so.1: cannot open shared object file: No such file or directory

    The GNU Atomic library is not supported for my target devices (compatibility problems with libraries delivered by chip manfacturer).

    I'm not sure but I think Atomic is only used for a spinlock in Oat++, correct me if I'm wrong. Would there be a sollution where I wouldn't have to use Atomic?

    opened by br4m11 30
  • HttpRequest readBodyToString empty

    HttpRequest readBodyToString empty


    I cannot get the bodystring of my HttpRequestExecutor response. it is always empty. (getStatusCode and getStatusDescription are working so I know that the request have been well executed) when I use oatpp::url it works fine but when I use HttpRequestExecutor it's empty.

    can you please help me find what am i doing wrong?

    I am expecting a json response from the called API.

    here my oattp HttpRequestExecutor declaration:

     std::shared_ptr<oatpp::web::client::RequestExecutor> createOatppExecutor() {
       auto config = oatpp::libressl::Config::createShared();
       auto connectionProvider = oatpp::libressl::client::ConnectionProvider::createShared(config, "monurl", 443);
       return oatpp::web::client::HttpRequestExecutor::createShared(connectionProvider);

    my instanciation:

     auto objectMapper = oatpp::parser::json::mapping::ObjectMapper::createShared();
     //auto requestExecutor = createCurlExecutor();
     auto requestExecutor = createOatppExecutor();
     auto client = ApiClient::createShared(requestExecutor, objectMapper);

    my ApiClient function:

    API_CALL("GET", "mypath?myparameter={parameter}", doGettokeninfoheader,HEADER(String, myHeader1, "Content-type"),HEADER(String, myHeader2, "Accept"), PATH(String, parameter))

    and my call

    auto data3 = client->doGettokeninfoheader("application/x-www-form-urlencoded","application/json","PHOkrUhrhE-kz-ljWw5ci2SExSg");
    OATPP_LOGD("Api call", "string='%s'", data3->readBodyToString()->c_str());  --> empty when HttpRequestExecutor :-( 

    thanks for your help

    opened by nicolaslopez15 21
  • oatpp::base::memory::MemoryPool::freeByEntryHeader()]: Invalid EntryHeader

    oatpp::base::memory::MemoryPool::freeByEntryHeader()]: Invalid EntryHeader


    I observe this exception when I'm stopping the application with OATPP:

    terminate called after throwing an instance of 'std::runtime_error'
      what():  [oatpp::base::memory::MemoryPool::freeByEntryHeader()]: Invalid EntryHeader

    I was able to get some more logs of it:

    2020-09-16T13:31:24.530436Z DBG 322058:src/log/oatpp_logger.hpp:20 [oatpp::base::memory::MemoryPool::freeByEntryHeader()]:Error. Invalid EntryHeader. Expected poolId=9803840, entry poolId=-1610486112


    (gdb) bt
    #0  0x00007f775e5e370f in raise () from /lib64/libc.so.6
    #1  0x00007f775e5cdb25 in abort () from /lib64/libc.so.6
    #2  0x00007f770a4fd06b in __gnu_cxx::__verbose_terminate_handler() [clone .cold.1] () from /lib64/libstdc++.so.6
    #3  0x00007f770a50350c in __cxxabiv1::__terminate(void (*)()) () from /lib64/libstdc++.so.6
    #4  0x00007f770a502529 in __cxa_call_terminate () from /lib64/libstdc++.so.6
    #5  0x00007f770a502ea8 in __gxx_personality_v0 () from /lib64/libstdc++.so.6
    #6  0x00007f770a265ad3 in _Unwind_RaiseException_Phase2 () from /lib64/libgcc_s.so.1
    #7  0x00007f770a266041 in _Unwind_RaiseException () from /lib64/libgcc_s.so.1
    #8  0x00007f770a5037bb in __cxa_throw () from /lib64/libstdc++.so.6
    #9  0x00007f770a985b5e in oatpp::base::memory::MemoryPool::freeByEntryHeader(oatpp::base::memory::MemoryPool::EntryHeader*) [clone .cold.96] () 
    #10 0x00007f770ab09aea in std::_Sp_counted_ptr_inplace<oatpp::collection::LinkedList<std::shared_ptr<oatpp::web::url::mapping::Pattern::Part> >, oatpp::base::memory::PoolSharedObjectAllocator<oatpp::collection::LinkedList<std::shared_ptr<oatpp::web::url::mapping::Pattern::Part> > >, (__gnu_cxx::_Lock_policy)2>::_M_dispose() ()
    #11 0x00007f770ab09ebf in oatpp::web::url::mapping::Pattern::~Pattern() ()
    #12 0x00007f770aaff249 in oatpp::web::url::mapping::Router<oatpp::web::server::HttpRequestHandler>::~Router() ()
    #13 0x00007f770aaff04e in oatpp::web::server::HttpRouter::~HttpRouter() ()
    #14 0x00007f770aa7e979 in std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release (this=0x236b650) at /usr/include/c++/8/bits/shared_ptr_base.h:148
    #15 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release (this=0x236b650) at /usr/include/c++/8/bits/shared_ptr_base.h:148
    #16 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count (this=0x23a32c0, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/shared_ptr_base.h:728
    #17 std::__shared_ptr<oatpp::web::server::HttpRouter, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr (this=0x23a32b8, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/shared_ptr_base.h:1167
    #18 std::shared_ptr<oatpp::web::server::HttpRouter>::~shared_ptr (this=0x23a32b8, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/shared_ptr.h:103
    #19 oatpp::base::Environment::Component<std::shared_ptr<oatpp::web::server::HttpRouter> >::~Component (this=0x23a3278, __in_chrg=<optimized out>)
        at /root/.conan/data/oatpp/1.1.0/_/_/package/56e0cf6d16ee57367a0661ab743f4e43b29223f8/include/oatpp-1.1.0/oatpp/oatpp/core/base/Environment.hpp:242
    #20 zroute::ServiceComponent::~ServiceComponent (this=0x23a3170, __in_chrg=<optimized out>)
    #21 std::default_delete<zroute::ServiceComponent>::operator() (this=0x23a4020, __ptr=0x23a3170) at /usr/include/c++/8/bits/unique_ptr.h:81
    #22 std::unique_ptr<zroute::ServiceComponent, std::default_delete<zroute::ServiceComponent> >::~unique_ptr (this=0x23a4020, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/unique_ptr.h:269
    #23 zroute::HttpServer::~HttpServer (this=0x23a3f90, __in_chrg=<optimized out>)
    #24 0x00007f770a9ac001 in std::default_delete<zroute::HttpServer>::operator() (this=0x7f770e5299c0, __ptr=0x23a3f90) at /usr/include/c++/8/bits/unique_ptr.h:342
    #25 std::unique_ptr<zroute::HttpServer, std::default_delete<zroute::HttpServer> >::~unique_ptr (this=0x7f770e5299c0, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/unique_ptr.h:269
    #26 zroute::core::~core (this=0x7f770e529910, __in_chrg=<optimized out>)
    #27 core_cleanup ()
    #28 0x00007f770a9a2eff in destroy () at inroute_mod.c:137
    #29 0x0000000000582a18 in destroy_modules () at core/sr_module.c:746
    #30 0x000000000041d53d in cleanup (show_status=1) at main.c:563
    #31 0x000000000041ed12 in shutdown_children (sig=15, show_status=1) at main.c:706
    #32 0x000000000041f800 in handle_sigs () at main.c:737
    #33 0x000000000042b465 in main_loop () at main.c:1817
    #34 0x0000000000433137 in main (argc=13, argv=0x7ffd84f9ea78) at main.c:2856

    The issue started to occur after I added 2nd controller. There was no such issue with single controller.

    OATPP version is 1.1.0

    After I disabled pool allocation the issue doesn't reproduce anymore:

    --- a/CMakeLists.txt
    +++ b/CMakeLists.txt
    @@ -26,7 +26,7 @@ option(OATPP_BUILD_TESTS "Create test target for oat++" ON)
     option(OATPP_DISABLE_ENV_OBJECT_COUNTERS "Disable object counting for Release builds for better performance" OFF)
    -option(OATPP_DISABLE_POOL_ALLOCATIONS "This will make oatpp::base::memory::MemoryPool, method obtain and free call new and delete directly" OFF)
    +option(OATPP_DISABLE_POOL_ALLOCATIONS "This will make oatpp::base::memory::MemoryPool, method obtain and free call new and delete directly" ON)
     set(OATPP_THREAD_HARDWARE_CONCURRENCY "AUTO" CACHE STRING "Predefined value for function oatpp::concurrency::Thread::getHardwareConcurrency()")
     set(OATPP_THREAD_DISTRIBUTED_MEM_POOL_SHARDS_COUNT "10" CACHE STRING "Number of shards of ThreadDistributedMemoryPool")

    Looks to be connected with https://github.com/oatpp/oatpp/issues/173

    Is this a bug at OATPP custom pool memory allocator?

    Thanks in advance.

    opened by pcapdump 20
  • The process hung up when trying to stop server

    The process hung up when trying to stop server

    I create a sub thread to run my server like this:

    thread_ptr_ = std::make_shared<std::thread>(&WebServer::StartService, this);

    This is my function to start server:

    WebServer::StartService() {
        Config& config = Config::GetInstance();
        std::string port;
        Status status;
        status = config.GetServerConfigWebPort(port);
        AppComponent components = AppComponent(std::stoi(port));
        SwaggerComponent swaggerComponent("", std::stoi(port));
        /* create ApiControllers and add endpoints to router */
        auto router = components.http_router_.getObject();
        auto doc_endpoints = oatpp::swagger::AsyncController::Endpoints::createShared();
        auto user_controller = WebController::createShared();
        auto swaggerController = oatpp::swagger::AsyncController::createShared(doc_endpoints);
        /* create server */
        server_ptr_ = std::make_unique<oatpp::network::server::Server>(components.server_connection_provider_.getObject(),
        // start synchronously
        return Status::OK();

    I try to stop my web server just to call Stop() like this:

    if (server_ptr_ != nullptr) {
            server_ptr_->stop();  // cStop server
        if (thread_ptr_ != nullptr) {
            thread_ptr_ = nullptr;

    I join web thread, and wait it finishing but the process hung up. How I protect it from hanging up?

    I use async endpoint, and my server connection provider is an object of SimpleTCPConnectionProvider

    opened by BossZou 18
  • Won't build for iOS 8 or older

    Won't build for iOS 8 or older

    Hi @lganzzzo,

    I'm working on the iOS app version of the Android app that @dmcamens-legrand discussed with you recently. The oat++ library is working well on Android now, and I'm trying to make it work on iOS as well.

    Sadly, the even though the thread_local keyword was added to Xcode 8, it won't compile to devices running iOS 8 or earlier, even in the current version (Xcode 10).

    Do you have any ideas for how to use this library without using the thread_local storage functionality from C++11?

    Thank you!

    Enhancement Help Wanted 
    opened by david-novak-legrand 18
  • Does async endpoint support CORS ?

    Does async endpoint support CORS ?

    Now I'm using async endpoint in my server, I add ADD_CORS(...) in the front of every async endpoint, but it seems not work. How should I do ?

    opened by BossZou 16
  • Question about streaming possibility

    Question about streaming possibility


    I'm investigating this library and can't find the way how to implement file streaming with it.

    Let's assume huge file is stored in another storage, so I want to use own implementation of file stream, that implements (open/seek/read/write), which then can be used by a framework to get/send chunks of bytes to requestor of this file.

    Is this possible with the current state?

    opened by elgatito 16
  • Linker errors in Visual Studio 2019

    Linker errors in Visual Studio 2019

    Hello, I've successfully compiled and installed the library on my Windows platform.

    I am trying to get it working in VS2019. I've added additional libraries in Configuration Properties->C/C++->Additional Include Directories. I added .lib directory to Configuration Properties->Linker->General->Additional Library Directories and I added individual .lib to Input->Additional Dependencies. But, I get the "unresolved external symbol" errors still.

    What am I missing?

    opened by ourobor05 14
  • ResponseInterceptor HTTP and std exceptions are not passed as such

    ResponseInterceptor HTTP and std exceptions are not passed as such

    If a RequestInterceptor has an HTTP or std exception thrown, it is directed to the ErrorHandler. However, such an exception thrown in ResponseInterceptors don't do this. I think it should have the same behavior to have HTTP and std exceptions to also be passed in the ErrorHandler.

    It looks like here is where the request interceptors HTTP and std exception is passed along to the error handler: https://github.com/oatpp/oatpp/blob/05405fff862cb838473f4cccfb03103b54030389/src/oatpp/web/server/HttpProcessor.cpp#L117-L126

    And here is where it is not being passed along for response interceptors: https://github.com/oatpp/oatpp/blob/05405fff862cb838473f4cccfb03103b54030389/src/oatpp/web/server/HttpProcessor.cpp#L171-L177

    This change could most likely be lumped in with the change of providing the entire Error to the ErrorHandler, mentioned in this comment https://github.com/oatpp/oatpp/issues/277#issuecomment-660387536.

    Enhancement Code Review 
    opened by JeremyGuinn 1
  • A lot of macros functions in code

    A lot of macros functions in code

    Hello. i just noticed the project files with a lot of macros functions. for example file ApiClient_define , Wouldnt it better to have utility class to handle it with static methods? because for example 'it's not easy to debug these methods /

    I would love to help . but i'm not an experienced c++ dev. :(

    Code Review 
    opened by d9j 6
  •  How to set input header parameters in Swagger

    How to set input header parameters in Swagger

    I need to enter the token information in swagger to test the api. How do I configure ENDPOINT

    opened by lirong-Lee 0
  • Feature Suggestion: Create default database queries similar to Spring CrudRepository

    Feature Suggestion: Create default database queries similar to Spring CrudRepository

    For any given database table there is a set of common queries that could be implemented by default. Spring does that with CrudRepository and JpaRepository. This makes it a lot faster to setup a CRUD service and reduces boiler plate code.


    Database table from OAT++ Crud Example:

    CREATE TABLE AppUser (
        id          INTEGER PRIMARY KEY,
        username    VARCHAR UNIQUE,
        email       VARCHAR UNIQUE,
        password    VARCHAR,
        role        VARCHAR

    The database client in UserDb.hpp implements common queries getUserById, getAllUsers and deleteUserById. Those queries could be generated by default with knowledge provided by the UserDto.


    Similar to Spring CrudRepository I would like to provide a template parameter of type DTO that is used for common queries.


    class DatabaseClient : public oatpp::orm::CrudDbClient<UserDto> {
      explicit DatabaseClient(const std::shared_ptr<oatpp::orm::Executor>& executor) : oatpp::orm::CrudDbClient(executor) {
        // Doing standard schema migration
      // Automatically generates queries for getUserById, getAllUsers and deleteUserById
    void someFunction() {
      OATPP_COMPONENT(std::shared_ptr<DatabaseClient>, databaseClient);
    opened by kmeinhar 1
  • Feature Request: Hide DTO_FIELDS from documentation

    Feature Request: Hide DTO_FIELDS from documentation

    When declaring a DTO_FIELD in a DTO:

    DTO_FIELD_INFO(my_field) {
        info->hidden = true; // <- this
    DTO_FIELD(Int32, my_field) = 0; // Removed field, but I want to keep it eg. for backward compatibility

    I would like to be able to hide a field from the documentation.

    Another use case could be hidden features that are in development and very unstable or not useful for the end user

    opened by Bycob 1
  • Enumerator : The initializer contains too many elements

    Enumerator : The initializer contains too many elements

    Hi, creating an enum with +63 entries, we can't initialize it. The message is : The initializer contains too many elements. Four help on testing , below my enumerator code. The problem arise after the entry "eInvalidEmailAddress" and successive.

        ENUM(LicMgrApiEErrorCode, v_int32,
                   VALUE(eNoError, 0, "eNoError", "eNoError"),
    		VALUE(eProductIdMissing, 1, "eProductIdMissing", "eProductIdMissing"),
    		VALUE(eSerialNumberMissing, 2, "eSerialNumberMissing", "eSerialNumberMissing"),
    		VALUE(eInvalidDeviceId, 3, "eInvalidDeviceId", "eInvalidDeviceId"),
    		VALUE(eDeviceIdOrDateMissing, 4, "eDeviceIdOrDateMissing", "eDeviceIdOrDateMissing"),
    		VALUE(eLicenseKeySizeError, 5, "eLicenseKeySizeError", "eLicenseKeySizeError"),
    		VALUE(eLicenseKeyGenerationError, 6, "eLicenseKeyGenerationError", "eLicenseKeyGenerationError"),
    		VALUE(eDateSyntaxError, 7, "eDateSyntaxError", "eDateSyntaxError"),
    		VALUE(eNoLicenseCheckedOut, 101, "eNoLicenseCheckedOut", "eNoLicenseCheckedOut"),
    		VALUE(eNoLicenseFile, 102, "eNoLicenseFile", "eNoLicenseFile"),
    		VALUE(eLicenseFileProductIdMissing, 103, "eLicenseFileProductIdMissing", "eLicenseFileProductIdMissing"),
    		VALUE(eLicenseFileSerialNumberMissing, 104, "eLicenseFileSerialNumberMissing", "eLicenseFileSerialNumberMissing"),
    		VALUE(eLicenseFileLicenseKeyMissing, 105, "eLicenseFileLicenseKeyMissing", "eLicenseFileLicenseKeyMissing"),
    		VALUE(eLicenseKeyMismatch, 106, "eLicenseKeyMismatch", "eLicenseKeyMismatch"),
    		VALUE(eLicenseWriteError, 107, "eLicenseWriteError", "eLicenseWriteError"),
    		VALUE(eLicenseKeyError, 108, "eLicenseKeyError", "eLicenseKeyError"),
    		VALUE(eNoProductLicense, 109, "eNoProductLicense", "eNoProductLicense"),
    		VALUE(eProductVersionMismatch, 110, "eProductVersionMismatch", "eProductVersionMismatch"),
    		VALUE(e2ndLicenseNotFound, 111, "e2ndLicenseNotFound", "e2ndLicenseNotFound"),
    		VALUE(eLicenseValidationFailed, 112, "eLicenseValidationFailed", "eLicenseValidationFailed"),
    		VALUE(eLicenseDeviceIdMismatch, 113, "eLicenseDeviceIdMismatch", "eLicenseDeviceIdMismatch"),
    		VALUE(eCountedLicenseExpected, 114, "eCountedLicenseExpected", "eCountedLicenseExpected"),
    		VALUE(eUncountedLicenseExpected, 115, "eUncountedLicenseExpected", "eUncountedLicenseExpected"),
    		VALUE(eCurrentDateError, 116, "eCurrentDateError", "eCurrentDateError"),
    		VALUE(eLicenseExpired, 117, "eLicenseExpired", "eLicenseExpired"),
    		VALUE(eNetworkCardError, 118, "eNetworkCardError", "eNetworkCardError"),
    		VALUE(eDongleError, 119, "eDongleError", "eDongleError"),
    		VALUE(eComputerSidError, 120, "eComputerSidError", "eComputerSidError"),
    		VALUE(eUsbSerialNumberError, 121, "eUsbSerialNumberError", "eUsbSerialNumberError"),
    		VALUE(eDeviceIdIndexError, 122, "eDeviceIdIndexError", "eDeviceIdIndexError"),
    		VALUE(eNoModuleLicense, 123, "eNoModuleLicense", "eNoModuleLicense"),
    		VALUE(eModuleLicenseExpired, 124, "eModuleLicenseExpired", "eModuleLicenseExpired"),
    		VALUE(eInvalidModuleId, 125, "eInvalidModuleId", "eInvalidModuleId"),
    		VALUE(eDeactivationError, 126, "eDeactivationError", "eDeactivationError"),
    		VALUE(eGetSiteUrlError, 127, "eGetSiteUrlError", "eGetSiteUrlError"),
    		VALUE(eNoLoginError, 128, "eNoLoginError", "eNoLoginError"),
    		VALUE(eNonAsciiError, 129, "eNonAsciiError", "eNonAsciiError"),
    		VALUE(eCreateConnectionFailed, 130, "eCreateConnectionFailed", "eCreateConnectionFailed"),
    		VALUE(eLicenseNotValidated, 131, "eLicenseNotValidated", "eLicenseNotValidated"),
    		VALUE(eOfflineLicenseNotValidated, 132, "eOfflineLicenseNotValidated", "eOfflineLicenseNotValidated"),
    		VALUE(eLicenseValidationExpired, 133, "eLicenseValidationExpired", "eLicenseValidationExpired"),
        VALUE(eUnknowLicenseServerError, 201, "eUnknowLicenseServerError", "eUnknowLicenseServerError"),
    		VALUE(eUnknowErrorFromLicenseServer, 202, "eUnknowErrorFromLicenseServer", "eUnknowErrorFromLicenseServer"),
    		VALUE(eUnknowErrorAtLicenseServer, 203, "eUnknowErrorAtLicenseServer", "eUnknowErrorAtLicenseServer"),
    		VALUE(eLicenseCountExceeded, 204, "eLicenseCountExceeded", "eLicenseCountExceeded"),
    		VALUE(eLicenseAlreadyCheckedOut, 205, "eLicenseAlreadyCheckedOut", "eLicenseAlreadyCheckedOut"),
    		VALUE(eLicenseNotCheckedOut, 206, "eLicenseNotCheckedOut", "eLicenseNotCheckedOut"),
    		VALUE(eLicenseAlreadyBorrowed, 207, "eLicenseAlreadyBorrowed", "eLicenseAlreadyBorrowed"),
    		VALUE(eLicenseNotBorrowed, 208, "eLicenseNotBorrowed", "eLicenseNotBorrowed"),
    		VALUE(eUnknownLicenseServerRequest, 209, "eUnknownLicenseServerRequest", "eUnknownLicenseServerRequest"),
    		VALUE(eUnknownLicenseServerResponse, 210, "eUnknownLicenseServerResponse", "eUnknownLicenseServerResponse"),
    		VALUE(eInvalidLicenseHandleAtServer, 211, "eInvalidLicenseHandleAtServer", "eInvalidLicenseHandleAtServer"),
    		VALUE(eProductNotLicensedAtServer, 212, "eProductNotLicensedAtServer", "eProductNotLicensedAtServer"),
    		VALUE(eInvalidLicenseKeyFromServer, 213, "eInvalidLicenseKeyFromServer", "eInvalidLicenseKeyFromServer"),
    		VALUE(eLicenseServerCommunicationError, 214, "eLicenseServerCommunicationError", "eLicenseServerCommunicationError"),
    		VALUE(eFailedToConnectWithLicenseServer, 215, "eFailedToConnectWithLicenseServer", "eFailedToConnectWithLicenseServer"),
    		VALUE(eInvalidUserName, 301, "eInvalidUserName", "eInvalidUserName"),
    		VALUE(eInvalidPassword, 302, "eInvalidPassword", "eInvalidPassword"),
    		VALUE(eInvalidNewPassword, 303, "eInvalidNewPassword", "eInvalidNewPassword"),
    		VALUE(eUserNameExists, 304, "eUserNameExists", "eUserNameExists"),
    		VALUE(eUserNameNotFound, 305, "eUserNameNotFound", "eUserNameNotFound"),
    		VALUE(ePasswordChangeRequired, 306, "ePasswordChangeRequired", "ePasswordChangeRequired"),
    		VALUE(eInvalidEmailAddress, 307, "eInvalidEmailAddress", "eInvalidEmailAddress"),
    		VALUE(eIllegalCheckInOfflineLicenseErrorCode, 308, "eIllegalCheckInOfflineLicenseErrorCode", "eIllegalCheckInOfflineLicenseErrorCode"),
    		VALUE(eOutOfMemory, 309, "eOutOfMemory", "eOutOfMemory"), // Out of memory
    		VALUE(eLicenseIsNotNetwork, 310, "eLicenseIsNotNetwork", "eLicenseIsNotNetwork"),
    		VALUE(eInvalidActivationType, 311, "eInvalidActivationType", "eInvalidActivationType"),
    		VALUE(eUserAgreementIsNotAccepted, 312, "eUserAgreementIsNotAccepted", "eUserAgreementIsNotAccepted"),
    		VALUE(eDuplicateLicenseDetected, 313, "eDuplicateLicenseDetected", "eDuplicateLicenseDetected"),
    		VALUE(eLicenseNotFound, 314, "eLicenseNotFound", "eLicenseNotFound"),
    		VALUE(eNumberOfErrorCodes, 315, "eNumberOfErrorCodes", "eNumberOfErrorCodes")
    opened by clabnet 8
  • API question

    API question

    In file: oatpp/core/data/mapping/type/Any.hpp



    One of my Endpoints returns a DTO which has a field of type List. I use the example of a "CRUD" service built with Oat++ with swagger UI. When I generate the json into a python-client and use this Endpoint I receive:

    32 def lazy_import(): ---> 33 from hyperspace.model.any import Any 34 globals()['Any'] = Any 35

    ModuleNotFoundError: No module named 'hyperspace.model.any'

    Is there any work around to this problem?

    Thanks. Oleg.

    opened by olegZatu 2
  • Authentication & authorization example

    Authentication & authorization example

    Most of common examples in web frameworks are Authentication & authorization examples (ex. django examples). May you please add some examples regarding that.

    opened by mbnoimi 1
  • API question

    API question

    In file: oatpp/core/base/Environment.hpp



    Can we define oatpp to log into a file?


    opened by olegZatu 1
  • Exception causes crash for v.1.2.5 on Android

    Exception causes crash for v.1.2.5 on Android

    I'm trying to use this nice framework on a special Android platform based on KitKat 4.4.4. We are compiling with the Clang 3.8 compiler and these flags "--std=c++14 -DANDROID_STL=c++_shared -DANDROID_ABI=armeabi-v7a". I know it is not a supported platform so only looking for advice on how I might fix or work around the issue described below.

    The problem is that the nice OATPP_ASSERT_HTTP macro and the underlying HttpError is causing all sorts of weird crashes.

    Simple example causing a SIGILL

    ENDPOINT("GET", "/*", getFilesByPath, REQUEST(std::shared_ptr<IncomingRequest>, request))
        throw oatpp::web::protocol::http::HttpError(Status::CODE_400, "Exception will cause SIGILL!!!");
      catch(const std::exception& e)
        std::cout << "Caught exception: " << e.what() << std::endl;      

    Stacktrace from crash

    Click to expand!
    signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 5fc0a018
        r0 00000000  r1 00000000  r2 00000001  r3 00000000
        r4 5fc09f07  r5 00000000  r6 5fd3ede9  r7 6211e1e8
        r8 5fd3ede9  r9 62021000  sl 61b23870  fp 401652ec
        ip 00000001  sp 6211e190  lr 40126cc5  pc 5fc0a018  cpsr 600f0030
        d0  47495320214c4c49  d1  63206c6c6977206e
        d2  0000000000000000  d3  0000000000000000
        d4  312e323731000000  d5  000000312e302e36
        d6  312e323731000000  d7  000030352e312e36
        d8  0000000000000000  d9  0000000000000000
        d10 0000000000000000  d11 0000000000000000
        d12 0000000000000000  d13 0000000000000000
        d14 0000000000000000  d15 0000000000000000
        d16 63757274736e6f63  d17 69666e6f43726f74
        d18 4146605000000000  d19 0065004e005f0061
        d20 3f8948b0fcd6e9e0  d21 3fe555b0aaeac752
        d22 3fd24998d6307188  d23 3fcc7288e957b53b
        d24 3fc74721cad6b0ed  d25 3fc2f112df3e5244
        d26 40026bb1bbb55516  d27 4000000000000000
        d28 40008df2d49d41f1  d29 3fb0f4a31edab38b
        d30 3ff0000000000000  d31 3f4de16b9c24a98f
        scr 80000010
        #00  pc 0042d018  /data/app-lib/com.our.app/libnative-lib.so (StaticController::getFilesByPath(std::__ndk1::shared_ptr<oatpp::web::protocol::http::incoming::Request> const&)+231)
        #01  pc 0000dcc3  /system/lib/libc.so (free+10)
             6211e150  5fd3ede9  /data/app-lib/com.our.app/libnative-lib.so (_ZNSt6__ndk114__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEMN5oatpp3web6server13HttpProcessor4TaskEFvvESB_EEEEEPvSF_)
             6211e154  017fbb60  [heap]
             6211e158  5fd3ede9  /data/app-lib/com.our.app/libnative-lib.so (_ZNSt6__ndk114__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEMN5oatpp3web6server13HttpProcessor4TaskEFvvESB_EEEEEPvSF_)
             6211e15c  4012a2e7  /system/lib/libc.so (dlfree+50)
             6211e160  40163000  /system/lib/libc.so
             6211e164  017fbb60  [heap]
             6211e168  017fbb60  [heap]
             6211e16c  00000000  
             6211e170  5fd3ede9  /data/app-lib/com.our.app/libnative-lib.so (_ZNSt6__ndk114__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEMN5oatpp3web6server13HttpProcessor4TaskEFvvESB_EEEEEPvSF_)
             6211e174  40126cc5  /system/lib/libc.so (free+12)
             6211e178  00000000  
             6211e17c  600e5eb5  /data/app-lib/com.our.app/libc++_shared.so (__cxa_decrement_exception_refcount+50)
             6211e180  5fc09f07  /data/app-lib/com.our.app/libnative-lib.so (_ZN20StaticController30Z__PROXY_METHOD_getFilesByPathERKNSt6__ndk110shared_ptrIN5oatpp3web8protocol4http8incoming7RequestEEE)
             6211e184  5fd3ede9  /data/app-lib/com.our.app/libnative-lib.so (_ZNSt6__ndk114__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEMN5oatpp3web6server13HttpProcessor4TaskEFvvESB_EEEEEPvSF_)
             6211e188  6211e1e8  
             6211e18c  5fc0a017  /data/app-lib/com.our.app/libnative-lib.so (_ZN20StaticController14getFilesByPathERKNSt6__ndk110shared_ptrIN5oatpp3web8protocol4http8incoming7RequestEEE+230)
        #00  6211e190  6211e270  
             6211e194  5fd457fd  /data/app-lib/com.our.app/libnative-lib.so (_ZN5oatpp3web3url7mapping6RouterINSt6__ndk110shared_ptrINS0_6server18HttpRequestHandlerEEEE8getRouteERKNS_4data5share14StringKeyLabelE+276)
             6211e198  60108b58  /data/app-lib/com.our.app/libc++_shared.so
             6211e19c  60108b58  /data/app-lib/com.our.app/libc++_shared.so
             6211e1a0  016fcd0c  [heap]
             6211e1a4  60108b58  /data/app-lib/com.our.app/libc++_shared.so
             6211e1a8  5fdfd048  /data/app-lib/com.our.app/libnative-lib.so
             6211e1ac  017fbbe0  [heap]
             6211e1b0  017fbbe0  [heap]
             6211e1b4  01776bc8  [heap]
             6211e1b8  6211eb44  
             6211e1bc  017fbbe0  [heap]
             6211e1c0  007660b8  
             6211e1c4  00000001  
             6211e1c8  017fbb88  [heap]
             6211e1cc  01758ce4  [heap]
    memory near r4:
        5fc09ee4 e836f5e5 002861b2 001f330b 001f31d1  
        5fc09ef4 00285fd0 4601b082 98019001 b0029100  
        5fc09f04 b5804770 b086466f 468c4613 91054686  
        5fc09f14 99059204 92039a04 f8cd9a03 f8cdc008  
        5fc09f24 9300e004 ef72f5f9 bd80b006 466fb580  
        5fc09f34 4610b096 9113460b 21409212 4608900a  
        5fc09f44 f5e59309 4601eee4 f8072201 4b382c25  
        5fc09f54 f10d447b 90080e3c 91074670 f5ef4619  
        5fc09f64 e7ffedf6 44784833 aa0f6801 f5f89808  
        5fc09f74 e7ffea0a f8072000 482f0c25 68014478  
        5fc09f84 4478482e 98076802 eeccf5e5 900ee04f  
        5fc09f94 e005910d 910d900e f5efa80f e7ffedfc  
        5fc09fa4 0c25f817 d1042801 9807e7ff eec0f5e5  
        5fc09fb4 e7ffe7ff 2801980d e7ffd133 f5e5980e  
        5fc09fc4 900becd8 4478481e e078f8df f8de44fe  
        5fc09fd4 9006e000 99064670 ea6af5ec e7ff9005  
    memory near r6:
        5fd3edc8 b0824770 90014601 91009801 4770b002  
        5fd3edd8 4601b082 98019001 b0029100 00004770  
        5fd3ede8 466fb580 4601b0c0 447a4a7b 68126812  
        5fd3edf8 9012923f aa3d9812 903e9213 90159813  
        5fd3ee08 9014a83e 9a149815 9a169216 4611910e  
        5fd3ee18 ed14f4d2 ec9cf4b3 e7ff900d 9017a83d  
        5fd3ee28 90189817 f4d29818 6800ed10 e7ff900c  
        5fd3ee38 9019980c 911a9919 9125991a 91269925  
        5fd3ee48 910b9826 ec2af4b3 90246800 9027980b  
        5fd3ee58 f4b39827 2100ec24 99246001 f4b3980d  
        5fd3ee68 e7ffec7e 9028a83d 90299828 f4d29829  
        5fd3ee78 6800ecec e7ff900a 902a980a 912b992a  
        5fd3ee88 3104992b 992c912c 99309130 92329a2a  
        5fd3ee98 320c9a32 9a339233 9a319231 922d912e  
        5fd3eea8 912f992d 9a2e992f 68526813 0162eb01  
        5fd3eeb8 0f01f012 93089109 e7ffd006 68019809  
    memory near r7:
        6211e1c8 017fbb88 01758ce4 01758cd0 5ff01578  
        6211e1d8 6211eb44 01776bc8 5fc0a051 60108b58  
        6211e1e8 6211e208 5fc09f2d 6211eb44 6211eb0c  
        6211e1f8 01776bc8 6211eb44 6211eb44 01776bc8  
        6211e208 6211e308 5fc07d3f 6211e284 017f2c84  
        6211e218 017f2c84 5fc09f07 5fc09f07 5fc09f07  
        6211e228 01776bc8 6211e65c 017f2c84 6211e65c  
        6211e238 6211e284 6211e284 00000000 6211e648  
        6211e248 017f2c70 00000000 6211e648 017f2c84  
        6211e258 6211e284 017f2c84 6211e284 6211e284  
        6211e268 6211e28c 017f2c84 017f2c88 6211e288  
        6211e278 00000001 01776e5c 01776e5c 6211eb0c  
        6211e288 6211eb44 00000000 00000000 61f9734d  
        6211e298 6211e2b8 6211eb44 01776e5c 01776bd4  
        6211e2a8 01776bd4 017f2c84 6211e65c 017f2c84  
        6211e2b8 6211e2e8 5fd32e6d 6211e2f0 017f2c84  
    memory near r8:
        5fd3edc8 b0824770 90014601 91009801 4770b002  
        5fd3edd8 4601b082 98019001 b0029100 00004770  
        5fd3ede8 466fb580 4601b0c0 447a4a7b 68126812  
        5fd3edf8 9012923f aa3d9812 903e9213 90159813  
        5fd3ee08 9014a83e 9a149815 9a169216 4611910e  
        5fd3ee18 ed14f4d2 ec9cf4b3 e7ff900d 9017a83d  
        5fd3ee28 90189817 f4d29818 6800ed10 e7ff900c  
        5fd3ee38 9019980c 911a9919 9125991a 91269925  
        5fd3ee48 910b9826 ec2af4b3 90246800 9027980b  
        5fd3ee58 f4b39827 2100ec24 99246001 f4b3980d  
        5fd3ee68 e7ffec7e 9028a83d 90299828 f4d29829  
        5fd3ee78 6800ecec e7ff900a 902a980a 912b992a  
        5fd3ee88 3104992b 992c912c 99309130 92329a2a  
        5fd3ee98 320c9a32 9a339233 9a319231 922d912e  
        5fd3eea8 912f992d 9a2e992f 68526813 0162eb01  
        5fd3eeb8 0f01f012 93089109 e7ffd006 68019809  
    memory near r9:
        62020fe0 00000000 00000000 00000000 00000000  
        62020ff0 00000000 00000000 00000000 00000000  
        62021000 00000000 00000000 00000000 00000000  
        62021010 00000000 00000000 00000000 00000000  
        62021020 00000000 00000000 00000000 00000000  
        62021030 00000000 00000000 00000000 00000000  
        62021040 00000000 00000000 00000000 00000000  
        62021050 00000000 00000000 00000000 00000000  
        62021060 00000000 00000000 00000000 00000000  
        62021070 00000000 00000000 00000000 00000000  
        62021080 00000000 00000000 00000000 00000000  
        62021090 00000000 00000000 00000000 00000000  
        620210a0 00000000 00000000 00000000 00000000  
        620210b0 00000000 00000000 00000000 00000000  
        620210c0 00000000 00000000 00000000 00000000  
        620210d0 00000000 00000000 00000000 00000000  
    memory near sl:
        61b23850 00000000 00000000 00000000 00000000  
        61b23860 00000000 61f9734d 61b23880 5fd18d91  
        61b23870 61b23c64 0175f9b8 61b238f4 0175f9b8  
        61b23880 61b23908 5fd1ca5b 61b23c34 61b238d4  
        61b23890 61b23c34 61b23c34 61b23c34 5fd3d3bd  
        61b238a0 00000001 00000002 00000001 00000002  
        61b238b0 00000001 61b23c60 61b23c60 61b23c34  
        61b238c0 61b23c34 61b23c60 61b238fc 61b23c88  
        61b238d0 61b238f4 61b238f4 61b23c90 61f9734d  
        61b238e0 61b23dd0 01705060 5fc0a7e1 600c8d61  
        61b238f0 61b23908 017bb888 017bb878 00000000  
        61b23900 00000000 61f9734d 61b23978 5fd1d419  
        61b23910 61b23948 61b23c4c 61b23c68 00000001  
        61b23920 00000000 61b23948 61b23c4c 00000000  
        61b23930 61b23c30 61b23c60 61b23c60 61b23c4c  
        61b23940 61b23c4c 61b23c60 61b23c84 61b2396c  
    memory near fp:
        401652cc 00000000 00000000 00000000 00000000  
        401652dc 00000000 00000000 ffffffff 00000000  
        401652ec 00000000 00000001 ffffffff 0000000f  
        401652fc 00000000 00000000 00000000 00000000  
        4016530c 00000000 00000000 00000000 00000000  
        4016531c 00000000 00000000 4012bb45 4012bb41  
        4016532c 4012c4ad 4012c5e5 00000000 00000000  
        4016533c 00000000 00000000 415cf9f5 4012c679  
        4016534c 405528e1 00000000 00000000 00000000  
        4016535c 00000000 00000000 00000000 00000000  
        4016536c 00000000 00000000 00000000 00000000  
        4016537c 401a104d 401d04e9 600eb520 600d2b7d  
        4016538c 4038a015 600e70e9 600e6205 00000000  
        4016539c 00000000 00000000 00000000 00000000  
        401653ac 00000000 00000000 00000000 00000000  
        401653bc 00000000 00000000 00000000 00000000  
    memory near sp:
        6211e170 5fd3ede9 40126cc5 00000000 600e5eb5  
        6211e180 5fc09f07 5fd3ede9 6211e1e8 5fc0a017  
        6211e190 6211e270 5fd457fd 60108b58 60108b58  
        6211e1a0 016fcd0c 60108b58 5fdfd048 017fbbe0  
        6211e1b0 017fbbe0 01776bc8 6211eb44 017fbbe0  
        6211e1c0 007660b8 00000001 017fbb88 01758ce4  
        6211e1d0 01758cd0 5ff01578 6211eb44 01776bc8  
        6211e1e0 5fc0a051 60108b58 6211e208 5fc09f2d  
        6211e1f0 6211eb44 6211eb0c 01776bc8 6211eb44  
        6211e200 6211eb44 01776bc8 6211e308 5fc07d3f  
        6211e210 6211e284 017f2c84 017f2c84 5fc09f07  
        6211e220 5fc09f07 5fc09f07 01776bc8 6211e65c  
        6211e230 017f2c84 6211e65c 6211e284 6211e284  
        6211e240 00000000 6211e648 017f2c70 00000000  
        6211e250 6211e648 017f2c84 6211e284 017f2c84  
        6211e260 6211e284 6211e284 6211e28c 017f2c84  
    code around pc:
        5fc09ff8 e7ff9003 90159803 44794912 98159114  
        5fc0a008 47889914 e7ff9002 f5e5e7ff e7ffee66  
        5fc0a018 900edefe f5e5910d e7ffee60 980ee7ff  
        5fc0a028 e96ef5e5 f61a9101 bf00fb0c 001f30d1  
        5fc0a038 002865ba 00286da0 00286d9e 001f307a  
        5fc0a048 00286ef4 0000004b 466fb580 4601b092  
        5fc0a058 447a4a2b 68126812 90089211 68029808  
        5fc0a068 2c0cf852 920c4402 f807220a 9a0c2c19  
        5fc0a078 9007ab10 91064618 93054611 ee84f5e9  
        5fc0a088 900d9805 491f980d 68094479 edc8f5e9  
        5fc0a098 e7ff9004 0c19f817 910f9904 0c0df807  
        5fc0a0a8 6802980f f81769d2 47901c0d e0079003  
        5fc0a0b8 9109900a f5e9a810 980aedea e920f5e5  
        5fc0a0c8 f5e9a810 9803ede4 9807b2c1 eea2f5f9  
        5fc0a0d8 90029908 f5e94608 9908ee52 e028f8df  
        5fc0a0e8 f8de44fe f8dee000 9a11e000 90014596  
    code around lr:
        40126ca4 4b03b508 6819447b 4790680a bf00bd08  
        40126cb4 0003c354 4b03b508 6819447b 4790684a  
        40126cc4 bf00bd08 0003c340 4b03b508 681a447b  
        40126cd4 47986893 bf00bd08 0003c32c 4b03b508  
        40126ce4 681a447b 479868d3 bf00bd08 0003c318  
        40126cf4 4b03b508 681a447b 47986913 bf00bd08  
        40126d04 0003c304 4b03b508 6819447b 4790694a  
        40126d14 bf00bd08 0003c2f0 49094808 4478b508  
        40126d24 f0014479 b140e982 20064906 44794a06  
        40126d34 e8bd447a f0044008 bd08be1f 0003e81a  
        40126d44 00000295 00031de4 00031df4 49094808  
        40126d54 4478b508 f0014479 b140e968 20064906  
        40126d64 44794a06 e8bd447a f0044008 bd08be05  
        40126d74 0004001a fffffd91 00031db0 00031ded  
        40126d84 41f0e92d 4d164696 4a16b0a4 447d4680  
        40126d94 460fac03 58ae2180 68304a13 9300447a  
    memory map around fault addr 5fc0a018:
        5f7dc000-5f7dd000 rw- /data/app-lib/com.our.app/libfplutil.so
        5f7dd000-5fe82000 r-x /data/app-lib/com.our.app/libnative-lib.so
        5fe82000-5fe83000 --- 

    I would appreciate any help on solving this as it would otherwise cause issues as soon as any client passes a request with any non-valid field value, as this is the same mechanism that the base ApiController class uses for error handling of incoming requests (AFAIK).

    Thanks, Thomas!

    opened by tbowley 2
  • 1.3.0(Nov 19, 2021)

  • 1.2.5(Feb 16, 2021)

  • 1.2.0(Oct 27, 2020)

  • 1.1.0(May 25, 2020)

  • 1.0.0(Jan 28, 2020)

    • Configurable object mapping - now user can create own types and add support for these types in ApiController, ApiClient, json::mapping::ObjectMapper.
    • Predefined mapping-enabled unsigned integer types are added.
    • Full support for automatic content compression/decompression based on Accept-Encoding / Content-Encoding headers.
    Source code(tar.gz)
    Source code(zip)
  • 0.19.12(Jan 12, 2020)

    Refactoring and Stabilization Release.

    Features and Bug-Fixes

    • Introduce oatpp::data::buffer::Processor and oatpp::data::buffer::ProcessingPipeline for stream chunk-by-chunk processing.
    • Fix server stop() when using oatpp::network::server:: SimpleTCPConnectionProvider. Now server can be properly stopped without additional workarounds.
    • Fix tests inconsistency.
    • Fix a bunch of IO bugs (mostly for Windows).

    Architecture Changes

    • Move IODefinitions.hpp to the root. Move v_io_size, v_io_handle and IOError to the oatpp namespace.
    • Upgrade streams interfaces (to provide nesting and pipelining of any complexity):
      • InputStream now extends ReadCallback
      • OutputStream now extends WriteCallback
      • read/write methods now extended with additional parameter async::Action&.
      • suggestInputStreamAsyncAction / suggestOutputStreamAsyncAction removed.

    Changes Exposed to End-User

    • Rename oatpp::data::v_io_size to oatpp::v_io_size.
    • Rename oatpp::data::v_io_handle to oatpp::v_io_handle.
    • Rename oatpp::data::IOError to oatpp::IOError.
    • Use writeSimple instead of write for ConsistentOutputStreams - ChunkedBuffer and BufferOutputStream.
    • Server stop(). Now additional call to client::ConnectionProvider::getConnection() method is not needed in order to unblock accept and stop the server.
    Source code(tar.gz)
    Source code(zip)
  • 0.19.11(Dec 18, 2019)


    • ApiClient. Introduce retries and RetryPolicy.
    • oatpp::network::virtual_::Interface. Introduce ListenerLock to acquire an interface for listening (analog to bind on a port).
    • oatpp::parser::json::mapping::Serializer. Remove extra space char.
    • oatpp::parser::json::mapping::Serializer. Introduce Beautifier and Beautifier config.
    • Introduce v_buff_size for buffer sizes, as an integer capable of storing a pointer.
    • Introduce oatpp::data::stream::Context to store aditional data about the stream.
    • oatpp::network::server::SimpleTCPConnectionProvider. Add feature to obtain peer IP and port available through the connection stream context.


    • Better portability.
    • Windows compatibility.
    • Support TLS over custom transport.
    • Require LibreSSL minimum version 3.0.0.


    • Fix acceptor-thread blocking by handshake. TLS Handshake is moved to the stream context initialization.
    Source code(tar.gz)
    Source code(zip)
  • 0.19.10(Nov 3, 2019)

    • ApiController. Add router prefix.
    • Introduce LazyStringMap to store headers and query parameters.
    • Introduce ConnectionPool.
    • Refactor. Rename ADDCORS --> ADD_CORS macro.
    • Optimization. Use BufferOutputStream in RequestHeadersReader.
    • Fix thread sanitizer warnings.
    • Fix some compiler warnings.
    Source code(tar.gz)
    Source code(zip)
  • 0.19.9(Oct 7, 2019)

    • ApiController. Introduced AUTHORIZATION macro.
    • ApiController. Introduced ADDCORS macro.
    • ApiController. Introduced ENDPOINT_INTERCEPTOR macro.
    • Better error handling for simple and async APIs.
    • Support HTTP-pipelining on server-side.
    • Performance optimization. Remove double-buffering while sending the response.
    • Minor bug-fixes.
    Source code(tar.gz)
    Source code(zip)
  • 0.19.8(Aug 20, 2019)

  • 0.19.7(Aug 8, 2019)

    • Better stream processing API.
    • Introduced stream read/write callbacks.
    • Introduced BufferInputStream, FileStream
    • Feature - Multipart support - server/client, simple/async APIs.
    • Revived IOWorker for Async APIs compatibility with future Windows build.
    Source code(tar.gz)
    Source code(zip)
  • 0.19.6(Jun 25, 2019)

    • Additional parameters in server::ConnectionHandler::handleConnection method. - For parameterized connection upgrades.
    • Introduced oatpp::async::Lock - for Coroutine/Thread synchronization
    • Introduced -DOATPP_COMPAT_BUILD_NO_THREAD_LOCAL build flag. - For compatibility with compilers which do not support thread_local feature. See https://github.com/oatpp/oatpp/issues/81.
    • Introduced oatpp default Logger.
    • Fixed memory leak in kqueue based implementation of async IOEventWorker.
    Source code(tar.gz)
    Source code(zip)
  • 0.19.4(May 5, 2019)

    • New oatpp::async::Executor with scheduling and event based IO.
    • First 2-Million concurrent WebSocket connections benchmark https://oatpp.io/benchmark/websocket/2-million/
    • Extended oatpp::data::stream::InputStream and oatpp::data::stream::OutputStream interfaces.
    • Introduced oatpp::data::stream::ConsistentOutputStream interface.
    • oatpp::concurrency::SpinLock now meets C++ Lockable requirements.
    Source code(tar.gz)
    Source code(zip)
  • 0.19.1-2(Feb 12, 2019)

  • 0.19.1(Jan 30, 2019)

  • v0.18.12-alpha(Dec 16, 2018)

  • v0.18.9-alpha(Oct 30, 2018)

🌱Light and powerful C++ web framework for highly scalable and resource-efficient web applications development. It's zero-dependency and easy-portable.
Drogon: A C++14/17 based HTTP web application framework running on Linux/macOS/Unix/Windows

English | 简体中文 | 繁體中文 Overview Drogon is a C++14/17-based HTTP application framework. Drogon can be used to easily build various types of web applicat

An Tao 6.5k Dec 6, 2021
Your high performance web application C framework

facil.io is a C micro-framework for web applications. facil.io includes: A fast HTTP/1.1 and Websocket static file + application server. Support for c

Bo 1.5k Dec 2, 2021
Crow is very fast and easy to use C++ micro web framework (inspired by Python Flask)

Crow is C++ microframework for web. (inspired by Python Flask) #include "crow.h" int main() { crow::SimpleApp app; CROW_ROUTE(app, "/")([]()

Jaeseung Ha 6.6k Dec 5, 2021
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.

Cutelyst - The Qt Web Framework A Web Framework built on top of Qt, using the simple and elegant approach of Catalyst (Perl) framework. Qt's meta obje

Cutelyst 721 Dec 7, 2021
Experimental, scalable, high performance HTTP server

Lwan Web Server Lwan is a high-performance & scalable web server. The project web site contains more details. Build status OS Arch Release Debug Stati

Leandro A. F. Pereira 5.5k Dec 2, 2021
C++ application development framework, to help developers create and deploy applications quickly and simply

ULib - C++ library Travis CI: Coverity Scan: ULib is a highly optimized class framework for writing C++ applications. I wrote this framework as my too

stefano casazza 936 Nov 26, 2021
The application framework for developer module of EdgeGallery platform

crane-framework crane-framework将可复用的计算和软件功能抽象成插件,APP开发者面向使用插件进行MEC APP开发。这样屏蔽了和MEC平台交互的细节,实现MCE APP和MEC平台的松耦合。而且插件框架基础能力可裁剪,按需提供最小的APP系统。 特性介绍 为了方便开发者

EdgeGallery 21 Aug 30, 2021
This is a proof-of-concept of a modern C web-framework that compiles to WASM and is used for building user interfaces.

DanCing Web ?? ?? (DCW) Getting Started Dancing Web is now distributed with the Tarantella Package Manager — a tool I've made to simplify setup of pro

Danilo Chiarlone 3 Sep 11, 2021
QDjango, a Qt-based C++ web framework

QDjango - a Qt-based C++ web framework Copyright (c) 2010-2015 Jeremy Lainé About QDjango is a web framework written in C++ and built on top of the Qt

Jeremy Lainé 231 Nov 26, 2021
C library to create simple HTTP servers and Web Applications.

Onion http server library Travis status Coverity status Onion is a C library to create simple HTTP servers and Web Applications. master the developmen

David Moreno Montero 1.8k Dec 2, 2021
cserv is an event-driven and non-blocking web server

cserv is an event-driven and non-blocking web server. It ideally has one worker process per cpu or processor core, and each one is capable of handling thousands of incoming network connections per worker. There is no need to create new threads or processes for each connection.

null 35 Sep 10, 2021
Embedded C/C++ web server

CivetWeb The official home of CivetWeb is https://github.com/civetweb/civetweb Continuous integration for Linux and macOS (Travis CI): Continuous inte

null 1.9k Nov 30, 2021
A C++11 RESTful web server library

Served Overview Served is a C++ library for building high performance RESTful web servers. Served builds upon Boost.ASIO to provide a simple API for d

Meltwater 675 Nov 23, 2021
Corvusoft's Restbed framework brings asynchronous RESTful functionality to C++14 applications.

Restbed Restbed is a comprehensive and consistent programming model for building applications that require seamless and secure communication over HTTP

Corvusoft 1.6k Nov 29, 2021
A http/websocket server framework on linux.

The framework is a Web-Server on unix based system. Without using any third-party libraries, the framework writes from unix system calls and standard C library functions.

xingyuuchen 12 Dec 7, 2021
The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design. This project aims to help C++ developers connect to and interact with services.

Welcome! The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design

Microsoft 6.6k Dec 4, 2021
C++ Parallel Computing and Asynchronous Networking Engine

中文版入口 Sogou C++ Workflow As Sogou`s C++ server engine, Sogou C++ Workflow supports almost all back-end C++ online services of Sogou, including all sea

Sogou-inc 6.4k Nov 30, 2021
a very based, minimal, and flexible static site generator written in pure C89 with no external deps.

based-ssg is a very based, minimal, and flexible static site generator written in pure C89 with no external deps.

null 11 Oct 10, 2021