*/
#include "socket.h" // for select()
+#include "porting.h" // for sleep_ms(), get_sysinfo()
#include "httpfetch.h"
#include <iostream>
#include <sstream>
#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 + " (" + porting::get_sysinfo() + ")";
+}
+
+
static void httpfetch_deliver_result(const HTTPFetchResult &fetchresult)
{
unsigned long caller = fetchresult.caller;
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);
*/
while (!m_requests.empty()) {
- Request req = m_requests.pop_front();
+ Request req = m_requests.pop_frontNoEx();
processRequest(req);
}
processQueued(&pool);
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)