change library interface to expose json container as structure to exchange data

This commit is contained in:
Dennis Luxen 2014-11-25 09:14:01 +01:00
parent b50a907ca3
commit 4a6325696e
14 changed files with 69 additions and 80 deletions

View File

@ -35,9 +35,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
class OSRM_impl; class OSRM_impl;
struct RouteParameters; struct RouteParameters;
namespace http namespace JSON
{ {
class Reply; struct Object;
} }
class OSRM class OSRM
@ -48,7 +48,7 @@ class OSRM
public: public:
explicit OSRM(ServerPaths paths, const bool use_shared_memory = false); explicit OSRM(ServerPaths paths, const bool use_shared_memory = false);
~OSRM(); ~OSRM();
void RunQuery(RouteParameters &route_parameters, http::Reply &reply); int RunQuery(RouteParameters &route_parameters, JSON::Object &json_result);
}; };
#endif // OSRM_H #endif // OSRM_H

View File

@ -44,8 +44,6 @@ namespace boost { namespace interprocess { class named_mutex; } }
#include "../Server/DataStructures/InternalDataFacade.h" #include "../Server/DataStructures/InternalDataFacade.h"
#include "../Server/DataStructures/SharedBarriers.h" #include "../Server/DataStructures/SharedBarriers.h"
#include "../Server/DataStructures/SharedDataFacade.h" #include "../Server/DataStructures/SharedDataFacade.h"
//TODO: remove
#include "../Server/Http/Reply.h"
#include "../Util/make_unique.hpp" #include "../Util/make_unique.hpp"
#include "../Util/ProgramOptions.h" #include "../Util/ProgramOptions.h"
#include "../Util/simple_logger.hpp" #include "../Util/simple_logger.hpp"
@ -104,13 +102,12 @@ void OSRM_impl::RegisterPlugin(BasePlugin *plugin)
plugin_map.emplace(plugin->GetDescriptor(), plugin); plugin_map.emplace(plugin->GetDescriptor(), plugin);
} }
void OSRM_impl::RunQuery(RouteParameters &route_parameters, http::Reply &reply) int OSRM_impl::RunQuery(RouteParameters &route_parameters, JSON::Object &json_result)
{ {
const PluginMap::const_iterator &iter = plugin_map.find(route_parameters.service); const PluginMap::const_iterator &iter = plugin_map.find(route_parameters.service);
if (plugin_map.end() != iter) if (plugin_map.end() != iter)
{ {
reply.status = http::Reply::ok;
if (barrier) if (barrier)
{ {
// lock update pending // lock update pending
@ -131,7 +128,7 @@ void OSRM_impl::RunQuery(RouteParameters &route_parameters, http::Reply &reply)
->CheckAndReloadFacade(); ->CheckAndReloadFacade();
} }
iter->second->HandleRequest(route_parameters, reply); iter->second->HandleRequest(route_parameters, json_result);
if (barrier) if (barrier)
{ {
// lock query // lock query
@ -148,10 +145,11 @@ void OSRM_impl::RunQuery(RouteParameters &route_parameters, http::Reply &reply)
barrier->no_running_queries_condition.notify_all(); barrier->no_running_queries_condition.notify_all();
} }
} }
return 200;
} }
else else
{ {
reply = http::Reply::StockReply(http::Reply::badRequest); return 400;
} }
} }
@ -164,7 +162,7 @@ OSRM::OSRM(ServerPaths paths, const bool use_shared_memory)
OSRM::~OSRM() { OSRM_pimpl_.reset(); } OSRM::~OSRM() { OSRM_pimpl_.reset(); }
void OSRM::RunQuery(RouteParameters &route_parameters, http::Reply &reply) int OSRM::RunQuery(RouteParameters &route_parameters, JSON::Object &json_result)
{ {
OSRM_pimpl_->RunQuery(route_parameters, reply); return OSRM_pimpl_->RunQuery(route_parameters, json_result);
} }

View File

