Send long announce as POST, show OS in useragent
authorproller <proller@github.com>
Mon, 6 Jan 2014 22:50:45 +0000 (02:50 +0400)
committerproller <proller@github.com>
Mon, 6 Jan 2014 22:50:45 +0000 (02:50 +0400)
Add lag reporting to masterserver (average dtime)
StyledWriter  -> FastWriter in masterserver announce

src/convert_json.cpp
src/guiEngine.cpp
src/httpfetch.cpp
src/httpfetch.h
src/server.cpp
src/server.h
src/serverlist.cpp
src/serverlist.h
util/master/servers.jst

index dbf0a82ac670ed4de56f6e6a69cd2fc976fb34f1..917d6fcb31ddd093f24f21ae6cef4907bd39a4fd 100644 (file)
@@ -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;
index 0ec68e3ae46771d55c0bd1db8178031d2ac64d56..f18473ee001455d54524cd3ba41ecc125bde72b0 100644 (file)
@@ -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);
 
index 60e4591a921444c57137dbc14f72bdebee124350..9eed045fedbc66bafe1f6bb045cc8befcf65a791 100644 (file)
@@ -25,6 +25,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <list>
 #include <map>
 #include <errno.h>
+#ifndef _MSC_VER
+#include <sys/utsname.h>
+#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<unsigned long, std::list<HTTPFetchResult> > 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;
index f06c50e2c3f1feb4f3d3037b0036fab3e9a150d4..e02e92b4a90190489bb45abba336abb3befb46c3 100644 (file)
@@ -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
index 09c2ca6634c5e92d3558e21a11f904f7bfc44f78..0b3eb31a64e39670133e1753ea93b4153a642021 100644 (file)
@@ -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;
index 28678f59c7e4f8dbbceb638d683fda526cb3e7df..39e715aa35590bcf9539348bc975f52daa543463 100644 (file)
@@ -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;
 
index 204427f8870a46496d0fae2b94d81eee129f10f7..2c475cbc0d2aa58f2f00a5385f1465fd4c3d4f62 100644 (file)
@@ -188,7 +188,7 @@ std::string serializeJson(std::vector<ServerListSpec> serverlist)
 
 
 #if USE_CURL
-void sendAnnounce(std::string action, const std::vector<std::string> & clients_names, double uptime, u32 game_time, std::string gameid, std::vector<ModSpec> mods) {
+void sendAnnounce(std::string action, const std::vector<std::string> & clients_names, double uptime, u32 game_time, float lag, std::string gameid, std::vector<ModSpec> mods) {
        Json::Value server;
        if (action.size())
                server["action"]        = action;
@@ -226,16 +226,19 @@ void sendAnnounce(std::string action, const std::vector<std::string> & 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
index 77eb29b14a09a7fff19509ad401c1a044662cbba..915e8482f039fe5d8ded0df33657ed12900b5d7f 100644 (file)
@@ -41,7 +41,7 @@ namespace ServerList
        std::string serializeJson(std::vector<ServerListSpec>);
        #if USE_CURL
        void sendAnnounce(std::string action = "", const std::vector<std::string> & clients_names = std::vector<std::string>(), 
-                               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<ModSpec> mods = std::vector<ModSpec>());
        #endif
 } //ServerList namespace
index 48116133afd1806d77da5b066a2ce38057c4310e..54eea28425134ff564a4a1b5bb8b2eda853d961b 100644 (file)
@@ -13,7 +13,7 @@
                {{? !master.no_description}}<th>Description</th>{{?}}
                {{? !master.no_flags}}<th>Flags</th>{{?}}
                {{? !master.no_uptime}}<th>Uptime, Age</th>{{?}}
-               {{? !master.no_ping}}<th>Ping</th>{{?}}
+               {{? !master.no_ping}}<th>Ping, Lag</th>{{?}}
        </tr>
        {{~it.list :server:index}}
        {{ if (master.limit && index + 1 > master.limit) break;}}
@@ -64,7 +64,7 @@
                </td>{{?}}
                {{? !master.no_ping}}
                <td class="ping">
-                       {{=Math.floor(server.ping * 1000)}}
+                       {{=Math.floor(server.ping * 1000)}}{{? server.lag}}, {{= Math.floor(server.lag * 1000)}}{{?}}
                </td>{{?}}
        </tr>
        {{~}}