diff options
| author | Admiral H. Curtiss <pikachu025@gmail.com> | 2023-12-02 17:15:56 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-12-02 17:15:56 +0100 |
| commit | 85f4a460f9210a86dd4dfdd4accaac309440201d (patch) | |
| tree | f93beb33ea81f139d4ea2701c4213d115520e188 /Source/Core/Common/HttpRequest.cpp | |
| parent | a753022aa75a10969f2d65591edd6dd5cf42a671 (diff) | |
| parent | b46fcf9032e72a3b1b3cb7c815cc1984354b1347 (diff) | |
Merge pull request #12184 from noahpistilli/kd-mail-send
IOS/KD: Implement Send Mail
Diffstat (limited to 'Source/Core/Common/HttpRequest.cpp')
| -rw-r--r-- | Source/Core/Common/HttpRequest.cpp | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/Source/Core/Common/HttpRequest.cpp b/Source/Core/Common/HttpRequest.cpp index afc6271542..cf26710372 100644 --- a/Source/Core/Common/HttpRequest.cpp +++ b/Source/Core/Common/HttpRequest.cpp @@ -33,7 +33,8 @@ public: void FollowRedirects(long max); s32 GetLastResponseCode(); Response Fetch(const std::string& url, Method method, const Headers& headers, const u8* payload, - size_t size, AllowedReturnCodes codes = AllowedReturnCodes::Ok_Only); + size_t size, AllowedReturnCodes codes = AllowedReturnCodes::Ok_Only, + std::span<Multiform> multiform = {}); static int CurlProgressCallback(Impl* impl, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow); @@ -174,6 +175,13 @@ void HttpRequest::Impl::UseIPv4() curl_easy_setopt(m_curl.get(), CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); } +HttpRequest::Response HttpRequest::PostMultiform(const std::string& url, + std::span<Multiform> multiform, + const Headers& headers, AllowedReturnCodes codes) +{ + return m_impl->Fetch(url, Impl::Method::POST, headers, nullptr, 0, codes, multiform); +} + void HttpRequest::Impl::FollowRedirects(long max) { curl_easy_setopt(m_curl.get(), CURLOPT_FOLLOWLOCATION, 1); @@ -225,17 +233,33 @@ static size_t header_callback(char* buffer, size_t size, size_t nitems, void* us HttpRequest::Response HttpRequest::Impl::Fetch(const std::string& url, Method method, const Headers& headers, const u8* payload, - size_t size, AllowedReturnCodes codes) + size_t size, AllowedReturnCodes codes, + std::span<Multiform> multiform) { m_response_headers.clear(); curl_easy_setopt(m_curl.get(), CURLOPT_POST, method == Method::POST); curl_easy_setopt(m_curl.get(), CURLOPT_URL, url.c_str()); - if (method == Method::POST) + if (method == Method::POST && multiform.empty()) { curl_easy_setopt(m_curl.get(), CURLOPT_POSTFIELDS, payload); curl_easy_setopt(m_curl.get(), CURLOPT_POSTFIELDSIZE, size); } + curl_mime* form = nullptr; + Common::ScopeGuard multiform_guard{[&form] { curl_mime_free(form); }}; + if (!multiform.empty()) + { + form = curl_mime_init(m_curl.get()); + for (const auto& value : multiform) + { + curl_mimepart* part = curl_mime_addpart(form); + curl_mime_name(part, value.name.c_str()); + curl_mime_data(part, value.data.c_str(), value.data.size()); + } + + curl_easy_setopt(m_curl.get(), CURLOPT_MIMEPOST, form); + } + curl_slist* list = nullptr; Common::ScopeGuard list_guard{[&list] { curl_slist_free_all(list); }}; for (const auto& [name, value] : headers) |
