--- /dev/null
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#include"pistacheserver.h"
+namespace xapp
+{
+
+ pistacheserver::pistacheserver(Pistache::Address addr,std::vector<std::string> method,std::vector<bool> static_routing,std::vector<bool> dynamic_routing)
+ : httpEndpoint(std::make_shared<Pistache::Http::Endpoint>(addr))
+ {
+ this->t=new std::thread*[1];
+ this->method=method;
+ this->static_routing=static_routing;
+ this->dynamic_routing=dynamic_routing;
+ assert(static_routing.size()==method.size() && dynamic_routing.size()==method.size());
+ stat_sz=cal_stat_size();
+ dyn_sz=cal_dyn_size();
+ }
+ int pistacheserver::cal_stat_size()//caclualting no of true in static_routing
+ {
+ int size=0;
+ for(int i=0;i<static_routing.size();i++)
+ {
+ if (static_routing[i])
+ size++;
+ }
+ return size;
+ }
+
+ int pistacheserver::cal_dyn_size() //calaculating no true in dynamic_routing
+ {
+ int size=0;
+ for(int i=0;i<dynamic_routing.size();i++)
+ {
+ if (dynamic_routing[i])
+ size++;
+ }
+ return size;
+ }
+
+ void pistacheserver::setup_base_url(std::string base)
+ {
+ this->base=base;
+ }
+ void pistacheserver::setup_static_route(std::unordered_map<int,std::string> route)//routing path
+ {
+ this->route_static=route;
+ }
+ void pistacheserver::setup_dynamic_route(std::unordered_map<int,std::string> route)//routing path
+ {
+ this->route_dynamic=route;
+ }
+void pistacheserver::add_static_cb(std::unordered_map<int,usr_callback> cb)
+{
+ this->cb_static=cb;
+}
+void pistacheserver::add_dynamic_cb(std::unordered_map<int,usr_callback> cb)
+{
+ this->cb_dynamic=cb;
+}
+
+ void pistacheserver::init(size_t thr = 2)
+ {
+ auto opts = Pistache::Http::Endpoint::options().threads(thr).flags(Pistache::Tcp::Options::ReuseAddr)/*.flags(Pistache::Tcp::Options::ReusePort)*/; // how many threads for the server
+ httpEndpoint->init(opts);
+ assert(route_static.size()==stat_sz && route_dynamic.size()==dyn_sz); //no of true in satatic_routing and dynamic_routig should match with size of route_static and route_dynamic respectively.
+
+ assert(cb_static.size()==stat_sz && cb_dynamic.size()==dyn_sz); //no of true in satatic_routing and dynamic_routig should match with size of cb_static and cb_dynamic respectively.
+ for (int i=0;i<method.size();i++)
+ {
+ if (method[i]=="get")
+ {
+ setupRoutes_get(i+1);
+ }
+ else if (method[i]=="post" )
+ {
+ setupRoutes_post(i+1);
+ }
+
+ else if (method[i]=="del")
+ {
+ setupRoutes_del(i+1);
+ }
+
+ else
+ {
+ std::cout<<"Wrong Method called \n";
+ }
+ }
+
+
+ }
+
+
+ void pistacheserver::start()
+ {
+ httpEndpoint->setHandler(router.handler());
+ t[0]=new std::thread(&pistacheserver::thread_start,this);
+ t[0]->detach();
+ }
+ void pistacheserver::thread_start()
+ {
+ this->httpEndpoint->serve();
+
+ }
+
+ void pistacheserver::shutdown()
+ {
+ httpEndpoint->shutdown();
+ }
+
+ void pistacheserver::setupRoutes_get(int index)
+ {
+ using namespace Pistache::Rest;
+ auto search_s=route_static.find(index);
+ auto search_d=route_dynamic.find(index);
+ auto cbs_search=cb_static.find(index);
+ auto cbd_search=cb_dynamic.find(index);
+ assert (search_s!=route_static.end() || search_d!=route_dynamic.end());
+ if (static_routing[index-1])
+ {
+ std::cout<<"static routing get"<<std::endl;
+ assert (search_s!=route_static.end() && cbs_search!=cb_static.end());
+ Routes::Get(router, base + search_s->second, Routes::bind(cbs_search->second));
+ }
+ if (dynamic_routing[index-1])
+ {
+ std::cout<<"dynamic routing get"<<std::endl;
+ assert (search_d!=route_dynamic.end() && cbd_search!=cb_dynamic.end());
+ Routes::Get(router, base + search_d->second+ dynamic_id, Routes::bind(cbd_search->second));
+ }
+
+ // Default handler, called when a route is not found
+ router.addCustomHandler(Routes::bind(&pistacheserver::default_handler, this));
+ }
+ void pistacheserver::setupRoutes_post(int index)
+ {
+ using namespace Pistache::Rest;
+ auto search_s=route_static.find(index);
+ auto search_d=route_dynamic.find(index);
+ auto cbs_search=cb_static.find(index);
+ auto cbd_search=cb_dynamic.find(index);
+ assert (search_s!=route_static.end() || search_d!=route_dynamic.end());
+ if (static_routing[index-1])
+ {
+ std::cout<<"static routing post"<<std::endl;
+ assert (search_s!=route_static.end() && cbs_search!=cb_static.end());
+ Routes::Post(router, base + search_s->second, Routes::bind(cbs_search->second));
+ }
+ if (dynamic_routing[index-1])
+ {
+ std::cout<<"dynamic routing post"<<std::endl;
+ assert (search_d!=route_dynamic.end() && cbd_search!=cb_dynamic.end());
+ Routes::Post(router, base + search_d->second+ dynamic_id, Routes::bind(cbd_search->second));
+ }
+ // Default handler, called when a route is not found
+ router.addCustomHandler(Routes::bind(&pistacheserver::default_handler, this));
+ }
+ void pistacheserver::setupRoutes_del(int index)
+ {
+ using namespace Pistache::Rest;
+ auto search_s=route_static.find(index);
+ auto search_d=route_dynamic.find(index);
+ auto cbs_search=cb_static.find(index);
+ auto cbd_search=cb_dynamic.find(index);
+ assert (search_s!=route_static.end() || search_d!=route_dynamic.end());
+ if (static_routing[index-1])
+ {
+ std::cout<<"static routing delete"<<std::endl;
+ assert (search_s!=route_static.end() && cbs_search!=cb_static.end());
+ Routes::Delete(router, base + search_s->second, Routes::bind(cbs_search->second));
+ }
+ if (dynamic_routing[index-1])
+ {
+ std::cout<<"dynamic routing delete"<<std::endl;
+ assert (search_d!=route_dynamic.end() && cbd_search!=cb_dynamic.end());
+ Routes::Delete(router, base + search_d->second+ dynamic_id, Routes::bind(cbd_search->second));
+ }
+ // Default handler, called when a route is not found
+ router.addCustomHandler(Routes::bind(&pistacheserver::default_handler, this));
+ }
+
+}
+
+
+