]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/httpfetch.cpp
Revert "Fix settings to honor numeric conversion errors"
[dragonfireclient.git] / src / httpfetch.cpp
index 12e203ef20a5a1f4d9f4a5135a2abf78ccf66249..2eca363d7bb9a34bb415a431cc2df00ddedd8d30 100644 (file)
@@ -17,6 +17,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
+#include "socket.h" // for select()
+#include "porting.h" // for sleep_ms(), get_sysinfo()
 #include "httpfetch.h"
 #include <iostream>
 #include <sstream>
@@ -30,11 +32,25 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "log.h"
 #include "util/container.h"
 #include "util/thread.h"
-#include "socket.h" // for select()
+#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 + " (" + porting::get_sysinfo() + ")";
+}
+
+
 static void httpfetch_deliver_result(const HTTPFetchResult &fetchresult)
 {
        unsigned long caller = fetchresult.caller;
@@ -520,25 +536,33 @@ class CurlFetchThread : public JThread
                        select_timeout = timeout;
 
                if (select_timeout > 0) {
-                       select_tv.tv_sec = select_timeout / 1000;
-                       select_tv.tv_usec = (select_timeout % 1000) * 1000;
-                       int retval = select(max_fd + 1, &read_fd_set,
-                                       &write_fd_set, &exc_fd_set,
-                                       &select_tv);
-                       if (retval == -1) {
-                               #ifdef _WIN32
-                               errorstream<<"select returned error code "
-                                       <<WSAGetLastError()<<std::endl;
-                               #else
-                               errorstream<<"select returned error code "
-                                       <<errno<<std::endl;
-                               #endif
+                       // in Winsock it is forbidden to pass three empty
+                       // fd_sets to select(), so in that case use sleep_ms
+                       if (max_fd != -1) {
+                               select_tv.tv_sec = select_timeout / 1000;
+                               select_tv.tv_usec = (select_timeout % 1000) * 1000;
+                               int retval = select(max_fd + 1, &read_fd_set,
+                                               &write_fd_set, &exc_fd_set,
+                                               &select_tv);
+                               if (retval == -1) {
+                                       #ifdef _WIN32
+                                       errorstream<<"select returned error code "
+                                               <<WSAGetLastError()<<std::endl;
+                                       #else
+                                       errorstream<<"select returned error code "
+                                               <<errno<<std::endl;
+                                       #endif
+                               }
+                       }
+                       else {
+                               sleep_ms(select_timeout);
                        }
                }
        }
 
        void * Thread()
        {
+               ThreadStarted();
                log_register_thread("CurlFetchThread");
                DSTACK(__FUNCTION_NAME);
 
@@ -560,7 +584,7 @@ class CurlFetchThread : public JThread
                        */
 
                        while (!m_requests.empty()) {
-                               Request req = m_requests.pop_front();
+                               Request req = m_requests.pop_frontNoEx();
                                processRequest(req);
                        }
                        processQueued(&pool);
@@ -651,6 +675,8 @@ void httpfetch_cleanup()
 void httpfetch_async(const HTTPFetchRequest &fetchrequest)
 {
        g_httpfetch_thread->requestFetch(fetchrequest);
+       if (!g_httpfetch_thread->IsRunning())
+               g_httpfetch_thread->Start();
 }
 
 static void httpfetch_request_clear(unsigned long caller)