Select Git revision
http_server.cpp
http_server.cpp 8.00 KiB
#include "http_server.hpp"
#include <algorithm>
#include <iostream>
#include <regex>
#include <unordered_set>
#include "data_storage.hpp"
namespace insite {
HttpServer::HttpServer(web::http::uri address, DataStorage* storage,
std::string database_uri)
: http_listener_{address},
storage_(storage),
database_uri_(database_uri) {
http_listener_.support([this](web::http::http_request request) {
if (request.method() == "GET" &&
request.relative_uri().path() == "/spikes") {
request.reply(GetSpikes(request));
} else if (request.method() == "GET" &&
request.relative_uri().path() == "/multimeter_measurement") {
request.reply(GetMultimeterMeasurement(request));
} else if (request.method() == "GET" &&
request.relative_uri().path() == "/current_simulation_time") {
request.reply(GetCurrentSimulationTime(request));
} else {
std::cerr << "Invalid request: " << request.to_string() << "\n";
request.reply(web::http::status_codes::NotFound);
}
});
http_listener_.open().wait();
std::cout << "HTTP server is listening...\n";
}
web::http::http_response HttpServer::GetCurrentSimulationTime(
const web::http::http_request& request) {
web::http::http_response response(web::http::status_codes::OK);
web::json::value simulation_time = storage_->GetCurrentSimulationTime();
response.set_body(simulation_time);
return response;
}
web::http::http_response HttpServer::GetSpikes(
const web::http::http_request& request) {
const auto parameters = web::uri::split_query(request.request_uri().query());
web::http::http_response response(web::http::status_codes::OK);
auto spikes = storage_->GetSpikes();
const auto from = parameters.find("from");
const auto to = parameters.find("to");
const auto population = parameters.find("population");
std::unordered_set<uint64_t> population_node_ids;
if (population != parameters.end()) {
pqxx::connection connection(database_uri_);
pqxx::work txn(connection);
const auto population_node_ids_result = txn.exec(
"SELECT id FROM nest_neuron WHERE nest_neuron.population_id = " +
population->second);
txn.commit();
population_node_ids.reserve(population_node_ids_result.size());
for (const auto& node_id : population_node_ids_result) {
population_node_ids.insert(node_id[0].as<uint64_t>());
}