@ -32,6 +32,7 @@ class BasePlugin;
namespace http { class Reply; } namespace http { class Reply; }
struct RouteParameters; struct RouteParameters;
#include <osrm/json_container.hpp>
#include <osrm/server_paths.hpp> #include <osrm/server_paths.hpp>
#include "../data_structures/query_edge.hpp" #include "../data_structures/query_edge.hpp"
@ -52,7 +53,7 @@ class OSRM_impl
OSRM_impl(ServerPaths paths, const bool use_shared_memory); OSRM_impl(ServerPaths paths, const bool use_shared_memory);
OSRM_impl(const OSRM_impl &) = delete; OSRM_impl(const OSRM_impl &) = delete;
virtual ~OSRM_impl(); virtual ~OSRM_impl();
void RunQuery(RouteParameters &route_parameters, http::Reply &reply); int RunQuery(RouteParameters &route_parameters, JSON::Object &json_result);
private: private:
void RegisterPlugin(BasePlugin *plugin); void RegisterPlugin(BasePlugin *plugin);

View File

@ -35,6 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../Util/json_renderer.hpp" #include "../Util/json_renderer.hpp"
#include "../Util/simple_logger.hpp" #include "../Util/simple_logger.hpp"
#include "../Util/string_util.hpp" #include "../Util/string_util.hpp"
#include "../Util/xml_renderer.hpp"
#include "../typedefs.h" #include "../typedefs.h"
#include <osrm/route_parameters.hpp> #include <osrm/route_parameters.hpp>
@ -84,13 +85,14 @@ void RequestHandler::handle_request(const http::Request &req, http::Reply &reply
auto iter = request.begin(); auto iter = request.begin();
const bool result = boost::spirit::qi::parse(iter, request.end(), api_parser); const bool result = boost::spirit::qi::parse(iter, request.end(), api_parser);
JSON::Object json_result;
// check if the was an error with the request // check if the was an error with the request
if (!result || (iter != request.end())) if (!result || (iter != request.end()))
{ {
reply = http::Reply::StockReply(http::Reply::badRequest); reply = http::Reply::StockReply(http::Reply::badRequest);
reply.content.clear(); reply.content.clear();
const auto position = std::distance(request.begin(), iter); const auto position = std::distance(request.begin(), iter);
JSON::Object json_result;
json_result.values["status"] = 400; json_result.values["status"] = 400;
std::string message = "Query string malformed close to position "; std::string message = "Query string malformed close to position ";
message += cast::integral_to_string(position); message += cast::integral_to_string(position);
@ -107,29 +109,32 @@ void RequestHandler::handle_request(const http::Request &req, http::Reply &reply
const std::string json_p = (route_parameters.jsonp_parameter + "("); const std::string json_p = (route_parameters.jsonp_parameter + "(");
reply.content.insert(reply.content.end(), json_p.begin(), json_p.end()); reply.content.insert(reply.content.end(), json_p.begin(), json_p.end());
} }
routing_machine->RunQuery(route_parameters, reply); routing_machine->RunQuery(route_parameters, json_result);
if (!route_parameters.jsonp_parameter.empty())
{ // append brace to jsonp response
reply.content.push_back(')');
}
// set headers // set headers
reply.headers.emplace_back("Content-Length", cast::integral_to_string(reply.content.size())); reply.headers.emplace_back("Content-Length", cast::integral_to_string(reply.content.size()));
if ("gpx" == route_parameters.output_format) if ("gpx" == route_parameters.output_format)
{ // gpx file { // gpx file
JSON::gpx_render(reply.content, json_result.values["route"]);
reply.headers.emplace_back("Content-Type", "application/gpx+xml; charset=UTF-8"); reply.headers.emplace_back("Content-Type", "application/gpx+xml; charset=UTF-8");
reply.headers.emplace_back("Content-Disposition", "attachment; filename=\"route.gpx\""); reply.headers.emplace_back("Content-Disposition", "attachment; filename=\"route.gpx\"");
} }
else if (route_parameters.jsonp_parameter.empty()) else if (route_parameters.jsonp_parameter.empty())
{ // json file { // json file
JSON::render(reply.content, json_result);
reply.headers.emplace_back("Content-Type", "application/json; charset=UTF-8"); reply.headers.emplace_back("Content-Type", "application/json; charset=UTF-8");
reply.headers.emplace_back("Content-Disposition", "inline; filename=\"response.json\""); reply.headers.emplace_back("Content-Disposition", "inline; filename=\"response.json\"");
} }
else else
{ // jsonp { // jsonp
JSON::render(reply.content, json_result);
reply.headers.emplace_back("Content-Type", "text/javascript; charset=UTF-8"); reply.headers.emplace_back("Content-Type", "text/javascript; charset=UTF-8");
reply.headers.emplace_back("Content-Disposition", "inline; filename=\"response.js\""); reply.headers.emplace_back("Content-Disposition", "inline; filename=\"response.js\"");
} }
if (!route_parameters.jsonp_parameter.empty())
{ // append brace to jsonp response
reply.content.push_back(')');
}
} }
catch (const std::exception &e) catch (const std::exception &e)
{ {

View File

@ -32,6 +32,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../data_structures/raw_route_data.hpp" #include "../data_structures/raw_route_data.hpp"
#include "../typedefs.h" #include "../typedefs.h"
#include <osrm/json_container.hpp>
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
#include <vector> #include <vector>
@ -77,8 +79,8 @@ template <class DataFacadeT> class BaseDescriptor
BaseDescriptor() {} BaseDescriptor() {}
// Maybe someone can explain the pure virtual destructor thing to me (dennis) // Maybe someone can explain the pure virtual destructor thing to me (dennis)
virtual ~BaseDescriptor() {} virtual ~BaseDescriptor() {}
virtual void Run(const RawRouteData &raw_route, http::Reply &reply) = 0; virtual void Run(const RawRouteData &, JSON::Object &) = 0;
virtual void SetConfig(const DescriptorConfig &config) = 0; virtual void SetConfig(const DescriptorConfig &) = 0;
}; };
#endif // DESCRIPTOR_BASE_HPP #endif // DESCRIPTOR_BASE_HPP

