X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fhttpfetch.h;h=a4901e63b71d119bc1cee24751429ff62a584cd5;hb=54dccc480eb03adcf219a7add58f547284f40f76;hp=6eb01fe79a04af083f73f4aace93121d14148866;hpb=b03135548bbd9bcb73d14b067b96ec913404dd5f;p=dragonfireclient.git diff --git a/src/httpfetch.h b/src/httpfetch.h index 6eb01fe79..a4901e63b 100644 --- a/src/httpfetch.h +++ b/src/httpfetch.h @@ -17,28 +17,44 @@ 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 +#pragma once -#include #include +#include "util/string.h" #include "config.h" -// Can be used in place of "caller" in asynchronous transfers to discard result -// (used as default value of "caller") +// These can be used in place of "caller" in to specify special handling. +// Discard result (used as default value of "caller"). #define HTTPFETCH_DISCARD 0 +// Indicates that the result should not be discarded when performing a +// synchronous request (since a real caller ID is not needed for synchronous +// requests because the result does not have to be retrieved later). +#define HTTPFETCH_SYNC 1 +// Print response body to console if the server returns an error code. +#define HTTPFETCH_PRINT_ERR 2 +// Start of regular allocated caller IDs. +#define HTTPFETCH_CID_START 3 + +// Methods +enum HttpMethod : u8 +{ + HTTP_GET, + HTTP_POST, + HTTP_PUT, + HTTP_DELETE, +}; struct HTTPFetchRequest { - std::string url; + std::string url = ""; // Identifies the caller (for asynchronous requests) // Ignored by httpfetch_sync - unsigned long caller; + u64 caller = HTTPFETCH_DISCARD; // Some number that identifies the request // (when the same caller issues multiple httpfetch_async calls) - unsigned long request_id; + u64 request_id = 0; // Timeout for the whole transfer, in milliseconds long timeout; @@ -46,55 +62,44 @@ struct HTTPFetchRequest // 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; + // Indicates if this is multipart/form-data or + // application/x-www-form-urlencoded. POST-only. + bool multipart = false; + + // The Method to use default = GET + // Avaible methods GET, POST, PUT, DELETE + HttpMethod method = HTTP_GET; + + // Fields of the request + StringMap fields; + + // Raw data of the request overrides fields + std::string raw_data; // If not empty, should contain entries such as "Accept: text/html" std::vector extra_headers; - //useragent to use + // useragent to use std::string useragent; - HTTPFetchRequest() - { - url = ""; - caller = HTTPFETCH_DISCARD; - request_id = 0; - timeout = 0; - connect_timeout = 0; - } + HTTPFetchRequest(); }; struct HTTPFetchResult { - bool succeeded; - bool timeout; - long response_code; - std::string data; + bool succeeded = false; + bool timeout = false; + long response_code = 0; + std::string data = ""; // The caller and request_id from the corresponding HTTPFetchRequest. - unsigned long caller; - unsigned long request_id; + u64 caller = HTTPFETCH_DISCARD; + u64 request_id = 0; - HTTPFetchResult() - { - succeeded = false; - timeout = false; - response_code = 0; - data = ""; - caller = HTTPFETCH_DISCARD; - request_id = 0; - } + HTTPFetchResult() = default; - HTTPFetchResult(const HTTPFetchRequest &fetchrequest) + HTTPFetchResult(const HTTPFetchRequest &fetch_request) : + caller(fetch_request.caller), request_id(fetch_request.request_id) { - succeeded = false; - timeout = false; - response_code = 0; - data = ""; - caller = fetchrequest.caller; - request_id = fetchrequest.request_id; } }; @@ -105,25 +110,24 @@ void httpfetch_init(int parallel_limit); void httpfetch_cleanup(); // Starts an asynchronous HTTP fetch request -void httpfetch_async(const HTTPFetchRequest &fetchrequest); +void httpfetch_async(const HTTPFetchRequest &fetch_request); // 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); +// result queue, sets the fetch result and returns true. Otherwise returns false. +bool httpfetch_async_get(u64 caller, HTTPFetchResult &fetch_result); // Allocates a caller ID for httpfetch_async // Not required if you want to set caller = HTTPFETCH_DISCARD -unsigned long httpfetch_caller_alloc(); +u64 httpfetch_caller_alloc(); + +// Allocates a non-predictable caller ID for httpfetch_async +u64 httpfetch_caller_alloc_secure(); // 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); +void httpfetch_caller_free(u64 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 +void httpfetch_sync(const HTTPFetchRequest &fetch_request, HTTPFetchResult &fetch_result);