mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-29 07:37:45 +00:00
Cleanup and simplification of rest server
This commit is contained in:
parent
bfc550be2b
commit
0e8f3ea6db
1 changed files with 590 additions and 540 deletions
|
@ -169,45 +169,89 @@ bool loadSettings( int32_t argc, char* argv[] )
|
|||
return true;
|
||||
}
|
||||
|
||||
int main( int argc, char* argv[] )
|
||||
using ContentType = enum
|
||||
{
|
||||
g_log.setLogPath( "log\\SapphireAPI" );
|
||||
g_log.init();
|
||||
NONE,
|
||||
TEXT_PLAIN,
|
||||
JSON,
|
||||
XML,
|
||||
};
|
||||
|
||||
g_log.info( "===========================================================" );
|
||||
g_log.info( "Sapphire API Server " );
|
||||
g_log.info( "Version: 0.0.1" );
|
||||
g_log.info( "Compiled: " __DATE__ " " __TIME__ );
|
||||
g_log.info( "===========================================================" );
|
||||
std::string buildHttpResponse( uint16_t rCode, const std::string& content = "", ContentType type = NONE )
|
||||
{
|
||||
std::string result{""};
|
||||
std::string httpHead{"HTTP/1.1 "};
|
||||
std::string contentHeader{"Content-Length: "};
|
||||
std::string contentTypeHeader{"Content-Type: "};
|
||||
|
||||
if (!loadSettings(argc, argv))
|
||||
switch( type )
|
||||
{
|
||||
throw std::exception();
|
||||
case NONE:
|
||||
contentTypeHeader = "";
|
||||
break;
|
||||
case TEXT_PLAIN:
|
||||
contentTypeHeader += "text/plain\r\n";
|
||||
break;
|
||||
case JSON:
|
||||
contentTypeHeader += "application/json\r\n";
|
||||
break;
|
||||
case XML:
|
||||
contentTypeHeader += "text/xml\r\n";
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
g_exdData.loadZoneInfo();
|
||||
g_exdData.loadClassJobInfo();
|
||||
switch( rCode )
|
||||
{
|
||||
case 200:
|
||||
result += httpHead + "200 OK\r\n";
|
||||
if( content.size() > 0 )
|
||||
{
|
||||
result += contentTypeHeader;
|
||||
result += contentHeader + std::to_string( content.size() ) + "\r\n";
|
||||
}
|
||||
break;
|
||||
case 400:
|
||||
case 401:
|
||||
case 402:
|
||||
case 403:
|
||||
result += httpHead + std::to_string( rCode ) + "\r\n";
|
||||
if( content.size() > 0 )
|
||||
{
|
||||
result += contentTypeHeader;
|
||||
result += contentHeader + std::to_string( content.size() ) + "\r\n";
|
||||
}
|
||||
break;
|
||||
case 500:
|
||||
result += httpHead + "500 Internal Server Error\r\n";
|
||||
break;
|
||||
default:
|
||||
result += httpHead + std::to_string( rCode ) + "\r\n";
|
||||
|
||||
server.config.port = stoi( m_pConfig->getValue< std::string >( "Settings.General.HttpPort", "80" ) );
|
||||
g_log.info( "Starting REST server at port " + m_pConfig->getValue< std::string >( "Settings.General.HttpPort", "80" ) + "..." );
|
||||
|
||||
server.resource["^/ZoneName/([0-9]+)$"]["GET"] = [&]( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request ) {
|
||||
|
||||
|
||||
}
|
||||
result += "\r\n";
|
||||
if( content.size() > 0 )
|
||||
result += content;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void getZoneName( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request )
|
||||
{
|
||||
string number = request->path_match[1];
|
||||
auto it = g_exdData.m_zoneInfoMap.find( atoi( number.c_str() ) );
|
||||
std::string responseStr = "Not found!";
|
||||
if( it != g_exdData.m_zoneInfoMap.end() )
|
||||
{
|
||||
responseStr = it->second.zone_name + ", " + it->second.zone_str;
|
||||
}
|
||||
*response << "HTTP/1.1 200 OK\r\nContent-Length: " << responseStr.length() << "\r\n\r\n" << responseStr;
|
||||
};
|
||||
*response << buildHttpResponse( 200, responseStr );
|
||||
}
|
||||
|
||||
|
||||
/* Create account */
|
||||
server.resource["^/sapphire-api/lobby/createAccount"]["POST"] = [&]( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request ) {
|
||||
void createAccount( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request )
|
||||
{
|
||||
print_request_info( request );
|
||||
|
||||
std::string responseStr = "HTTP/1.1 400\r\n\r\n";
|
||||
try
|
||||
{
|
||||
|
||||
|
@ -217,33 +261,29 @@ int main( int argc, char* argv[] )
|
|||
|
||||
std::string pass = pt.get<string>( "pass" );
|
||||
std::string user = pt.get<string>( "username" );
|
||||
|
||||
// reloadConfig();
|
||||
|
||||
std::string sId;
|
||||
if( g_sapphireAPI.createAccount( user, pass, sId ) )
|
||||
{
|
||||
std::string json_string = "{\"sId\":\"" + sId + "\", \"lobbyHost\":\"" + m_pConfig->getValue< std::string >( "Settings.General.LobbyHost" ) + "\", \"frontierHost\":\"" + m_pConfig->getValue< std::string >( "Settings.General.FrontierHost" ) + "\"}";
|
||||
*response << "HTTP/1.1 200 OK\r\n "
|
||||
<< "Content-Type: application/json\r\n"
|
||||
<< "Content-Length: " << json_string.length() << "\r\n\r\n"
|
||||
<< json_string;
|
||||
std::string json_string = "{\"sId\":\"" + sId +
|
||||
"\", \"lobbyHost\":\"" + m_pConfig->getValue< std::string >( "Settings.General.LobbyHost" ) +
|
||||
"\", \"frontierHost\":\"" + m_pConfig->getValue< std::string >( "Settings.General.FrontierHost" ) + "\"}";
|
||||
*response << buildHttpResponse( 200, json_string, JSON );
|
||||
}
|
||||
else
|
||||
*response << "HTTP/1.1 400\r\n\r\n";
|
||||
*response << buildHttpResponse( 400 );
|
||||
}
|
||||
catch( exception& e )
|
||||
{
|
||||
*response << "HTTP/1.1 500\r\n\r\n";
|
||||
*response << buildHttpResponse( 500 );
|
||||
g_log.error( e.what() );
|
||||
}
|
||||
*response << "HTTP/1.1 200 OK\r\nContent-Length: " << responseStr.length() << "\r\nContent-Type: text/xml\r\n\r\n" << responseStr;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
server.resource["^/sapphire-api/lobby/login"]["POST"] = [&]( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request ) {
|
||||
void login( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request )
|
||||
{
|
||||
print_request_info( request );
|
||||
|
||||
try
|
||||
{
|
||||
using namespace boost::property_tree;
|
||||
|
@ -256,33 +296,33 @@ int main( int argc, char* argv[] )
|
|||
std::string sId;
|
||||
|
||||
// reloadConfig();
|
||||
|
||||
if( g_sapphireAPI.login( user, pass, sId ) )
|
||||
{
|
||||
std::string json_string = "{\"sId\":\"" + sId + "\", \"lobbyHost\":\"" + m_pConfig->getValue< std::string >("Settings.General.LobbyHost") + "\", \"frontierHost\":\"" + m_pConfig->getValue< std::string >( "Settings.General.FrontierHost" ) + "\"}";
|
||||
*response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
std::string json_string = "{\"sId\":\"" + sId +
|
||||
"\", \"lobbyHost\":\"" + m_pConfig->getValue< std::string >("Settings.General.LobbyHost") +
|
||||
"\", \"frontierHost\":\"" + m_pConfig->getValue< std::string >( "Settings.General.FrontierHost" ) + "\"}";
|
||||
*response << buildHttpResponse( 200, json_string, JSON );
|
||||
}
|
||||
else
|
||||
*response << "HTTP/1.1 400\r\n\r\n";
|
||||
*response << buildHttpResponse( 400 );
|
||||
|
||||
}
|
||||
catch( exception& e )
|
||||
{
|
||||
*response << "HTTP/1.1 500\r\n\r\n";
|
||||
*response << buildHttpResponse( 500 );
|
||||
g_log.error( e.what() );
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
server.resource["^/sapphire-api/lobby/deleteCharacter"]["POST"] = [&]( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request ) {
|
||||
void deleteCharacter( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request )
|
||||
{
|
||||
print_request_info( request );
|
||||
|
||||
try
|
||||
{
|
||||
using namespace boost::property_tree;
|
||||
ptree pt;
|
||||
read_json( request->content, pt );
|
||||
|
||||
std::string sId = pt.get<string>( "sId" );
|
||||
std::string secret = pt.get<string>( "secret" );
|
||||
std::string name = pt.get<string>( "name" );
|
||||
|
@ -291,34 +331,34 @@ int main( int argc, char* argv[] )
|
|||
|
||||
int32_t accountId = g_sapphireAPI.checkSession( sId );
|
||||
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret ) {
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret )
|
||||
{
|
||||
std::string json_string = "{\"result\":\"invalid_secret\"}";
|
||||
*response << "HTTP/1.1 403\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 403, json_string, JSON );
|
||||
}
|
||||
else
|
||||
{
|
||||
g_sapphireAPI.deleteCharacter( name, accountId );
|
||||
std::string json_string = "{\"result\":\"success\"}";
|
||||
*response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 200, json_string, JSON );
|
||||
}
|
||||
}
|
||||
catch( exception& e )
|
||||
{
|
||||
*response << "HTTP/1.1 500\r\n\r\n";
|
||||
*response << buildHttpResponse( 500 );
|
||||
g_log.error( e.what() );
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
server.resource["^/sapphire-api/lobby/createCharacter"]["POST"] = [&]( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request ) {
|
||||
void createCharacter( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request )
|
||||
{
|
||||
print_request_info( request );
|
||||
|
||||
try
|
||||
{
|
||||
using namespace boost::property_tree;
|
||||
ptree pt;
|
||||
read_json( request->content, pt );
|
||||
|
||||
std::string sId = pt.get<string>( "sId" );
|
||||
std::string secret = pt.get<string>( "secret" );
|
||||
std::string name = pt.get<string>( "name" );
|
||||
|
@ -332,33 +372,35 @@ int main( int argc, char* argv[] )
|
|||
|
||||
if( result != -1 )
|
||||
{
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret ) {
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret )
|
||||
{
|
||||
std::string json_string = "{\"result\":\"invalid_secret\"}";
|
||||
*response << "HTTP/1.1 403\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 403, json_string, JSON );
|
||||
}
|
||||
else
|
||||
{
|
||||
int32_t charId = g_sapphireAPI.createCharacter( result, name, finalJson, m_pConfig->getValue< uint8_t >( "Settings.Parameters.DefaultGMRank", 255 ) );
|
||||
|
||||
std::string json_string = "{\"result\":\"" + std::to_string( charId ) + "\"}";
|
||||
*response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 200, json_string, JSON );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string json_string = "{\"result\":\"invalid\"}";
|
||||
*response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 200, json_string, JSON );
|
||||
}
|
||||
}
|
||||
catch( exception& e )
|
||||
{
|
||||
*response << "HTTP/1.1 500\r\n\r\n";
|
||||
*response << buildHttpResponse( 500 );
|
||||
g_log.error( e.what() );
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
server.resource["^/sapphire-api/lobby/insertSession"]["POST"] = [&]( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request ) {
|
||||
void insertSession( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request )
|
||||
{
|
||||
print_request_info( request );
|
||||
|
||||
try
|
||||
|
@ -366,33 +408,31 @@ int main( int argc, char* argv[] )
|
|||
using namespace boost::property_tree;
|
||||
ptree pt;
|
||||
read_json( request->content, pt );
|
||||
|
||||
std::string sId = pt.get<string>( "sId" );
|
||||
uint32_t accountId = pt.get<uint32_t>( "accountId" );
|
||||
std::string secret = pt.get<string>( "secret" );
|
||||
|
||||
// reloadConfig();
|
||||
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret ) {
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret )
|
||||
{
|
||||
std::string json_string = "{\"result\":\"invalid_secret\"}";
|
||||
*response << "HTTP/1.1 403\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 403, json_string, JSON );
|
||||
}
|
||||
else
|
||||
{
|
||||
g_sapphireAPI.insertSession( accountId, sId );
|
||||
std::string json_string = "{\"result\":\"success\"}";
|
||||
*response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 200, json_string, JSON );
|
||||
}
|
||||
}
|
||||
catch( exception& e )
|
||||
{
|
||||
*response << "HTTP/1.1 500\r\n\r\n";
|
||||
*response << buildHttpResponse( 500 );
|
||||
g_log.error( e.what() );
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
server.resource["^/sapphire-api/lobby/checkNameTaken"]["POST"] = [&]( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request ) {
|
||||
void checkNameTaken( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request )
|
||||
{
|
||||
print_request_info( request );
|
||||
|
||||
try
|
||||
|
@ -406,9 +446,10 @@ int main( int argc, char* argv[] )
|
|||
|
||||
// reloadConfig();
|
||||
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret ) {
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret )
|
||||
{
|
||||
std::string json_string = "{\"result\":\"invalid_secret\"}";
|
||||
*response << "HTTP/1.1 403\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 403, json_string, JSON );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -417,92 +458,90 @@ int main( int argc, char* argv[] )
|
|||
json_string = "{\"result\":\"false\"}";
|
||||
else
|
||||
json_string = "{\"result\":\"true\"}";
|
||||
|
||||
*response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 200, json_string, JSON );
|
||||
}
|
||||
}
|
||||
catch( exception& e )
|
||||
{
|
||||
*response << "HTTP/1.1 500\r\n\r\n";
|
||||
*response << buildHttpResponse( 500 );
|
||||
g_log.error( e.what() );
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
server.resource["^/sapphire-api/lobby/checkSession"]["POST"] = [&]( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request ) {
|
||||
void checkSession( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request )
|
||||
{
|
||||
print_request_info( request );
|
||||
|
||||
try
|
||||
{
|
||||
using namespace boost::property_tree;
|
||||
ptree pt;
|
||||
read_json( request->content, pt );
|
||||
|
||||
std::string sId = pt.get<string>( "sId" );
|
||||
std::string secret = pt.get<string>( "secret" );
|
||||
|
||||
int32_t result = g_sapphireAPI.checkSession( sId );
|
||||
|
||||
// reloadConfig();
|
||||
|
||||
if( result != -1 )
|
||||
{
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret ) {
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret )
|
||||
{
|
||||
std::string json_string = "{\"result\":\"invalid_secret\"}";
|
||||
*response << "HTTP/1.1 403\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 403, json_string, JSON );
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string json_string = "{\"result\":\"" + std::to_string( result ) + "\"}";
|
||||
*response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 200, json_string, JSON );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string json_string = "{\"result\":\"invalid\"}";
|
||||
*response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 200, json_string, JSON );
|
||||
}
|
||||
}
|
||||
catch( exception& e )
|
||||
{
|
||||
*response << "HTTP/1.1 500\r\n\r\n";
|
||||
*response << buildHttpResponse( 500 );
|
||||
g_log.error( e.what() );
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
server.resource["^/sapphire-api/lobby/getNextCharId"]["POST"] = [&]( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request ) {
|
||||
void getNextCharId( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request )
|
||||
{
|
||||
print_request_info( request );
|
||||
|
||||
try
|
||||
{
|
||||
using namespace boost::property_tree;
|
||||
ptree pt;
|
||||
read_json( request->content, pt );
|
||||
|
||||
std::string secret = pt.get<string>( "secret" );
|
||||
|
||||
// reloadConfig();
|
||||
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret ) {
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret )
|
||||
{
|
||||
std::string json_string = "{\"result\":\"invalid_secret\"}";
|
||||
*response << "HTTP/1.1 403\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 403, json_string, JSON );
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string json_string = "{\"result\":\"" + std::to_string( g_sapphireAPI.getNextCharId() ) + "\"}";
|
||||
*response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 200, json_string, JSON );
|
||||
}
|
||||
}
|
||||
catch( exception& e )
|
||||
{
|
||||
*response << "HTTP/1.1 500\r\n\r\n";
|
||||
*response << buildHttpResponse( 500 );
|
||||
g_log.error( e.what() );
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
server.resource["^/sapphire-api/lobby/getNextContentId"]["POST"] = [&]( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request ) {
|
||||
void getNextContentId( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request )
|
||||
{
|
||||
print_request_info( request );
|
||||
|
||||
try
|
||||
|
@ -510,38 +549,37 @@ int main( int argc, char* argv[] )
|
|||
using namespace boost::property_tree;
|
||||
ptree pt;
|
||||
read_json( request->content, pt );
|
||||
|
||||
std::string secret = pt.get<string>( "secret" );
|
||||
|
||||
// reloadConfig();
|
||||
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret ) {
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret )
|
||||
{
|
||||
std::string json_string = "{\"result\":\"invalid_secret\"}";
|
||||
*response << "HTTP/1.1 403\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 403, json_string, JSON );
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string json_string = "{\"result\":\"" + std::to_string( g_sapphireAPI.getNextContentId() ) + "\"}";
|
||||
*response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 200, json_string, JSON );
|
||||
}
|
||||
}
|
||||
catch( exception& e )
|
||||
{
|
||||
*response << "HTTP/1.1 500\r\n\r\n";
|
||||
*response << buildHttpResponse( 500 );
|
||||
g_log.error( e.what() );
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
server.resource["^/sapphire-api/lobby/getCharacterList"]["POST"] = [&]( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request ) {
|
||||
void getCharacterList( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request )
|
||||
{
|
||||
print_request_info( request );
|
||||
|
||||
try
|
||||
{
|
||||
using namespace boost::property_tree;
|
||||
ptree pt;
|
||||
read_json( request->content, pt );
|
||||
|
||||
std::string sId = pt.get<string>( "sId" );
|
||||
std::string secret = pt.get<string>( "secret" );
|
||||
|
||||
|
@ -551,10 +589,10 @@ int main( int argc, char* argv[] )
|
|||
|
||||
if( result != -1 )
|
||||
{
|
||||
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret ) {
|
||||
if( m_pConfig->getValue< std::string >( "Settings.General.ServerSecret" ) != secret )
|
||||
{
|
||||
std::string json_string = "{\"result\":\"invalid_secret\"}";
|
||||
*response << "HTTP/1.1 403\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 403, json_string, JSON );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -578,26 +616,25 @@ int main( int argc, char* argv[] )
|
|||
std::ostringstream oss;
|
||||
write_json( oss, pt );
|
||||
std::string responseStr = oss.str();
|
||||
*response << "HTTP/1.1 200\r\nContent-Length: " << responseStr.length() << "\r\n\r\n" << responseStr;
|
||||
*response << buildHttpResponse( 200, responseStr, JSON );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string json_string = "{\"result\":\"invalid\"}";
|
||||
*response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||
*response << buildHttpResponse( 200, json_string, JSON );
|
||||
}
|
||||
}
|
||||
catch( exception& e )
|
||||
{
|
||||
*response << "HTTP/1.1 500\r\n\r\n";
|
||||
*response << buildHttpResponse( 500 );
|
||||
g_log.error( e.what() );
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
server.resource["^(/frontier-api/ffxivsupport/view/get_init)(.*)"]["GET"] = [&]( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request ) {
|
||||
void get_init( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request )
|
||||
{
|
||||
print_request_info( request );
|
||||
|
||||
try
|
||||
{
|
||||
auto web_root_path = boost::filesystem::canonical( "web" );
|
||||
|
@ -609,11 +646,6 @@ int main( int argc, char* argv[] )
|
|||
if( !( boost::filesystem::exists( path ) && boost::filesystem::is_regular_file( path ) ) )
|
||||
throw invalid_argument( "file does not exist" );
|
||||
|
||||
std::string cache_control, etag;
|
||||
|
||||
// Uncomment the following line to enable Cache-Control
|
||||
// cache_control="Cache-Control: max-age=86400\r\n";
|
||||
|
||||
auto ifs = make_shared<ifstream>();
|
||||
ifs->open( path.string(), ifstream::in | ios::binary | ios::ate );
|
||||
|
||||
|
@ -622,7 +654,7 @@ int main( int argc, char* argv[] )
|
|||
auto length = ifs->tellg();
|
||||
ifs->seekg( 0, ios::beg );
|
||||
|
||||
*response << "HTTP/1.1 200 OK\r\n" << cache_control << etag << "Content-Length: " << length << "\r\n\r\n";
|
||||
*response << "HTTP/1.1 200 OK\r\n" << "Content-Length: " << length << "\r\n\r\n";
|
||||
default_resource_send( server, response, ifs );
|
||||
}
|
||||
else
|
||||
|
@ -630,15 +662,14 @@ int main( int argc, char* argv[] )
|
|||
}
|
||||
catch( exception& e )
|
||||
{
|
||||
*response << "HTTP/1.1 500\r\n\r\n";
|
||||
*response << buildHttpResponse( 500 );
|
||||
g_log.error( e.what() );
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
server.resource["^(/frontier-api/ffxivsupport/information/get_headline_all)(.*)"]["GET"] = [&]( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request ) {
|
||||
void get_headline_all( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request )
|
||||
{
|
||||
print_request_info( request );
|
||||
|
||||
try
|
||||
{
|
||||
auto web_root_path = boost::filesystem::canonical( "web" );
|
||||
|
@ -650,11 +681,6 @@ int main( int argc, char* argv[] )
|
|||
if( !( boost::filesystem::exists( path ) && boost::filesystem::is_regular_file( path ) ) )
|
||||
throw invalid_argument( "file does not exist" );
|
||||
|
||||
std::string cache_control, etag;
|
||||
|
||||
// Uncomment the following line to enable Cache-Control
|
||||
// cache_control="Cache-Control: max-age=86400\r\n";
|
||||
|
||||
auto ifs = make_shared<ifstream>();
|
||||
ifs->open( path.string(), ifstream::in | ios::binary | ios::ate );
|
||||
|
||||
|
@ -662,8 +688,7 @@ int main( int argc, char* argv[] )
|
|||
{
|
||||
auto length = ifs->tellg();
|
||||
ifs->seekg( 0, ios::beg );
|
||||
|
||||
*response << "HTTP/1.1 200 OK\r\n" << cache_control << etag << "Content-Length: " << length << "\r\n\r\n";
|
||||
*response << "HTTP/1.1 200 OK\r\n" << "Content-Length: " << length << "\r\n\r\n";
|
||||
default_resource_send( server, response, ifs );
|
||||
}
|
||||
else
|
||||
|
@ -671,19 +696,14 @@ int main( int argc, char* argv[] )
|
|||
}
|
||||
catch( exception& e )
|
||||
{
|
||||
*response << "HTTP/1.1 500\r\n\r\n";
|
||||
*response << buildHttpResponse( 500 );
|
||||
g_log.error( e.what() );
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
//Default GET-example. If no other matches, this anonymous function will be called.
|
||||
//Will respond with content in the web/-directory, and its subdirectories.
|
||||
//Default file: index.html
|
||||
//Can for instance be used to retrieve an HTML 5 client that uses REST-resources on this server
|
||||
server.default_resource["GET"] = [&]( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request ) {
|
||||
void defaultGet( shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request )
|
||||
{
|
||||
print_request_info( request );
|
||||
|
||||
try
|
||||
{
|
||||
auto web_root_path = boost::filesystem::canonical( "web" );
|
||||
|
@ -697,11 +717,6 @@ int main( int argc, char* argv[] )
|
|||
if( !( boost::filesystem::exists( path ) && boost::filesystem::is_regular_file( path ) ) )
|
||||
throw invalid_argument( "file does not exist" );
|
||||
|
||||
std::string cache_control, etag;
|
||||
|
||||
// Uncomment the following line to enable Cache-Control
|
||||
// cache_control="Cache-Control: max-age=86400\r\n";
|
||||
|
||||
auto ifs = make_shared<ifstream>();
|
||||
ifs->open( path.string(), ifstream::in | ios::binary | ios::ate );
|
||||
|
||||
|
@ -710,7 +725,7 @@ int main( int argc, char* argv[] )
|
|||
auto length = ifs->tellg();
|
||||
ifs->seekg( 0, ios::beg );
|
||||
|
||||
*response << "HTTP/1.1 200 OK\r\n" << cache_control << etag << "Content-Length: " << length << "\r\n\r\n";
|
||||
*response << "HTTP/1.1 200 OK\r\n" << "Content-Length: " << length << "\r\n\r\n";
|
||||
default_resource_send( server, response, ifs );
|
||||
}
|
||||
else
|
||||
|
@ -719,11 +734,48 @@ int main( int argc, char* argv[] )
|
|||
catch( const exception & )
|
||||
{
|
||||
string content = "Path not found: " + request->path;
|
||||
*response << "HTTP/1.1 400 Bad Request\r\nContent-Length: " << content.length() << "\r\n\r\n" << content;
|
||||
*response << buildHttpResponse( 400, content );
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
thread server_thread( [&]() {
|
||||
int main( int argc, char* argv[] )
|
||||
{
|
||||
g_log.setLogPath( "log\\SapphireAPI" );
|
||||
g_log.init();
|
||||
|
||||
g_log.info( "===========================================================" );
|
||||
g_log.info( "Sapphire API Server " );
|
||||
g_log.info( "Version: 0.0.1" );
|
||||
g_log.info( "Compiled: " __DATE__ " " __TIME__ );
|
||||
g_log.info( "===========================================================" );
|
||||
|
||||
if( !loadSettings( argc, argv ) )
|
||||
throw std::exception();
|
||||
|
||||
g_exdData.loadZoneInfo();
|
||||
g_exdData.loadClassJobInfo();
|
||||
|
||||
server.config.port = stoi( m_pConfig->getValue< std::string >( "Settings.General.HttpPort", "80" ) );
|
||||
g_log.info( "Starting API server at port " + m_pConfig->getValue< std::string >( "Settings.General.HttpPort", "80" ) + "..." );
|
||||
|
||||
server.resource["^/ZoneName/([0-9]+)$"]["GET"] = &getZoneName;
|
||||
server.resource["^/sapphire-api/lobby/createAccount"]["POST"] = &createAccount;
|
||||
server.resource["^/sapphire-api/lobby/login"]["POST"] = &login;
|
||||
server.resource["^/sapphire-api/lobby/deleteCharacter"]["POST"] = &deleteCharacter;
|
||||
server.resource["^/sapphire-api/lobby/createCharacter"]["POST"] = &createCharacter;
|
||||
server.resource["^/sapphire-api/lobby/insertSession"]["POST"] = &insertSession;
|
||||
server.resource["^/sapphire-api/lobby/checkNameTaken"]["POST"] = &checkNameTaken;
|
||||
server.resource["^/sapphire-api/lobby/checkSession"]["POST"] = &checkSession;
|
||||
server.resource["^/sapphire-api/lobby/getNextCharId"]["POST"] = &getNextCharId;
|
||||
server.resource["^/sapphire-api/lobby/getNextContentId"]["POST"] = &getNextContentId;
|
||||
server.resource["^/sapphire-api/lobby/getCharacterList"]["POST"] = &getCharacterList;
|
||||
server.resource["^(/frontier-api/ffxivsupport/view/get_init)(.*)"]["GET"] = &get_init;
|
||||
server.resource["^(/frontier-api/ffxivsupport/information/get_headline_all)(.*)"]["GET"] = &get_headline_all;
|
||||
|
||||
server.default_resource["GET"] = &defaultGet;
|
||||
|
||||
thread server_thread( [&]()
|
||||
{
|
||||
//Start server
|
||||
server.start();
|
||||
} );
|
||||
|
@ -732,8 +784,6 @@ int main( int argc, char* argv[] )
|
|||
this_thread::sleep_for( chrono::seconds( 1 ) );
|
||||
|
||||
server_thread.join();
|
||||
g_log.info( "Started REST server at port " + std::to_string( server.config.port ) );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue