From c62bab010fcf2b4b93af1cf0b71d4d0dbf78fed8 Mon Sep 17 00:00:00 2001 From: proller Date: Tue, 7 Jan 2014 02:50:45 +0400 Subject: [PATCH] Send long announce as POST, show OS in useragent Add lag reporting to masterserver (average dtime) StyledWriter -> FastWriter in masterserver announce --- src/convert_json.cpp | 2 -- src/guiEngine.cpp | 2 -- src/httpfetch.cpp | 25 +++++++++++++++++++++++++ src/httpfetch.h | 9 +-------- src/server.cpp | 4 +++- src/server.h | 2 ++ src/serverlist.cpp | 19 +++++++++++-------- src/serverlist.h | 2 +- util/master/servers.jst | 4 ++-- 9 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/convert_json.cpp b/src/convert_json.cpp index dbf0a82ac..917d6fcb3 100644 --- a/src/convert_json.cpp +++ b/src/convert_json.cpp @@ -37,8 +37,6 @@ Json::Value fetchJsonValue(const std::string url, HTTPFetchRequest fetchrequest; HTTPFetchResult fetchresult; fetchrequest.url = url; - fetchrequest.useragent = std::string("Minetest ")+minetest_version_hash; - fetchrequest.timeout = g_settings->getS32("curl_timeout"); fetchrequest.caller = HTTPFETCH_SYNC; struct curl_slist* runptr = chunk; diff --git a/src/guiEngine.cpp b/src/guiEngine.cpp index 0ec68e3ae..f18473ee0 100644 --- a/src/guiEngine.cpp +++ b/src/guiEngine.cpp @@ -518,8 +518,6 @@ bool GUIEngine::downloadFile(std::string url,std::string target) { HTTPFetchRequest fetchrequest; HTTPFetchResult fetchresult; fetchrequest.url = url; - fetchrequest.useragent = std::string("Minetest ")+minetest_version_hash; - fetchrequest.timeout = g_settings->getS32("curl_timeout"); fetchrequest.caller = HTTPFETCH_SYNC; httpfetch_sync(fetchrequest,fetchresult); diff --git a/src/httpfetch.cpp b/src/httpfetch.cpp index 60e4591a9..9eed045fe 100644 --- a/src/httpfetch.cpp +++ b/src/httpfetch.cpp @@ -25,6 +25,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#ifndef _MSC_VER +#include +#endif #include "jthread/jevent.h" #include "config.h" #include "exceptions.h" @@ -32,10 +35,32 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "log.h" #include "util/container.h" #include "util/thread.h" +#include "version.h" +#include "main.h" +#include "settings.h" JMutex g_httpfetch_mutex; std::map > g_httpfetch_results; + HTTPFetchRequest::HTTPFetchRequest() + { + url = ""; + caller = HTTPFETCH_DISCARD; + request_id = 0; + timeout = g_settings->getS32("curl_timeout"); + connect_timeout = timeout * 5; + + useragent = std::string("Minetest ") + minetest_version_hash; +#ifdef _MSC_VER + useragent += "Windows"; +#else + struct utsname osinfo; + uname(&osinfo); + useragent += std::string(" (") + osinfo.sysname + "; " + osinfo.release + "; " + osinfo.machine + ")"; +#endif + } + + static void httpfetch_deliver_result(const HTTPFetchResult &fetchresult) { unsigned long caller = fetchresult.caller; diff --git a/src/httpfetch.h b/src/httpfetch.h index f06c50e2c..e02e92b4a 100644 --- a/src/httpfetch.h +++ b/src/httpfetch.h @@ -58,14 +58,7 @@ struct HTTPFetchRequest //useragent to use std::string useragent; - HTTPFetchRequest() - { - url = ""; - caller = HTTPFETCH_DISCARD; - request_id = 0; - timeout = 0; - connect_timeout = 0; - } + HTTPFetchRequest(); }; struct HTTPFetchResult diff --git a/src/server.cpp b/src/server.cpp index 09c2ca663..0b3eb31a6 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -675,6 +675,7 @@ Server::Server( m_savemap_timer = 0.0; m_step_dtime = 0.0; + m_lag = g_settings->getFloat("dedicated_server_step"); if(path_world == "") throw ServerError("Supplied empty world path"); @@ -1260,13 +1261,14 @@ void Server::AsyncRunStep() } + m_lag += (m_lag > dtime ? -1 : 1) * dtime/100; #if USE_CURL // send masterserver announce { float &counter = m_masterserver_timer; if(!isSingleplayer() && (!counter || counter >= 300.0) && g_settings->getBool("server_announce") == true) { - ServerList::sendAnnounce(!counter ? "start" : "update", m_clients_names, m_uptime.get(), m_env->getGameTime(), m_gamespec.id, m_mods); + ServerList::sendAnnounce(!counter ? "start" : "update", m_clients_names, m_uptime.get(), m_env->getGameTime(), m_lag, m_gamespec.id, m_mods); counter = 0.01; } counter += dtime; diff --git a/src/server.h b/src/server.h index 28678f59c..39e715aa3 100644 --- a/src/server.h +++ b/src/server.h @@ -701,6 +701,8 @@ private: float m_step_dtime; JMutex m_step_dtime_mutex; + float m_lag; + // The server mainly operates in this thread ServerThread *m_thread; diff --git a/src/serverlist.cpp b/src/serverlist.cpp index 204427f88..2c475cbc0 100644 --- a/src/serverlist.cpp +++ b/src/serverlist.cpp @@ -188,7 +188,7 @@ std::string serializeJson(std::vector serverlist) #if USE_CURL -void sendAnnounce(std::string action, const std::vector & clients_names, double uptime, u32 game_time, std::string gameid, std::vector mods) { +void sendAnnounce(std::string action, const std::vector & clients_names, double uptime, u32 game_time, float lag, std::string gameid, std::vector mods) { Json::Value server; if (action.size()) server["action"] = action; @@ -226,16 +226,19 @@ void sendAnnounce(std::string action, const std::vector & clients_n server["mods"].append(m->name); } actionstream << "announcing to " << g_settings->get("serverlist_url") << std::endl; + } else { + if (lag) + server["step"] = lag; } - Json::StyledWriter writer; + Json::FastWriter writer; HTTPFetchRequest fetchrequest; - fetchrequest.url = g_settings->get("serverlist_url") - + std::string("/announce?json=") - + urlencode(writer.write(server)); - fetchrequest.useragent = std::string("Minetest ")+minetest_version_hash; - fetchrequest.caller = HTTPFETCH_DISCARD; - fetchrequest.timeout = g_settings->getS32("curl_timeout"); + fetchrequest.url = g_settings->get("serverlist_url") + std::string("/announce"); + std::string query = std::string("json=") + urlencode(writer.write(server)); + if (query.size() < 1000) + fetchrequest.url += "?" + query; + else + fetchrequest.post_fields = query; httpfetch_async(fetchrequest); } #endif diff --git a/src/serverlist.h b/src/serverlist.h index 77eb29b14..915e8482f 100644 --- a/src/serverlist.h +++ b/src/serverlist.h @@ -41,7 +41,7 @@ namespace ServerList std::string serializeJson(std::vector); #if USE_CURL void sendAnnounce(std::string action = "", const std::vector & clients_names = std::vector(), - double uptime = 0, u32 game_time = 0,std::string gameid = "", + double uptime = 0, u32 game_time = 0, float lag = 0, std::string gameid = "", std::vector mods = std::vector()); #endif } //ServerList namespace diff --git a/util/master/servers.jst b/util/master/servers.jst index 48116133a..54eea2842 100644 --- a/util/master/servers.jst +++ b/util/master/servers.jst @@ -13,7 +13,7 @@ {{? !master.no_description}}Description{{?}} {{? !master.no_flags}}Flags{{?}} {{? !master.no_uptime}}Uptime, Age{{?}} - {{? !master.no_ping}}Ping{{?}} + {{? !master.no_ping}}Ping, Lag{{?}} {{~it.list :server:index}} {{ if (master.limit && index + 1 > master.limit) break;}} @@ -64,7 +64,7 @@ {{?}} {{? !master.no_ping}} - {{=Math.floor(server.ping * 1000)}} + {{=Math.floor(server.ping * 1000)}}{{? server.lag}}, {{= Math.floor(server.lag * 1000)}}{{?}} {{?}} {{~}}