View File

@ -41,7 +41,7 @@ template <class DataFacadeT> class GPXDescriptor final : public BaseDescriptor<D
DescriptorConfig config; DescriptorConfig config;
DataFacadeT *facade; DataFacadeT *facade;
void AddRoutePoint(const FixedPointCoordinate &coordinate, JSON::Array &json_result) void AddRoutePoint(const FixedPointCoordinate &coordinate, JSON::Array &json_route)
{ {
JSON::Object json_lat; JSON::Object json_lat;
JSON::Object json_lon; JSON::Object json_lon;
@ -59,7 +59,7 @@ template <class DataFacadeT> class GPXDescriptor final : public BaseDescriptor<D
json_row.values.push_back(json_lon); json_row.values.push_back(json_lon);
JSON::Object entry; JSON::Object entry;
entry.values["rtept"] = json_row; entry.values["rtept"] = json_row;
json_result.values.push_back(entry); json_route.values.push_back(entry);
} }
public: public:
@ -67,13 +67,13 @@ template <class DataFacadeT> class GPXDescriptor final : public BaseDescriptor<D
void SetConfig(const DescriptorConfig &c) final { config = c; } void SetConfig(const DescriptorConfig &c) final { config = c; }
void Run(const RawRouteData &raw_route, http::Reply &reply) final void Run(const RawRouteData &raw_route, JSON::Object &json_result) final
{ {
JSON::Array json_result; JSON::Array json_route;
if (raw_route.shortest_path_length != INVALID_EDGE_WEIGHT) if (raw_route.shortest_path_length != INVALID_EDGE_WEIGHT)
{ {
AddRoutePoint(raw_route.segment_end_coordinates.front().source_phantom.location, AddRoutePoint(raw_route.segment_end_coordinates.front().source_phantom.location,
json_result); json_route);
for (const std::vector<PathData> &path_data_vector : raw_route.unpacked_path_segments) for (const std::vector<PathData> &path_data_vector : raw_route.unpacked_path_segments)
{ {
@ -81,13 +81,14 @@ template <class DataFacadeT> class GPXDescriptor final : public BaseDescriptor<D
{ {
const FixedPointCoordinate current_coordinate = const FixedPointCoordinate current_coordinate =
facade->GetCoordinateOfNode(path_data.node); facade->GetCoordinateOfNode(path_data.node);
AddRoutePoint(current_coordinate, json_result); AddRoutePoint(current_coordinate, json_route);
} }
} }
AddRoutePoint(raw_route.segment_end_coordinates.back().target_phantom.location, AddRoutePoint(raw_route.segment_end_coordinates.back().target_phantom.location,
json_result); json_route);
} }
JSON::gpx_render(reply.content, json_result); // JSON::gpx_render(reply.content, json_route);
json_result.values["route"] = json_route;
} }
}; };
#endif // GPX_DESCRIPTOR_HPP #endif // GPX_DESCRIPTOR_HPP

View File

