summaryrefslogtreecommitdiff
path: root/src/httpfetch.h
diff options
context:
space:
mode:
authorKahrl <kahrl@gmx.net>2013-08-29 05:04:56 +0200
committerKahrl <kahrl@gmx.net>2013-12-13 18:05:10 +0100
commit0ea3e6dbe2288854d9d4a971fc6539c2e740a95a (patch)
tree2bd1e8485e0fe14cc69fefb8cae66a76f1086aee /src/httpfetch.h
parent67bf7130ce3f1780a432ae03eabdec3118ecab70 (diff)
downloadminetest-0ea3e6dbe2288854d9d4a971fc6539c2e740a95a.tar.gz
minetest-0ea3e6dbe2288854d9d4a971fc6539c2e740a95a.tar.bz2
minetest-0ea3e6dbe2288854d9d4a971fc6539c2e740a95a.zip
Implement httpfetch module and initialize it from main()
Add curl_parallel_limit setting that will replace media_fetch_threads in a later commit. Fix a typo in MutexedQueue::pop_back() that made it impossible to compile code that used this function. (Noticed this while implementing httpfetch.)
Diffstat (limited to 'src/httpfetch.h')
-rw-r--r--src/httpfetch.h126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/httpfetch.h b/src/httpfetch.h
new file mode 100644
index 000000000..56a198baf
--- /dev/null
+++ b/src/httpfetch.h
@@ -0,0 +1,126 @@
+/*
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef HTTPFETCH_HEADER
+#define HTTPFETCH_HEADER
+
+#include <string>
+#include <vector>
+#include "config.h"
+
+// Can be used in place of "caller" in asynchronous transfers to discard result
+// (used as default value of "caller")
+#define HTTPFETCH_DISCARD 0
+
+struct HTTPFetchRequest
+{
+ std::string url;
+
+ // Identifies the caller (for asynchronous requests)
+ // Ignored by httpfetch_sync
+ unsigned long caller;
+
+ // Some number that identifies the request
+ // (when the same caller issues multiple httpfetch_async calls)
+ unsigned long request_id;
+
+ // Timeout for the whole transfer, in milliseconds
+ long timeout;
+
+ // Timeout for the connection phase, in milliseconds
+ long connect_timeout;
+
+ // POST data (should be application/x-www-form-urlencoded
+ // unless a Content-Type header is specified in extra_headers)
+ // If this is empty a GET request is done instead.
+ std::string post_fields;
+
+ // If not empty, should contain entries such as "Accept: text/html"
+ std::vector<std::string> extra_headers;
+
+ HTTPFetchRequest()
+ {
+ url = "";
+ caller = HTTPFETCH_DISCARD;
+ request_id = 0;
+ timeout = 0;
+ connect_timeout = 0;
+ }
+};
+
+struct HTTPFetchResult
+{
+ bool succeeded;
+ bool timeout;
+ long response_code;
+ std::string data;
+ // The caller and request_id from the corresponding HTTPFetchRequest.
+ unsigned long caller;
+ unsigned long request_id;
+
+ HTTPFetchResult()
+ {
+ succeeded = false;
+ timeout = false;
+ response_code = 0;
+ data = "";
+ caller = HTTPFETCH_DISCARD;
+ request_id = 0;
+ }
+
+ HTTPFetchResult(const HTTPFetchRequest &fetchrequest)
+ {
+ succeeded = false;
+ timeout = false;
+ response_code = 0;
+ data = "";
+ caller = fetchrequest.caller;
+ request_id = fetchrequest.request_id;
+ }
+};
+
+// Initializes the httpfetch module
+void httpfetch_init(int parallel_limit);
+
+// Stops the httpfetch thread and cleans up resources
+void httpfetch_cleanup();
+
+// Starts an asynchronous HTTP fetch request
+void httpfetch_async(const HTTPFetchRequest &fetchrequest);
+
+// If any fetch for the given caller ID is complete, removes it from the
+// result queue, sets fetchresult and returns true. Otherwise returns false.
+bool httpfetch_async_get(unsigned long caller, HTTPFetchResult &fetchresult);
+
+// Allocates a caller ID for httpfetch_async
+// Not required if you want to set caller = HTTPFETCH_DISCARD
+unsigned long httpfetch_caller_alloc();
+
+// Frees a caller ID allocated with httpfetch_caller_alloc
+// Note: This can be expensive, because the httpfetch thread is told
+// to stop any ongoing fetches for the given caller.
+void httpfetch_caller_free(unsigned long caller);
+
+// Performs a synchronous HTTP request. This blocks and therefore should
+// only be used from background threads.
+void httpfetch_sync(const HTTPFetchRequest &fetchrequest,
+ HTTPFetchResult &fetchresult);
+
+
+#endif // !HTTPFETCH_HEADER