diff --git a/src/network/core/http.h b/src/network/core/http.h index cad503862f..e14ef8f006 100644 --- a/src/network/core/http.h +++ b/src/network/core/http.h @@ -42,9 +42,9 @@ public: * * @param uri the URI to connect to (https://.../..). * @param callback the callback to send data back on. - * @param data optionally, the data we want to send. When set, this will be a POST request, otherwise a GET request. + * @param data the data we want to send. When non-empty, this will be a POST request, otherwise a GET request. */ - static void Connect(const std::string &uri, HTTPCallback *callback, const char *data = nullptr); + static void Connect(const std::string &uri, HTTPCallback *callback, const std::string data = ""); /** * Do the receiving for all HTTP connections. diff --git a/src/network/core/http_curl.cpp b/src/network/core/http_curl.cpp index 188d9b7b63..0694afeac7 100644 --- a/src/network/core/http_curl.cpp +++ b/src/network/core/http_curl.cpp @@ -53,26 +53,18 @@ public: * * @param uri the URI to connect to (https://.../..). * @param callback the callback to send data back on. - * @param data optionally, the data we want to send. When set, this will be a POST request, otherwise a GET request. + * @param data the data we want to send. When non-empty, this will be a POST request, otherwise a GET request. */ - NetworkHTTPRequest(const std::string &uri, HTTPCallback *callback, const char *data = nullptr) : + NetworkHTTPRequest(const std::string &uri, HTTPCallback *callback, const std::string &data) : uri(uri), callback(callback), data(data) { } - /** - * Destructor of the HTTP request. - */ - ~NetworkHTTPRequest() - { - free(this->data); - } - - std::string uri; ///< URI to connect to. - HTTPCallback *callback; ///< Callback to send data back on. - const char *data; ///< Data to send, if any. + const std::string uri; ///< URI to connect to. + HTTPCallback *callback; ///< Callback to send data back on. + const std::string data; ///< Data to send, if any. }; static std::thread _http_thread; @@ -85,7 +77,7 @@ static std::string _http_ca_file = ""; static std::string _http_ca_path = ""; #endif /* UNIX */ -/* static */ void NetworkHTTPSocketHandler::Connect(const std::string &uri, HTTPCallback *callback, const char *data) +/* static */ void NetworkHTTPSocketHandler::Connect(const std::string &uri, HTTPCallback *callback, const std::string data) { #if defined(UNIX) if (_http_ca_file.empty() && _http_ca_path.empty()) { @@ -154,9 +146,9 @@ void HttpThread() curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L); /* Prepare POST body and URI. */ - if (request->data != nullptr) { + if (!request->data.empty()) { curl_easy_setopt(curl, CURLOPT_POST, 1L); - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request->data); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request->data.c_str()); } curl_easy_setopt(curl, CURLOPT_URL, request->uri.c_str()); diff --git a/src/network/core/http_none.cpp b/src/network/core/http_none.cpp index aae03cbff8..41ba7c8cba 100644 --- a/src/network/core/http_none.cpp +++ b/src/network/core/http_none.cpp @@ -18,7 +18,7 @@ #include "../../safeguards.h" -/* static */ void NetworkHTTPSocketHandler::Connect(const std::string &uri, HTTPCallback *callback, const char *data) +/* static */ void NetworkHTTPSocketHandler::Connect(const std::string &uri, HTTPCallback *callback, const std::string data) { /* No valid HTTP backend was compiled in, so we fail all HTTP requests. */ callback->OnFailure(); diff --git a/src/network/core/http_winhttp.cpp b/src/network/core/http_winhttp.cpp index 209316759f..e689ee0050 100644 --- a/src/network/core/http_winhttp.cpp +++ b/src/network/core/http_winhttp.cpp @@ -25,9 +25,9 @@ static HINTERNET _winhttp_session = nullptr; /** Single HTTP request. */ class NetworkHTTPRequest { private: - std::wstring uri; ///< URI to connect to. - HTTPCallback *callback; ///< Callback to send data back on. - const char *data; ///< Data to send, if any. + const std::wstring uri; ///< URI to connect to. + HTTPCallback *callback; ///< Callback to send data back on. + const std::string data; ///< Data to send, if any. HINTERNET connection = nullptr; ///< Current connection object. HINTERNET request = nullptr; ///< Current request object. @@ -35,7 +35,7 @@ private: int depth = 0; ///< Current redirect depth we are in. public: - NetworkHTTPRequest(const std::wstring &uri, HTTPCallback *callback, const char *data = nullptr); + NetworkHTTPRequest(const std::wstring &uri, HTTPCallback *callback, const std::string &data); ~NetworkHTTPRequest(); @@ -52,9 +52,9 @@ static std::vector _new_http_requests; * * @param uri the URI to connect to (https://.../..). * @param callback the callback to send data back on. - * @param data optionally, the data we want to send. When set, this will be a POST request, otherwise a GET request. + * @param data the data we want to send. When non-empty, this will be a POST request, otherwise a GET request. */ -NetworkHTTPRequest::NetworkHTTPRequest(const std::wstring &uri, HTTPCallback *callback, const char *data) : +NetworkHTTPRequest::NetworkHTTPRequest(const std::wstring &uri, HTTPCallback *callback, const std::string &data) : uri(uri), callback(callback), data(data) @@ -224,7 +224,7 @@ void NetworkHTTPRequest::Connect() return; } - this->request = WinHttpOpenRequest(connection, data == nullptr ? L"GET" : L"POST", url_components.lpszUrlPath, nullptr, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, url_components.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0); + this->request = WinHttpOpenRequest(connection, data.empty() ? L"GET" : L"POST", url_components.lpszUrlPath, nullptr, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, url_components.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0); if (this->request == nullptr) { WinHttpCloseHandle(this->connection); @@ -235,10 +235,10 @@ void NetworkHTTPRequest::Connect() } /* Send the request (possibly with a payload). */ - if (data == nullptr) { + if (data.empty()) { WinHttpSendRequest(this->request, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, reinterpret_cast(this)); } else { - WinHttpSendRequest(this->request, L"Content-Type: application/x-www-form-urlencoded\r\n", -1, const_cast(data), static_cast(strlen(data)), static_cast(strlen(data)), reinterpret_cast(this)); + WinHttpSendRequest(this->request, L"Content-Type: application/x-www-form-urlencoded\r\n", -1, const_cast(data.c_str()), static_cast(data.size()), static_cast(data.size()), reinterpret_cast(this)); } } @@ -263,11 +263,9 @@ NetworkHTTPRequest::~NetworkHTTPRequest() WinHttpCloseHandle(this->request); WinHttpCloseHandle(this->connection); } - - free(this->data); } -/* static */ void NetworkHTTPSocketHandler::Connect(const std::string &uri, HTTPCallback *callback, const char *data) +/* static */ void NetworkHTTPSocketHandler::Connect(const std::string &uri, HTTPCallback *callback, const std::string data) { auto request = new NetworkHTTPRequest(std::wstring(uri.begin(), uri.end()), callback, data); request->Connect(); diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index 79bb4ed052..27a54b84dc 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -337,25 +337,14 @@ void ClientNetworkContentSocketHandler::DownloadSelectedContent(uint &files, uin */ void ClientNetworkContentSocketHandler::DownloadSelectedContentHTTP(const ContentIDList &content) { - uint count = (uint)content.size(); - - /* Allocate memory for the whole request. - * Requests are "id\nid\n..." (as strings), so assume the maximum ID, - * which is uint32 so 10 characters long. Then the newlines and - * multiply that all with the count and then add the '\0'. */ - uint bytes = (10 + 1) * count + 1; - char *content_request = MallocT(bytes); - const char *lastof = content_request + bytes - 1; - - char *p = content_request; + std::string content_request; for (const ContentID &id : content) { - p += seprintf(p, lastof, "%d\n", id); + content_request += std::to_string(id) + "\n"; } this->http_response_index = -1; NetworkHTTPSocketHandler::Connect(NetworkContentMirrorUriString(), this, content_request); - /* NetworkHTTPContentConnecter takes over freeing of content_request! */ } /**