#41712 [Opn->Asn]: [PATCH] Add CURL Progress Function Callback

2009-04-28 Thread pajoye
 ID:   41712
 Updated by:   paj...@php.net
 Reported By:  sdteffen at gmail dot com
-Status:   Open
+Status:   Assigned
 Bug Type: Feature/Change Request
 Operating System: SuSE Linux 10.2
 PHP Version:  5CVS-2007-06-16 (CVS)
 Assigned To:  pajoye
 New Comment:

Thanks for the update.

The PHP part looks and the curl as well (thx to cURL's Daniel for the
quick review). I will test and apply it this week.


Previous Comments:


[2009-04-28 20:05:49] sdteffen at gmail dot com

Thanks for responding to this issue.

I've updated and tested the patch once more with the PHP_5_3 sources
from CVS today:

http://sdteffen.de/php/php_curl_progress_callback.patch

The test script is the same as mentioned under "Reproduce code", but

I've added an explanatory comment to the version on my website:

http://sdteffen.de/php/index_en.html



[2009-04-28 18:10:56] paj...@php.net

Did you test your with 5.3? If not can you post a URL to an updated
patch with a test script please? It can still make it this week for
5.3+.



[2009-04-28 15:09:26] frase at cs dot wisc dot edu

What happened here?  A patch was offered for this feature almost two
years ago, and was assigned to the maintainer a week later.  The next
six months saw some tweaks and corrections, and yet here we are two
years later with this still languishing in "assigned" limbo, neither
accepted and merged nor rejected and closed.

Ilia?  Tony?  Bueller?



[2009-02-20 09:27:43] php41712 at brainpower dot no-ip dot org

can somewone submit this to the php code as this will help a lot of
users



[2008-02-16 15:00:15] sdteffen at gmail dot com

The last patch is missing the changes to php_curl.h from the previous
patch. A file containing the complete patch with changes for both files
can be found under this URL:

http://sdteffen.de/php/php_curl_progress_callback.patch



The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/41712

-- 
Edit this bug report at http://bugs.php.net/?id=41712&edit=1



#41712 [Opn->Asn]: [PATCH] Add CURL Progress Function Callback

2007-06-25 Thread tony2001
 ID:   41712
 Updated by:   [EMAIL PROTECTED]
 Reported By:  sdteffen at gmail dot com
-Status:   Open
+Status:   Assigned
 Bug Type: cURL related
 Operating System: SuSE Linux 10.2
 PHP Version:  5CVS-2007-06-16 (CVS)
-Assigned To:  
+Assigned To:  iliaa
 New Comment:

Assigned to the maintainer.


Previous Comments:


[2007-06-16 12:20:04] sdteffen at gmail dot com

Patch to implement CURL_PROGRESSFUNCTION (works against today's 5.2 CVS
version):

diff -u php-5.2.3/ext/curl/interface.c
php-5.2.3.patched/ext/curl/interface.c
--- php-5.2.3/ext/curl/interface.c  2007-05-22 10:39:20.0 +0200
+++ php-5.2.3.patched/ext/curl/interface.c  2007-06-16
13:30:05.0 +0200
@@ -368,6 +368,7 @@
REGISTER_CURL_CONSTANT(CURLOPT_HEADER);
REGISTER_CURL_CONSTANT(CURLOPT_HTTPHEADER);
REGISTER_CURL_CONSTANT(CURLOPT_NOPROGRESS);
+   REGISTER_CURL_CONSTANT(CURLOPT_PROGRESSFUNCTION);
REGISTER_CURL_CONSTANT(CURLOPT_NOBODY);
REGISTER_CURL_CONSTANT(CURLOPT_FAILONERROR);
REGISTER_CURL_CONSTANT(CURLOPT_UPLOAD);
@@ -777,6 +778,80 @@
 }
 /* }}} */
 
+/* {{{ curl_progress
+ */
+static size_t curl_progress(void *clientp,
+double dltotal,
+double dlnow,
+double ultotal,
+double ulnow)
+{
+   php_curl   *ch = (php_curl *) clientp;
+   php_curl_progress  *t  = ch->handlers->progress;
+   int length = -1;
+
+#if PHP_CURL_DEBUG
+   fprintf(stderr, "curl_progress() called\n");
+   fprintf(stderr, "clientp = %x, dltotal = %f, dlnow = %f, ultotal =
%f, ulnow = %f\n", clientp, dltotal, dlnow, ultotal, ulnow);
+#endif
+
+   switch (t->method) {
+   case PHP_CURL_USER: {
+   zval **argv[4];
+   zval  *zdltotal = NULL;
+   zval  *zdlnow = NULL;
+   zval  *zultotal = NULL;
+   zval  *zulnow = NULL;
+   zval  *retval_ptr;
+   int   error;
+   zend_fcall_info fci;
+   TSRMLS_FETCH_FROM_CTX(ch->thread_ctx);
+
+   MAKE_STD_ZVAL(zdltotal);
+   MAKE_STD_ZVAL(zdlnow);
+   MAKE_STD_ZVAL(zultotal);
+   MAKE_STD_ZVAL(zulnow);
+   
+   ZVAL_LONG(zdltotal, dltotal);
+   ZVAL_LONG(zdlnow, dlnow);
+   ZVAL_LONG(zultotal, ultotal);
+   ZVAL_LONG(zulnow, ulnow);
+
+   argv[0] = &zdltotal;
+   argv[1] = &zdlnow;
+   argv[2] = &zultotal;
+   argv[3] = &zulnow;
+
+   fci.size = sizeof(fci);
+   fci.function_table = EG(function_table);
+   fci.function_name = t->func_name;
+   fci.object_pp = NULL;
+   fci.retval_ptr_ptr = &retval_ptr;
+   fci.param_count = 3;
+   fci.params = argv;
+   fci.no_separation = 0;
+   fci.symbol_table = NULL;
+
+   ch->in_callback = 1;
+   error = zend_call_function(&fci, &t->fci_cache 
TSRMLS_CC);
+   ch->in_callback = 0;
+   if (error == FAILURE) {
+   php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Cannot call the
CURLOPT_READFUNCTION"); 
+   length = -1;
+   } 
+
+   zval_ptr_dtor(argv[0]);
+   zval_ptr_dtor(argv[1]);
+   zval_ptr_dtor(argv[2]);
+   zval_ptr_dtor(argv[3]);
+   break;
+   }
+   }
+   return 0;
+}
+/* }}} */
+
+
 /* {{{ curl_read
  */
 static size_t curl_read(char *data, size_t size, size_t nmemb, void
*ctx)
@@ -1065,6 +1140,7 @@
(*ch)->handlers->write= ecalloc(1, sizeof(php_curl_write));
(*ch)->handlers->write_header = ecalloc(1, sizeof(php_curl_write));
(*ch)->handlers->read = ecalloc(1, sizeof(php_curl_read));
+   (*ch)->handlers->progress = ecalloc(1,
sizeof(php_curl_progress));
 
(*ch)->in_callback = 0;
(*ch)->header.str_len = 0;
@@ -1418,6 +1494,17 @@
ch->handlers->read->func_name = *zvalue;
ch->handlers->read->method = PHP_CURL_USER;
break;
+   case CURLOPT_PROGRESSFUNCTION:
+   curl_easy_setopt(ch->cp, CURLOPT_PROGRESSFUNCTION,  
curl_progress);
+   curl_easy_setopt(ch->cp, CURLOPT_PROGRESSDATA, ch);
+