blob: 12c8728fcf9f6814dc8fb63eea7f33160d9e005c [file] [log] [blame]
/*
# ==================================================================================
# 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"RestClient.h"
namespace xapp
{
void cpprestclient::SetbaseUrl(std::string url)
{
this->baseUrl = utility::conversions::to_string_t(url);
this->Baseurl = url;
}
cpprestclient::cpprestclient(std::string base_url) {
this->baseUrl = utility::conversions::to_string_t(base_url);
this->Baseurl = base_url;
}
cpprestclient::cpprestclient(std::string base_url, std::function<void(web::http::http_request)>callback):listener{ utility::conversions::to_string_t(resp_url) }
{
this->baseUrl= utility::conversions::to_string_t(base_url);
this->Baseurl = base_url;
try
{
listener.support(web::http::methods::POST, [callback](web::http::http_request request) { callback(request); });
ok_2_run = true;
/*
ok_2_run = true;
t = new std::thread*[1];
t[0] = new std::thread(&cpprestclient::response_listener, this);
t[0]->detach();
*/
response_listener();
}
catch (std::exception const & e)
{
std::wcout << e.what() << std::endl;
}
}
cpprestclient::cpprestclient(std::string base_url,std::string response_url, std::function<void(web::http::http_request)>callback):listener{ utility::conversions::to_string_t(response_url) }{
this->baseUrl= utility::conversions::to_string_t(base_url);
this->Baseurl = base_url;
try
{
listener.support(web::http::methods::POST, [callback](web::http::http_request request) { callback(request); });
/*
ok_2_run = true;
t = new std::thread*[1];
t[0] = new std::thread(&cpprestclient::response_listener, this);
t[0]->detach();
*/
response_listener();
}
catch (std::exception const & e)
{
std::wcout << e.what() << std::endl;
}
}
/*
void cpprestclient::start_response_listener() {
try {
t[0] = new std::thread(&cpprestclient::response_listener, this);
t[0]->detach();
}
catch (std::exception const & e)
{
std::wcout << e.what() << std::endl;
}
}
*/
std::string cpprestclient::getBaseUrl()
{
return Baseurl;
}
void cpprestclient::response_listener() {
try
{
this->listener.open().wait();
//std::cout<<"kumar "<<"\n";
//std::this_thread::sleep_for(std::chrono::seconds(20));
/*
while (ok_2_run) {
//std::cout<<"sandeeep ";
}
*/
}
catch (std::exception const & e)
{
std::wcout << e.what() << std::endl;
}
}
void cpprestclient::stop_response_listener() {
try
{
ok_2_run = false;
listener.close();
//delete[] t;
std::cout << "\nclosed1\n";
}
catch (std::exception const & e)
{
std::wcout << e.what() << std::endl;
}
}
oresponse_t cpprestclient::post_subscriptions(const nlohmann::json & json, std::string path) {
oresponse_t res;
res.status_code = 0;
res.SubscriptionId = "";
auto postJson = pplx::create_task([&]() {
utility::stringstream_t s;
s << json.dump().c_str();
web::json::value sdk_json = web::json::value::parse(s);
web::uri_builder uri(this->baseUrl + utility::conversions::to_string_t(path));
auto addr = uri.to_uri().to_string();
web::http::client::http_client client(addr);
return client.request(web::http::methods::POST, U("/"), sdk_json.serialize(), U("application/json"));
})
.then([&](web::http::http_response response) {
res.status_code = response.status_code();
if (response.status_code() != 201) {
throw std::runtime_error("Returned " + std::to_string(response.status_code()));
}
ucout << response.to_string() << "\n";
response.headers().set_content_type(U("application/json"));
return response.extract_json();
})
.then([&](web::json::value jsonObject) {
res.SubscriptionId = utility::conversions::to_utf8string(jsonObject[U("SubscriptionId")].as_string());
//validating subscription response against its schema
std::string s = utility::conversions::to_utf8string(jsonObject.serialize());
nlohmann::json j= nlohmann::json::parse(s);
xapp::model::SubscriptionResponse SResp;
xapp::model::from_json(j, SResp);
//sanity check
nlohmann::json ans;
xapp::model::to_json(ans, SResp);
std::cout << ans.dump(4) << "\n";
});
try {
postJson.wait();
}
catch (const std::exception& e) {
printf("Error exception:%s\n", e.what());
}
return res;
}
int cpprestclient::delete_subscriptions(std::string Id, std::string path)
{
int status_code=0;
auto delJson = pplx::create_task([&]() {
web::uri_builder uri(this->baseUrl + utility::conversions::to_string_t(path));
auto addr = uri.to_uri().to_string();
web::http::client::http_client client(addr);
addr.append(utility::conversions::to_string_t(Id));
//ucout << utility::string_t(U("making requests at: ")) << addr << std::endl;
return client.request(web::http::methods::DEL);
})
.then([&](web::http::http_response response) {
status_code = response.status_code();
if (response.status_code() != 204) {
throw std::runtime_error("Returned " + std::to_string(response.status_code()));
}
});
try {
delJson.wait();
}
catch (const std::exception& e) {
printf("Error exception:%s\n", e.what());
}
return status_code;
}
response_t cpprestclient::get_config(std::string path)
{
response_t res;
res.status_code = 0;
res.body = utility::conversions::to_string_t("");
auto postJson = pplx::create_task([&]() {
web::http::client::http_client client(this->baseUrl);
return client.request(web::http::methods::GET, web::uri_builder(U("/")).append_path(utility::conversions::to_string_t(path)).to_string());
})
.then([&](web::http::http_response response) {
res.status_code = response.status_code();
if (response.status_code() != 200) {
throw std::runtime_error("Returned " + std::to_string(response.status_code()));
}
ucout << response.to_string() << "\n";
response.headers().set_content_type(U("application/json"));
return response.extract_json();
})
.then([&](web::json::value jsonObject) {
//validating configlist against its schema
std::string s = utility::conversions::to_utf8string(jsonObject.serialize());
res.body = nlohmann::json::parse(s);
std::vector<xapp::model::XAppConfig> cfg;
xapp::model::from_json(res.body, cfg);
//sanity check
nlohmann::json ans;
xapp::model::to_json(ans, cfg);
std::cout << ans.dump(4) << "\n";
});
try {
postJson.wait();
}
catch (const std::exception& e) {
printf("Error exception:%s\n", e.what());
}
return res;
}
response_t cpprestclient::get_subscriptions(std::string path)
{
response_t res;
res.status_code = 0;
res.body = utility::conversions::to_string_t("");
auto postJson = pplx::create_task([&]() {
web::http::client::http_client client(this->baseUrl);
return client.request(web::http::methods::GET, web::uri_builder(U("/")).append_path(utility::conversions::to_string_t(path)).to_string());
})
.then([&](web::http::http_response response) {
res.status_code = response.status_code();
if (response.status_code() != 200) {
throw std::runtime_error("Returned " + std::to_string(response.status_code()));
}
ucout << response.to_string() << "\n";
response.headers().set_content_type(U("application/json"));
return response.extract_json();
})
.then([&](web::json::value jsonObject) {
//validating subscription list against its schema
std::string s = utility::conversions::to_utf8string(jsonObject.serialize());
res.body = nlohmann::json::parse(s);
std::vector<xapp::model::SubscriptionData> subList;
xapp::model::from_json(res.body, subList);
//sanity check
nlohmann::json ans;
xapp::model::to_json(ans, subList);
std::cout << ans.dump(4) << "\n";
});
try {
postJson.wait();
}
catch (const std::exception& e) {
printf("Error exception:%s\n", e.what());
}
return res;
}
response_t cpprestclient::do_post(const nlohmann::json & json, std::string path)
{
response_t res;
res.status_code = 0;
res.body = utility::conversions::to_string_t("");
auto postJson = pplx::create_task([&]() {
//conversion from nlhomann json to cpprestsdk json
utility::stringstream_t s;
s << json.dump().c_str();
web::json::value sdk_json = web::json::value::parse(s);
web::uri_builder uri(this->baseUrl + utility::conversions::to_string_t(path));
auto addr = uri.to_uri().to_string();
web::http::client::http_client client(addr);
return client.request(web::http::methods::POST, U("/"), sdk_json.serialize(), U("application/json"));
})
.then([&](web::http::http_response response) {
res.status_code = response.status_code();
if (response.status_code() != 201) {
throw std::runtime_error("Returned " + std::to_string(response.status_code()));
}
ucout << response.to_string() << "\n";
response.headers().set_content_type(U("application/json"));
return response.extract_json();
})
.then([&](web::json::value jsonObject) {
//std::cout << "\nRecieved REST subscription response\n";
//std::wcout << jsonObject.serialize().c_str() << "\n";
//resp.body = jsonObject.serialize();
//conversion from cpprestsdk json to nlhomann json
std::string s = utility::conversions::to_utf8string(jsonObject.serialize());
res.body = nlohmann::json::parse(s);
});
try {
postJson.wait();
}
catch (const std::exception& e) {
printf("Error exception:%s\n", e.what());
}
return res;
}
response_t cpprestclient::do_del(std::string Id, std::string path)
{
response_t res;
res.status_code = 0;
res.body = utility::conversions::to_string_t("");
auto delJson = pplx::create_task([&]() {
web::uri_builder uri(this->baseUrl + utility::conversions::to_string_t(path));
auto addr = uri.to_uri().to_string();
web::http::client::http_client client(addr);
addr.append(utility::conversions::to_string_t(Id));
//ucout << utility::string_t(U("making requests at: ")) << addr << std::endl;
return client.request(web::http::methods::DEL);
})
.then([&](web::http::http_response response) {
res.status_code = response.status_code();
if (response.status_code() != 204) {
throw std::runtime_error("Returned " + std::to_string(response.status_code()));
}
ucout << response.to_string() << "\n";
response.headers().set_content_type(U("application/json"));
return response.extract_json();
//std::wcout << "Deleted: " << std::boolalpha << (response.status_code() == 204) << std::endl;
})
.then([&](web::json::value jsonObject) {
//resp.body = jsonObject.serialize();
std::string s = utility::conversions::to_utf8string(jsonObject.serialize());
res.body = nlohmann::json::parse(s);
});
try {
delJson.wait();
}
catch (const std::exception& e) {
printf("Error exception:%s\n", e.what());
}
return res;
}
response_t cpprestclient::do_get(std::string path)
{
response_t res;
res.status_code = 0;
res.body = utility::conversions::to_string_t("");
auto postJson = pplx::create_task([&]() {
web::http::client::http_client client(this->baseUrl);
return client.request(web::http::methods::GET, web::uri_builder(U("/")).append_path(utility::conversions::to_string_t(path)).to_string());
})
.then([&](web::http::http_response response) {
res.status_code = response.status_code();
if (response.status_code() != 200) {
throw std::runtime_error("Returned " + std::to_string(response.status_code()));
}
ucout << response.to_string() << "\n";
response.headers().set_content_type(U("application/json"));
return response.extract_json();
})
.then([&](web::json::value jsonObject) {
//resp.body = jsonObject.serialize();
std::string s = utility::conversions::to_utf8string(jsonObject.serialize());
res.body = nlohmann::json::parse(s);
});
try {
postJson.wait();
}
catch (const std::exception& e) {
printf("Error exception:%s\n", e.what());
}
return res;
}
}