Skip to content
Snippets Groups Projects
Select Git revision
  • 30dc184def6f7918a0377a10119cf7294d9b2cc6
  • master default protected
  • develop protected
  • feature/use-nest3-dockerfile
  • configurable_address
  • 0.2.0
  • 0.1.0
7 results

http_server.cpp

Blame
  • 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>());
        }