summaryrefslogtreecommitdiff
path: root/Source/Core/Common/HttpRequest.cpp
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2023-12-02 17:15:56 +0100
committerGitHub <noreply@github.com>2023-12-02 17:15:56 +0100
commit85f4a460f9210a86dd4dfdd4accaac309440201d (patch)
treef93beb33ea81f139d4ea2701c4213d115520e188 /Source/Core/Common/HttpRequest.cpp
parenta753022aa75a10969f2d65591edd6dd5cf42a671 (diff)
parentb46fcf9032e72a3b1b3cb7c815cc1984354b1347 (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.cpp30
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)