#include "main.h" // for g_settings
#include "settings.h"
#include "version.h"
+#include "httpfetch.h"
+#include "porting.h"
-#if USE_CURL
-#include <curl/curl.h>
+Json::Value fetchJsonValue(const std::string &url,
+ std::vector<std::string> *extra_headers) {
-static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
-{
- ((std::string*)userp)->append((char*)contents, size * nmemb);
- return size * nmemb;
-}
+ HTTPFetchRequest fetchrequest;
+ HTTPFetchResult fetchresult;
+ fetchrequest.url = url;
+ fetchrequest.caller = HTTPFETCH_SYNC;
-#endif
+ if (extra_headers != NULL)
+ fetchrequest.extra_headers = *extra_headers;
-Json::Value fetchJsonValue(const std::string url,
- struct curl_slist *chunk) {
-#if USE_CURL
- std::string liststring;
- CURL *curl;
+ httpfetch_sync(fetchrequest,fetchresult);
- curl = curl_easy_init();
- if (curl)
- {
- CURLcode res;
-
- curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &liststring);
- curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, g_settings->getS32("curl_timeout"));
- curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, g_settings->getS32("curl_timeout"));
- curl_easy_setopt(curl, CURLOPT_USERAGENT, (std::string("Minetest ")+minetest_version_hash).c_str());
-
- if (chunk != 0)
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
-
- res = curl_easy_perform(curl);
- if (res != CURLE_OK)
- errorstream<<"Jsonreader: "<< url <<" not found (" << curl_easy_strerror(res) << ")" <<std::endl;
- curl_easy_cleanup(curl);
+ if (!fetchresult.succeeded) {
+ return Json::Value();
}
-
Json::Value root;
Json::Reader reader;
- std::istringstream stream(liststring);
- if (!liststring.size()) {
- return Json::Value();
- }
+ std::istringstream stream(fetchresult.data);
if (!reader.parse( stream, root ) )
{
errorstream << "URL: " << url << std::endl;
errorstream << "Failed to parse json data " << reader.getFormattedErrorMessages();
- errorstream << "data: \"" << liststring << "\"" << std::endl;
+ errorstream << "data: \"" << fetchresult.data << "\"" << std::endl;
return Json::Value();
}
else {
return root;
}
-#endif
+
return Json::Value();
}
std::vector<ModStoreMod> readModStoreList(Json::Value& modlist) {
- std::vector<ModStoreMod> retval;
+ std::vector<ModStoreMod> retval;
if (modlist.isArray()) {
for (unsigned int i = 0; i < modlist.size(); i++)
}
if (retval.versions.size() < 1) {
- errorstream << "readModStoreModDetails: not a single version specified!" << std::endl;
+ infostream << "readModStoreModDetails: not a single version specified!" << std::endl;
retval.valid = false;
}