Add viaroute suport for new API

This commit is contained in:
Patrick Niklaus
2016-01-28 16:28:44 +01:00
parent 54ee76bcef
commit f3e72623e9
87 changed files with 3352 additions and 2099 deletions
+33 -57
View File
@@ -1,6 +1,7 @@
#include "server/request_handler.hpp"
#include "server/service_handler.hpp"
#include "server/api_grammar.hpp"
#include "server/api/url_parser.hpp"
#include "server/http/reply.hpp"
#include "server/http/request.hpp"
@@ -9,7 +10,7 @@
#include "util/string_util.hpp"
#include "util/typedefs.hpp"
#include "engine/route_parameters.hpp"
#include "engine/status.hpp"
#include "util/json_container.hpp"
#include "osrm/osrm.hpp"
@@ -28,11 +29,22 @@ namespace osrm
namespace server
{
RequestHandler::RequestHandler() : routing_machine(nullptr) {}
void RequestHandler::handle_request(const http::request &current_request,
void RequestHandler::RegisterServiceHandler(std::unique_ptr<ServiceHandler> service_handler_)
{
service_handler = std::move(service_handler_);
}
void RequestHandler::HandleRequest(const http::request &current_request,
http::reply &current_reply)
{
if (!service_handler)
{
current_reply = http::reply::stock_reply(http::reply::internal_server_error);
util::SimpleLogger().Write(logWARNING) << "No service handler registered." << std::endl;
return;
}
util::json::Object json_result;
// parse command
@@ -67,84 +79,49 @@ void RequestHandler::handle_request(const http::request &current_request,
<< current_request.agent << (0 == current_request.agent.length() ? "- " : " ")
<< request_string;
engine::RouteParameters route_parameters;
APIGrammarParser api_parser(&route_parameters);
auto api_iterator = request_string.begin();
const bool result =
boost::spirit::qi::parse(api_iterator, request_string.end(), api_parser);
auto maybe_parsed_url = api::parseURL(api_iterator, request_string.end());;
// check if the was an error with the request
if (result && api_iterator == request_string.end())
if (maybe_parsed_url && api_iterator == request_string.end())
{
// parsing done, lets call the right plugin to handle the request
BOOST_ASSERT_MSG(routing_machine != nullptr, "pointer not init'ed");
if (!route_parameters.jsonp_parameter.empty())
{ // prepend response with jsonp parameter
const std::string json_p = (route_parameters.jsonp_parameter + "(");
current_reply.content.insert(current_reply.content.end(), json_p.begin(),
json_p.end());
}
const int return_code = routing_machine->RunQuery(route_parameters, json_result);
json_result.values["status"] = return_code;
// 4xx bad request return code
if (return_code / 100 == 4)
const engine::Status status = service_handler->RunQuery(std::move(*maybe_parsed_url), json_result);
if (status != engine::Status::Ok)
{
// 4xx bad request return code
current_reply.status = http::reply::bad_request;
current_reply.content.clear();
route_parameters.output_format.clear();
}
else
{
// 2xx valid request
BOOST_ASSERT(return_code / 100 == 2);
BOOST_ASSERT(status == engine::Status::Ok);
}
}
else
{
const auto position = std::distance(request_string.begin(), api_iterator);
const auto context_begin = request_string.begin() + std::max(position - 3UL, 0UL);
const auto context_end = request_string.begin() + std::min(position + 3UL, request_string.size());
std::string context(context_begin, context_end);
current_reply.status = http::reply::bad_request;
json_result.values["status"] = http::reply::bad_request;
json_result.values["status_message"] =
"Query string malformed close to position " + std::to_string(position);
json_result.values["code"] = "invalid-url";
json_result.values["message"] =
"URL string malformed close to position " + std::to_string(position) + ": \"" + context + "\"";
}
current_reply.headers.emplace_back("Access-Control-Allow-Origin", "*");
current_reply.headers.emplace_back("Access-Control-Allow-Methods", "GET");
current_reply.headers.emplace_back("Access-Control-Allow-Headers",
"X-Requested-With, Content-Type");
current_reply.headers.emplace_back("Content-Type", "application/json; charset=UTF-8");
current_reply.headers.emplace_back("Content-Disposition",
"inline; filename=\"response.json\"");
if (route_parameters.service == "tile" && json_result.values.find("pbf") != json_result.values.end())
{
std::copy(json_result.values["pbf"].get<osrm::util::json::Buffer>().value.cbegin(),
json_result.values["pbf"].get<osrm::util::json::Buffer>().value.cend(),
std::back_inserter(current_reply.content));
util::json::render(current_reply.content, json_result);
current_reply.headers.emplace_back("Content-Type", "application/x-protobuf");
}
else if (route_parameters.jsonp_parameter.empty())
{ // json file
util::json::render(current_reply.content, json_result);
current_reply.headers.emplace_back("Content-Type", "application/json; charset=UTF-8");
current_reply.headers.emplace_back("Content-Disposition",
"inline; filename=\"response.json\"");
}
else
{ // jsonp
util::json::render(current_reply.content, json_result);
current_reply.headers.emplace_back("Content-Type", "text/javascript; charset=UTF-8");
current_reply.headers.emplace_back("Content-Disposition",
"inline; filename=\"response.js\"");
}
// set headers
current_reply.headers.emplace_back("Content-Length",
std::to_string(current_reply.content.size()));
if (!route_parameters.jsonp_parameter.empty())
{ // append brace to jsonp response
current_reply.content.push_back(')');
}
}
catch (const std::exception &e)
{
@@ -154,6 +131,5 @@ void RequestHandler::handle_request(const http::request &current_request,
}
}
void RequestHandler::RegisterRoutingMachine(OSRM *osrm) { routing_machine = osrm; }
}
}