#define PHP_CURL_DIRECT 3
#define PHP_CURL_RETURN 4
-static size_t curl_write(void *ctx, char *data, size_t size, size_t nmemb, FILE *fp)
+static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx)
{
php_curl *ch = (php_curl *) ctx;
- php_curl_write *t = ch->write;
+ php_curl_write *t = ch->handlers->write;
size_t length = size * nmemb;
+ ELS_FETCH();
switch (t->method) {
case PHP_CURL_FILE:
- return fwrite(data, size, nmemb, fp);
+ return fwrite(data, size, nmemb, t->fp);
case PHP_CURL_RETURN:
case PHP_CURL_STDOUT:
smart_str_appendl(&t->buf, data, (int) length);
return length;
}
-static size_t curl_read(void *ctx, char *data, size_t size, size_t nmemb, FILE *fp)
+static size_t curl_read(char *data, size_t size, size_t nmemb, void *ctx)
{
php_curl *ch = (php_curl *) ctx;
- php_curl_read *t = ch->read;
+ php_curl_read *t = ch->handlers->read;
int length = -1;
+ ELS_FETCH();
switch (t->method) {
case PHP_CURL_DIRECT:
- length = fread(data, size, nmemb, fp);
+ length = fread(data, size, nmemb, t->fp);
case PHP_CURL_USER: {
zval *argv[3];
zval *retval;
php_error(E_WARNING, "Cannot call the CURLOPT_READFUNCTION");
break;
}
-
- data = estrndup(Z_STRVAL_P(retval), Z_STRLEN_P(retval));
+
+ memcpy(data, Z_STRVAL_P(retval), Z_STRLEN_P(retval));
length = Z_STRLEN_P(retval);
zval_ptr_dtor(&argv[0]);
return length;
}
-static size_t _php_curl_write_header(void *ctx, char *data, size_t size, size_t nmemb, FILE *fp)
+static size_t _php_curl_write_header(char *data, size_t size, size_t nmemb, void *ctx)
{
- php_curl *ch = (php_curl *) ctx;
- zval *func = ch->handlers->write_header;
- zval *argv[2];
- zval *retval;
- int error;
- int length;
+ php_curl *ch = (php_curl *) ctx;
+ zval *func = ch->handlers->write_header;
+ zval *argv[2];
+ zval *retval;
+ int error;
+ int length;
+ ELS_FETCH();
MAKE_STD_ZVAL(argv[0]);
MAKE_STD_ZVAL(argv[1]);
zval *argv[3];
zval *retval;
int error;
+ ELS_FETCH();
MAKE_STD_ZVAL(argv[0]);
MAKE_STD_ZVAL(argv[1]);
}
ch = emalloc(sizeof(php_curl));
- ch->write = emalloc(sizeof(php_curl_write));
- ch->read = emalloc(sizeof(php_curl_read));
ch->handlers = emalloc(sizeof(php_curl_handlers));
- memset(ch->write, 0, sizeof(php_curl_write));
- memset(ch->read, 0, sizeof(php_curl_read));
- memset(ch->handlers, 0, sizeof(php_curl_handlers));
+ ch->handlers->write = emalloc(sizeof(php_curl_write));
+ ch->handlers->read = emalloc(sizeof(php_curl_read));
+ memset(ch->handlers->write, 0, sizeof(php_curl_write));
+ memset(ch->handlers->read, 0, sizeof(php_curl_read));
zend_llist_init(&ch->to_free.str, sizeof(char *),
(void(*)(void *)) curl_free_string, 0);
RETURN_FALSE;
}
- ch->write->method = PHP_CURL_STDOUT;
- ch->read->method = PHP_CURL_DIRECT;
+ ch->handlers->write->method = PHP_CURL_STDOUT;
+ ch->handlers->read->method = PHP_CURL_DIRECT;
curl_easy_setopt(ch->cp, CURLOPT_NOPROGRESS, 1);
curl_easy_setopt(ch->cp, CURLOPT_VERBOSE, 0);
curl_easy_setopt(ch->cp, CURLOPT_ERRORBUFFER, ch->err.str);
curl_easy_setopt(ch->cp, CURLOPT_WRITEFUNCTION, curl_write);
- curl_easy_setopt(ch->cp, CURLOPT_WRITEFUNCTIONDATA, (void *) ch);
+ curl_easy_setopt(ch->cp, CURLOPT_FILE, (void *) ch);
curl_easy_setopt(ch->cp, CURLOPT_READFUNCTION, curl_read);
- curl_easy_setopt(ch->cp, CURLOPT_READFUNCTIONDATA, (void *) ch);
+ curl_easy_setopt(ch->cp, CURLOPT_INFILE, (void *) ch);
if (argc > 0) {
char *urlcopy;
convert_to_string_ex(url);
break;
}
- case CURLOPT_FILE:
+ case CURLOPT_FILE:
case CURLOPT_INFILE:
case CURLOPT_WRITEHEADER:
case CURLOPT_STDERR: {
FILE *fp;
ZEND_FETCH_RESOURCE(fp, FILE *, zvalue, -1, "File-Handle", php_file_le_fopen());
-
- error = curl_easy_setopt(ch->cp, option, fp);
+
if (option == CURLOPT_FILE) {
- ch->write->method = PHP_CURL_FILE;
+ ch->handlers->write->fp = fp;
+ ch->handlers->write->method = PHP_CURL_FILE;
}
-
- if (option == CURLOPT_INFILE) {
- ch->read->fd = Z_LVAL_PP(zvalue);
+ else if (option == CURLOPT_INFILE) {
+ zend_list_addref(Z_LVAL_PP(zvalue));
+ ch->handlers->read->fp = fp;
+ ch->handlers->read->fd = Z_LVAL_PP(zvalue);
+ }
+ else {
+ error = curl_easy_setopt(ch->cp, option, fp);
}
break;
convert_to_long_ex(zvalue);
if (Z_LVAL_PP(zvalue)) {
- ch->write->method = PHP_CURL_RETURN;
+ ch->handlers->write->method = PHP_CURL_RETURN;
}
break;
case CURLOPT_WRITEFUNCTION:
zval_add_ref(zvalue);
- ch->write->func = *zvalue;
- ch->write->method = PHP_CURL_USER;
+ ch->handlers->write->func = *zvalue;
+ ch->handlers->write->method = PHP_CURL_USER;
break;
case CURLOPT_READFUNCTION:
zval_add_ref(zvalue);
- ch->read->func = *zvalue;
- ch->read->method = PHP_CURL_USER;
+ ch->handlers->read->func = *zvalue;
+ ch->handlers->read->method = PHP_CURL_USER;
break;
case CURLOPT_HEADERFUNCTION:
zval_add_ref(zvalue);
ch->handlers->write_header = *zvalue;
error = curl_easy_setopt(ch->cp, CURLOPT_HEADERFUNCTION, _php_curl_write_header);
- error = curl_easy_setopt(ch->cp, CURLOPT_HEADERFUNCTIONDATA, (void *) ch);
+ error = curl_easy_setopt(ch->cp, CURLOPT_WRITEHEADER, (void *) ch);
break;
case CURLOPT_PASSWDFUNCTION:
zval_add_ref(zvalue);
RETURN_FALSE;
}
- if (ch->write->method == PHP_CURL_RETURN) {
- smart_str_0(&ch->write->buf);
- RETURN_STRINGL(ch->write->buf.c, ch->write->buf.len, 1);
- smart_str_free(&ch->write->buf);
+ if (ch->handlers->write->method == PHP_CURL_RETURN) {
+ smart_str_0(&ch->handlers->write->buf);
+ RETURN_STRINGL(ch->handlers->write->buf.c, ch->handlers->write->buf.len, 1);
+ smart_str_free(&ch->handlers->write->buf);
}
- else if (ch->write->method == PHP_CURL_STDOUT) {
- smart_str_0(&ch->write->buf);
- PUTS(ch->write->buf.c);
- smart_str_free(&ch->write->buf);
+ else if (ch->handlers->write->method == PHP_CURL_STDOUT) {
+ smart_str_0(&ch->handlers->write->buf);
+ PUTS(ch->handlers->write->buf.c);
+ smart_str_free(&ch->handlers->write->buf);
}
RETURN_TRUE;
zend_llist_clean(&ch->to_free.slist);
zend_llist_clean(&ch->to_free.post);
- if (ch->write->func) zval_ptr_dtor(&ch->write->func);
- if (ch->read->func) zval_ptr_dtor(&ch->read->func);
+ if (ch->handlers->write->func) zval_ptr_dtor(&ch->handlers->write->func);
+ if (ch->handlers->read->func) zval_ptr_dtor(&ch->handlers->read->func);
if (ch->handlers->write_header) zval_ptr_dtor(&ch->handlers->write_header);
if (ch->handlers->passwd) zval_ptr_dtor(&ch->handlers->passwd);
- efree(ch->write);
- efree(ch->read);
+ efree(ch->handlers->write);
+ efree(ch->handlers->read);
efree(ch->handlers);
efree(ch);
}