Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions libs/openFrameworks/utils/ofURLFileLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,21 @@ size_t readBody_cb(void * ptr, size_t size, size_t nmemb, void * userdata) {
}
return 0; /* no more data left to deliver */
}
int progress_cb(void* ptr, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) {
auto & request = *static_cast<ofHttpRequest*>(ptr);
if (request.progressCallback) {
float progress = 0.0f;
if (request.method == ofHttpRequest::GET && dltotal > 0) {
progress = (float)dlnow / (float)dltotal;
// note: we may want to support upload and download for POST
} else if ((request.method == ofHttpRequest::PUT || request.method == ofHttpRequest::POST) && ultotal > 0) {
progress = (float)ulnow / (float)ultotal;
}

request.progressCallback(request, progress);
}
return 0;
}
}

ofHttpResponse ofURLFileLoaderImpl::handleRequest(const ofHttpRequest & request) {
Expand Down Expand Up @@ -412,6 +427,13 @@ ofHttpResponse ofURLFileLoaderImpl::handleRequest(const ofHttpRequest & request)
// start request and receive response
ofHttpResponse response(request, 0, "");
CURLcode err = CURLE_OK;

if (request.progressCallback) {
curl_easy_setopt(curl.get(), CURLOPT_XFERINFOFUNCTION, progress_cb);
curl_easy_setopt(curl.get(), CURLOPT_XFERINFODATA, &request);
curl_easy_setopt(curl.get(), CURLOPT_NOPROGRESS, 0L);
}

if (request.saveTo) {
ofFile saveTo(request.name, ofFile::WriteOnly, true);
curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &saveTo);
Expand Down
1 change: 1 addition & 0 deletions libs/openFrameworks/utils/ofURLFileLoader.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ class ofHttpRequest {
std::string body; ///< POST body data
std::string contentType; ///< POST data mime type
std::function<void(const ofHttpResponse &)> done;
std::function<void(const ofHttpRequest &, float)> progressCallback = nullptr; ///< pass a function for progress of download
size_t timeoutSeconds = 0;
bool headerOnly = false;

Expand Down
Loading