// // ARF - Augmented Reality Framework (ETSI ISG ARF) // // Copyright 2022 ETSI // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // Last change: June 2022 // #include "pistache/endpoint.h" #include "pistache/http.h" #include "pistache/router.h" #ifdef __linux__ #include #include #include #endif #include #include #define PISTACHE_SERVER_THREADS 2 #define PISTACHE_SERVER_MAX_REQUEST_SIZE 32768 #define PISTACHE_SERVER_MAX_RESPONSE_SIZE 32768 static Pistache::Http::Endpoint *httpEndpoint; #ifdef __linux__ static void sigHandler [[noreturn]] (int sig){ switch(sig){ case SIGINT: case SIGQUIT: case SIGTERM: case SIGHUP: default: httpEndpoint->shutdown(); break; } exit(0); } static void setUpUnixSignals(std::vector quitSignals) { sigset_t blocking_mask; sigemptyset(&blocking_mask); for (auto sig : quitSignals) sigaddset(&blocking_mask, sig); struct sigaction sa; sa.sa_handler = sigHandler; sa.sa_mask = blocking_mask; sa.sa_flags = 0; for (auto sig : quitSignals) sigaction(sig, &sa, nullptr); } #endif using namespace org::openapitools::server::api; using namespace etsi; int main() { #ifdef __linux__ std::vector sigs{SIGQUIT, SIGINT, SIGTERM, SIGHUP}; setUpUnixSignals(sigs); #endif Pistache::Address addr(Pistache::Ipv4::any(), Pistache::Port(8080)); httpEndpoint = new Pistache::Http::Endpoint((addr)); auto router = std::make_shared(); auto opts = Pistache::Http::Endpoint::options() .threads(PISTACHE_SERVER_THREADS); opts.flags(Pistache::Tcp::Options::ReuseAddr); opts.maxRequestSize(PISTACHE_SERVER_MAX_REQUEST_SIZE); opts.maxResponseSize(PISTACHE_SERVER_MAX_RESPONSE_SIZE); httpEndpoint->init(opts); DefaultApiEtsi DefaultApiserver(router); DefaultApiserver.init(); TrackableApiEtsi TrackablesApiserver(router); TrackablesApiserver.init(); httpEndpoint->setHandler(router->handler()); httpEndpoint->serve(); httpEndpoint->shutdown(); }