@ -1,6 +1,6 @@
/* /*
Copyright (c) 2014, Project OSRM, Dennis Luxen, others Copyright (c) 2013, Project OSRM, Dennis Luxen, others
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, Redistribution and use in source and binary forms, with or without modification,
@ -99,15 +99,14 @@ template <class DataFacadeT> class JSONDescriptor final : public BaseDescriptor<
return added_element_count; return added_element_count;
} }
void Run(const RawRouteData &raw_route, http::Reply &reply) final void Run(const RawRouteData &raw_route, JSON::Object &json_result) final
{ {
JSON::Object json_result;
if (INVALID_EDGE_WEIGHT == raw_route.shortest_path_length) if (INVALID_EDGE_WEIGHT == raw_route.shortest_path_length)
{ {
// We do not need to do much, if there is no route ;-) // We do not need to do much, if there is no route ;-)
json_result.values["status"] = 207; json_result.values["status"] = 207;
json_result.values["status_message"] = "Cannot find route between points"; json_result.values["status_message"] = "Cannot find route between points";
JSON::render(reply.content, json_result); // JSON::render(reply.content, json_result);
return; return;
} }
@ -296,10 +295,10 @@ template <class DataFacadeT> class JSONDescriptor final : public BaseDescriptor<
json_result.values["hint_data"] = json_hint_object; json_result.values["hint_data"] = json_hint_object;
// render the content to the output array // render the content to the output array
TIMER_START(route_render); // TIMER_START(route_render);
JSON::render(reply.content, json_result); // JSON::render(reply.content, json_result);
TIMER_STOP(route_render); // TIMER_STOP(route_render);
SimpleLogger().Write(logDEBUG) << "rendering took: " << TIMER_MSEC(route_render); // SimpleLogger().Write(logDEBUG) << "rendering took: " << TIMER_MSEC(route_render);
} }
// TODO: reorder parameters // TODO: reorder parameters
@ -356,7 +355,7 @@ template <class DataFacadeT> class JSONDescriptor final : public BaseDescriptor<
json_instruction_row.values.push_back( json_instruction_row.values.push_back(
cast::integral_to_string(static_cast<unsigned>(segment.length)) + "m"); cast::integral_to_string(static_cast<unsigned>(segment.length)) + "m");
const double bearing_value = (segment.bearing / 10.); const double bearing_value = (segment.bearing / 10.);
json_instruction_row.values.push_back(Bearing::Get(bearing_value)); json_instruction_row.values.push_back(Azimuth::Get(bearing_value));
json_instruction_row.values.push_back( json_instruction_row.values.push_back(
static_cast<unsigned>(round(bearing_value))); static_cast<unsigned>(round(bearing_value)));
json_instruction_row.values.push_back(segment.travel_mode); json_instruction_row.values.push_back(segment.travel_mode);
@ -386,10 +385,10 @@ template <class DataFacadeT> class JSONDescriptor final : public BaseDescriptor<
json_last_instruction_row.values.push_back(necessary_segments_running_index - 1); json_last_instruction_row.values.push_back(necessary_segments_running_index - 1);
json_last_instruction_row.values.push_back(0); json_last_instruction_row.values.push_back(0);
json_last_instruction_row.values.push_back("0m"); json_last_instruction_row.values.push_back("0m");
json_last_instruction_row.values.push_back(Bearing::Get(0.0)); json_last_instruction_row.values.push_back(Azimuth::Get(0.0));
json_last_instruction_row.values.push_back(0.); json_last_instruction_row.values.push_back(0.);
json_instruction_array.values.push_back(json_last_instruction_row); json_instruction_array.values.push_back(json_last_instruction_row);
} }
}; };
#endif /* JSON_DESCRIPTOR_HPP */ #endif /* JSON_DESCRIPTOR_H_ */

View File

@ -64,12 +64,11 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
const std::string GetDescriptor() const final { return descriptor_string; } const std::string GetDescriptor() const final { return descriptor_string; }
void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) final int HandleRequest(const RouteParameters &route_parameters, JSON::Object &json_result) final
{ {
if (!check_all_coordinates(route_parameters.coordinates)) if (!check_all_coordinates(route_parameters.coordinates))
{ {
reply = http::Reply::StockReply(http::Reply::badRequest); return 400;
return;
} }
const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum()); const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum());
@ -103,11 +102,9 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
if (!result_table) if (!result_table)
{ {
reply = http::Reply::StockReply(http::Reply::badRequest); return 400;
return;
} }
JSON::Object json_object;
JSON::Array json_array; JSON::Array json_array;
const auto number_of_locations = phantom_node_vector.size(); const auto number_of_locations = phantom_node_vector.size();
for (const auto row : osrm::irange<std::size_t>(0, number_of_locations)) for (const auto row : osrm::irange<std::size_t>(0, number_of_locations))
@ -118,8 +115,9 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
json_row.values.insert(json_row.values.end(), row_begin_iterator, row_end_iterator); json_row.values.insert(json_row.values.end(), row_begin_iterator, row_end_iterator);
json_array.values.push_back(json_row); json_array.values.push_back(json_row);
} }
json_object.values["distance_table"] = json_array; json_result.values["distance_table"] = json_array;
JSON::render(reply.content, json_object); // JSON::render(reply.content, json_object);
return 200;
} }
private: private:

