From 8ccc61febbe7bb4cc65607aeb026118fad38c20b Mon Sep 17 00:00:00 2001 From: matcool <26722564+matcool@users.noreply.github.com> Date: Tue, 9 Jan 2024 20:10:58 -0300 Subject: [PATCH] new util methods, rename postFields and customRequest --- loader/include/Geode/utils/web.hpp | 60 +++++++++++++++++++++++------- loader/src/utils/web.cpp | 47 ++++++++++++++++++----- 2 files changed, 84 insertions(+), 23 deletions(-) diff --git a/loader/include/Geode/utils/web.hpp b/loader/include/Geode/utils/web.hpp index cd41bb5d..a29f7554 100644 --- a/loader/include/Geode/utils/web.hpp +++ b/loader/include/Geode/utils/web.hpp @@ -136,7 +136,7 @@ namespace geode::utils::web { * automatically followed * @returns An AsyncWebResponse object */ - AsyncWebResponse fetch(std::string const& url); + AsyncWebResponse fetch(std::string_view const url); /** * Begin the web request. It's not always necessary to call this as the * destructor calls it automatically, but if you need access to the @@ -145,6 +145,27 @@ namespace geode::utils::web { */ SentAsyncWebRequestHandle send(); + /** + * Shorthand for a GET request to the given url. + * Same return value as fetch. + */ + AsyncWebResponse get(std::string_view const url); + /** + * Shorthand for a POST request to the given url. + * Same return value as fetch. + */ + AsyncWebResponse post(std::string_view const url); + /** + * Shorthand for a PUT request to the given url. + * Same return value as fetch. + */ + AsyncWebResponse put(std::string_view const url); + /** + * Shorthand for a PATCH request to the given url. + * Same return value as fetch. + */ + AsyncWebResponse patch(std::string_view const url); + /** * If you only want one instance of this web request to run (for example, * you're downloading some global data for a manager), then use this @@ -155,40 +176,53 @@ namespace geode::utils::web { * recommended to be something unique * @returns Same AsyncWebRequest */ - AsyncWebRequest& join(std::string const& requestID); + AsyncWebRequest& join(std::string_view const requestID); + + // Request parameters /** * In order to specify a http header to the request, give it here. * Can be called more than once. */ - AsyncWebRequest& header(std::string const& header); + AsyncWebRequest& header(std::string_view const header); + /** + * In order to specify a http header to the request, give it here. + * Can be called more than once. + */ + AsyncWebRequest& header(std::string_view const headerName, std::string_view const headerValue); /** * In order to specify an user agent to the request, give it here. */ - AsyncWebRequest& userAgent(std::string const& userAgent); + AsyncWebRequest& userAgent(std::string_view const userAgent); + /** + * Sets the Content-Type header to the specified value. + */ + AsyncWebRequest& contentType(std::string_view const contentType); /** * Specify that the request is a POST request. */ AsyncWebRequest& postRequest(); /** - * Specify that the request is a custom request like PUT and DELETE. + * Specify the HTTP method for the request, like PUT and DELETE. */ - AsyncWebRequest& customRequest(std::string const& request); + AsyncWebRequest& method(std::string_view const method); /** - * Specify the post fields to send with the request. Only valid if - * `postRequest` or `customRequest` was called before. + * Specify the raw request body to send with the request. + * Content type is unchanged. */ - AsyncWebRequest& postFields(std::string const& fields); + AsyncWebRequest& bodyRaw(std::string_view const content); /** - * Specify the post fields to send with the request. Only valid if - * `postRequest` or `customRequest` was called before. Additionally - * sets the content type to application/json. + * Specify a json request body. Additionally sets the content type to + * application/json. */ - AsyncWebRequest& postFields(matjson::Value const& fields); + AsyncWebRequest& body(matjson::Value const& value); /** * Specify a timeout, in seconds, in which the request will fail. */ AsyncWebRequest& timeout(std::chrono::seconds seconds); + + // Callbacks + /** * Specify a callback to run if the download fails. The callback is * always ran in the GD thread, so interacting with UI is safe diff --git a/loader/src/utils/web.cpp b/loader/src/utils/web.cpp index 27a54690..7b98c57b 100644 --- a/loader/src/utils/web.cpp +++ b/loader/src/utils/web.cpp @@ -501,35 +501,38 @@ AsyncWebRequest& AsyncWebRequest::setThen(AsyncThen then) { return *this; } -AsyncWebRequest& AsyncWebRequest::join(std::string const& requestID) { +AsyncWebRequest& AsyncWebRequest::join(std::string_view const requestID) { m_impl->m_joinID = requestID; return *this; } -AsyncWebRequest& AsyncWebRequest::userAgent(std::string const& userAgent) { +AsyncWebRequest& AsyncWebRequest::userAgent(std::string_view const userAgent) { m_impl->m_userAgent = userAgent; return *this; } +AsyncWebRequest& AsyncWebRequest::contentType(std::string_view const contentType) { + return this->header("Content-Type", contentType); +} + AsyncWebRequest& AsyncWebRequest::postRequest() { m_impl->m_isPostRequest = true; return *this; } -AsyncWebRequest& AsyncWebRequest::customRequest(std::string const& request) { +AsyncWebRequest& AsyncWebRequest::method(std::string_view const request) { m_impl->m_customRequest = request; return *this; } -AsyncWebRequest& AsyncWebRequest::postFields(std::string const& fields) { - m_impl->m_isPostRequest = true; +AsyncWebRequest& AsyncWebRequest::bodyRaw(std::string_view const fields) { m_impl->m_postFields = fields; return *this; } -AsyncWebRequest& AsyncWebRequest::postFields(matjson::Value const& fields) { +AsyncWebRequest& AsyncWebRequest::body(matjson::Value const& fields) { m_impl->m_isJsonRequest = true; - return this->postFields(fields.dump()); + return this->bodyRaw(fields.dump()); } AsyncWebRequest& AsyncWebRequest::timeout(std::chrono::seconds seconds) { @@ -537,12 +540,36 @@ AsyncWebRequest& AsyncWebRequest::timeout(std::chrono::seconds seconds) { return *this; } -AsyncWebRequest& AsyncWebRequest::header(std::string const& header) { - m_impl->m_httpHeaders.push_back(header); +AsyncWebRequest& AsyncWebRequest::header(std::string_view const header) { + m_impl->m_httpHeaders.push_back(std::string(header)); return *this; } -AsyncWebResponse AsyncWebRequest::fetch(std::string const& url) { +AsyncWebRequest& AsyncWebRequest::header(std::string_view const headerName, std::string_view const headerValue) { + return this->header(fmt::format("{}: {}", headerName, headerValue)); +} + +AsyncWebResponse AsyncWebRequest::get(std::string_view const url) { + this->method("GET"); + return this->fetch(url); +} + +AsyncWebResponse AsyncWebRequest::post(std::string_view const url) { + this->method("POST"); + return this->fetch(url); +} + +AsyncWebResponse AsyncWebRequest::put(std::string_view const url) { + this->method("PUT"); + return this->fetch(url); +} + +AsyncWebResponse AsyncWebRequest::patch(std::string_view const url) { + this->method("PATCH"); + return this->fetch(url); +} + +AsyncWebResponse AsyncWebRequest::fetch(std::string_view const url) { m_impl->m_url = url; return AsyncWebResponse(*this); }