@@ -299,6 +299,21 @@ size_t readBody_cb(void * ptr, size_t size, size_t nmemb, void * userdata) {
299299 }
300300 return 0 ; /* no more data left to deliver */
301301}
302+ int progress_cb (void * ptr, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) {
303+ auto & request = *static_cast <ofHttpRequest*>(ptr);
304+ if (request.progressCallback ) {
305+ float progress = 0 .0f ;
306+ if (request.method == ofHttpRequest::GET && dltotal > 0 ) {
307+ progress = (float )dlnow / (float )dltotal;
308+ // note: we may want to support upload and download for POST
309+ } else if ((request.method == ofHttpRequest::PUT || request.method == ofHttpRequest::POST) && ultotal > 0 ) {
310+ progress = (float )ulnow / (float )ultotal;
311+ }
312+
313+ request.progressCallback (request, progress);
314+ }
315+ return 0 ;
316+ }
302317}
303318
304319ofHttpResponse ofURLFileLoaderImpl::handleRequest (const ofHttpRequest & request) {
@@ -412,6 +427,13 @@ ofHttpResponse ofURLFileLoaderImpl::handleRequest(const ofHttpRequest & request)
412427 // start request and receive response
413428 ofHttpResponse response (request, 0 , " " );
414429 CURLcode err = CURLE_OK;
430+
431+ if (request.progressCallback ) {
432+ curl_easy_setopt (curl.get (), CURLOPT_XFERINFOFUNCTION, progress_cb);
433+ curl_easy_setopt (curl.get (), CURLOPT_XFERINFODATA, &request);
434+ curl_easy_setopt (curl.get (), CURLOPT_NOPROGRESS, 0L );
435+ }
436+
415437 if (request.saveTo ) {
416438 ofFile saveTo (request.name , ofFile::WriteOnly, true );
417439 curl_easy_setopt (curl.get (), CURLOPT_WRITEDATA, &saveTo);
0 commit comments