View File

@ -48,11 +48,8 @@ class HelloWorldPlugin final : public BasePlugin
virtual ~HelloWorldPlugin() {} virtual ~HelloWorldPlugin() {}
const std::string GetDescriptor() const final { return descriptor_string; } const std::string GetDescriptor() const final { return descriptor_string; }
void HandleRequest(const RouteParameters &routeParameters, http::Reply &reply) final int HandleRequest(const RouteParameters &routeParameters, JSON::Object &json_result) final
{ {
reply.status = http::Reply::ok;
JSON::Object json_result;
std::string temp_string; std::string temp_string;
json_result.values["title"] = "Hello World"; json_result.values["title"] = "Hello World";
@ -98,8 +95,7 @@ class HelloWorldPlugin final : public BasePlugin
++counter; ++counter;
} }
json_result.values["hints"] = json_hints; json_result.values["hints"] = json_hints;
return 200;
JSON::render(reply.content, json_result);
} }
private: private:

View File

@ -44,16 +44,14 @@ template <class DataFacadeT> class LocatePlugin final : public BasePlugin
explicit LocatePlugin(DataFacadeT *facade) : descriptor_string("locate"), facade(facade) {} explicit LocatePlugin(DataFacadeT *facade) : descriptor_string("locate"), facade(facade) {}
const std::string GetDescriptor() const final { return descriptor_string; } const std::string GetDescriptor() const final { return descriptor_string; }
void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) final int HandleRequest(const RouteParameters &route_parameters, JSON::Object &json_result) final
{ {
// check number of parameters // check number of parameters
if (route_parameters.coordinates.empty() || !route_parameters.coordinates.front().is_valid()) if (route_parameters.coordinates.empty() || !route_parameters.coordinates.front().is_valid())
{ {
reply = http::Reply::StockReply(http::Reply::badRequest); return 400;
return;
} }
JSON::Object json_result;
FixedPointCoordinate result; FixedPointCoordinate result;
if (!facade->LocateClosestEndPointForCoordinate(route_parameters.coordinates.front(), if (!facade->LocateClosestEndPointForCoordinate(route_parameters.coordinates.front(),
result)) result))
@ -62,15 +60,13 @@ template <class DataFacadeT> class LocatePlugin final : public BasePlugin
} }
else else
{ {
reply.status = http::Reply::ok;
json_result.values["status"] = 0; json_result.values["status"] = 0;
JSON::Array json_coordinate; JSON::Array json_coordinate;
json_coordinate.values.push_back(result.lat / COORDINATE_PRECISION); json_coordinate.values.push_back(result.lat / COORDINATE_PRECISION);
json_coordinate.values.push_back(result.lon / COORDINATE_PRECISION); json_coordinate.values.push_back(result.lon / COORDINATE_PRECISION);
json_result.values["mapped_coordinate"] = json_coordinate; json_result.values["mapped_coordinate"] = json_coordinate;
} }
return 200;
JSON::render(reply.content, json_result);
} }
private: private:

View File

@ -49,13 +49,12 @@ template <class DataFacadeT> class NearestPlugin final : public BasePlugin
const std::string GetDescriptor() const final { return descriptor_string; } const std::string GetDescriptor() const final { return descriptor_string; }
void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) final int HandleRequest(const RouteParameters &route_parameters, JSON::Object &json_result) final
{ {
// check number of parameters // check number of parameters
if (route_parameters.coordinates.empty() || !route_parameters.coordinates.front().is_valid()) if (route_parameters.coordinates.empty() || !route_parameters.coordinates.front().is_valid())
{ {
reply = http::Reply::StockReply(http::Reply::badRequest); return 400;
return;
} }
auto number_of_results = static_cast<std::size_t>(route_parameters.num_results); auto number_of_results = static_cast<std::size_t>(route_parameters.num_results);
std::vector<PhantomNode> phantom_node_vector; std::vector<PhantomNode> phantom_node_vector;
@ -63,14 +62,13 @@ template <class DataFacadeT> class NearestPlugin final : public BasePlugin
phantom_node_vector, phantom_node_vector,
static_cast<int>(number_of_results)); static_cast<int>(number_of_results));
JSON::Object json_result;
if (phantom_node_vector.empty() || !phantom_node_vector.front().is_valid()) if (phantom_node_vector.empty() || !phantom_node_vector.front().is_valid())
{ {
json_result.values["status"] = 207; json_result.values["status"] = 207;
} }
else else
{ {
reply.status = http::Reply::ok; // reply.status = http::Reply::ok;
json_result.values["status"] = 0; json_result.values["status"] = 0;
if (number_of_results > 1) if (number_of_results > 1)
@ -107,7 +105,7 @@ template <class DataFacadeT> class NearestPlugin final : public BasePlugin
json_result.values["name"] = temp_string; json_result.values["name"] = temp_string;
} }
} }
JSON::render(reply.content, json_result); return 200;
} }
private: private:

View File

@ -28,10 +28,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef BASEPLUGIN_H_ #ifndef BASEPLUGIN_H_
#define BASEPLUGIN_H_ #define BASEPLUGIN_H_
// remove
#include "../Server/Http/Reply.h"
#include <osrm/coordinate.hpp> #include <osrm/coordinate.hpp>
#include <osrm/json_container.hpp>
#include <osrm/route_parameters.hpp> #include <osrm/route_parameters.hpp>
#include <string> #include <string>
@ -44,8 +42,8 @@ class BasePlugin
// Maybe someone can explain the pure virtual destructor thing to me (dennis) // Maybe someone can explain the pure virtual destructor thing to me (dennis)
virtual ~BasePlugin() {} virtual ~BasePlugin() {}
virtual const std::string GetDescriptor() const = 0; virtual const std::string GetDescriptor() const = 0;
virtual void HandleRequest(const RouteParameters &routeParameters, http::Reply &reply) = 0; virtual int HandleRequest(const RouteParameters &, JSON::Object &) = 0;
virtual bool check_all_coordinates(const std::vector<FixedPointCoordinate> coordinates) const final virtual bool check_all_coordinates(const std::vector<FixedPointCoordinate> &coordinates) const final
{ {
if (2 > coordinates.size() || if (2 > coordinates.size() ||
std::any_of(std::begin(coordinates), std::any_of(std::begin(coordinates),

View File

@ -44,14 +44,12 @@ template <class DataFacadeT> class TimestampPlugin final : public BasePlugin
{ {
} }
const std::string GetDescriptor() const final { return descriptor_string; } const std::string GetDescriptor() const final { return descriptor_string; }
void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) final int HandleRequest(const RouteParameters &route_parameters, JSON::Object &json_result) final
{ {
reply.status = http::Reply::ok;
JSON::Object json_result;
json_result.values["status"] = 0; json_result.values["status"] = 0;
const std::string timestamp = facade->GetTimestamp(); const std::string timestamp = facade->GetTimestamp();
json_result.values["timestamp"] = timestamp; json_result.values["timestamp"] = timestamp;
JSON::render(reply.content, json_result); return 200;
} }
private: private:

View File

@ -71,14 +71,12 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
const std::string GetDescriptor() const final { return descriptor_string; } const std::string GetDescriptor() const final { return descriptor_string; }
void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) final int HandleRequest(const RouteParameters &route_parameters, JSON::Object &json_result) final
{ {
if (!check_all_coordinates(route_parameters.coordinates)) if (!check_all_coordinates(route_parameters.coordinates))
{ {
reply = http::Reply::StockReply(http::Reply::badRequest); return 400;
return;
} }
reply.status = http::Reply::ok;
std::vector<phantom_node_pair> phantom_node_pair_list(route_parameters.coordinates.size()); std::vector<phantom_node_pair> phantom_node_pair_list(route_parameters.coordinates.size());
const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum()); const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum());
@ -185,7 +183,8 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
} }
descriptor->SetConfig(route_parameters); descriptor->SetConfig(route_parameters);
descriptor->Run(raw_route, reply); descriptor->Run(raw_route, json_result);
return 200;
} }
}; };