le_curl = zend_register_list_destructors_ex(_php_curl_close, NULL, "curl", module_number);
/* Constants for curl_setopt() */
+ REGISTER_CURL_CONSTANT(CURLOPT_DNS_USE_GLOBAL_CACHE);
+ REGISTER_CURL_CONSTANT(CURLOPT_DNS_CACHE_TIMEOUT);
REGISTER_CURL_CONSTANT(CURLOPT_PORT);
REGISTER_CURL_CONSTANT(CURLOPT_FILE);
REGISTER_CURL_CONSTANT(CURLOPT_INFILE);
curl_easy_setopt(ch->cp, CURLOPT_INFILE, (void *) ch);
curl_easy_setopt(ch->cp, CURLOPT_HEADERFUNCTION, curl_write_header);
curl_easy_setopt(ch->cp, CURLOPT_WRITEHEADER, (void *) ch);
+ curl_easy_setopt(ch->cp, CURLOPT_DNS_USE_GLOBAL_CACHE, 1);
+ curl_easy_setopt(ch->cp, CURLOPT_DNS_CACHE_TIMEOUT, 120);
+
if (argc > 0) {
char *urlcopy;
convert_to_string_ex(url);
PHP_FUNCTION(curl_setopt)
{
zval **zid,
- **zoption,
- **zvalue;
+ **zoption,
+ **zvalue;
php_curl *ch;
CURLcode error=CURLE_OK;
int option;
option = Z_LVAL_PP(zoption);
switch (option) {
- case CURLOPT_INFILESIZE:
- case CURLOPT_VERBOSE:
- case CURLOPT_HEADER:
- case CURLOPT_NOPROGRESS:
- case CURLOPT_NOBODY:
- case CURLOPT_FAILONERROR:
- case CURLOPT_UPLOAD:
- case CURLOPT_POST:
- case CURLOPT_FTPLISTONLY:
- case CURLOPT_FTPAPPEND:
- case CURLOPT_NETRC:
- case CURLOPT_FOLLOWLOCATION:
- case CURLOPT_PUT:
- case CURLOPT_MUTE:
- case CURLOPT_TIMEOUT:
- case CURLOPT_LOW_SPEED_LIMIT:
- case CURLOPT_SSLVERSION:
- case CURLOPT_LOW_SPEED_TIME:
- case CURLOPT_RESUME_FROM:
- case CURLOPT_TIMEVALUE:
- case CURLOPT_TIMECONDITION:
- case CURLOPT_TRANSFERTEXT:
- case CURLOPT_HTTPPROXYTUNNEL:
- case CURLOPT_FILETIME:
- case CURLOPT_MAXREDIRS:
- case CURLOPT_MAXCONNECTS:
- case CURLOPT_CLOSEPOLICY:
- case CURLOPT_FRESH_CONNECT:
- case CURLOPT_FORBID_REUSE:
- case CURLOPT_CONNECTTIMEOUT:
- case CURLOPT_SSL_VERIFYHOST:
- case CURLOPT_SSL_VERIFYPEER:
- convert_to_long_ex(zvalue);
- error = curl_easy_setopt(ch->cp, option, Z_LVAL_PP(zvalue));
- break;
- case CURLOPT_URL:
- case CURLOPT_PROXY:
- case CURLOPT_USERPWD:
- case CURLOPT_PROXYUSERPWD:
- case CURLOPT_RANGE:
- case CURLOPT_CUSTOMREQUEST:
- case CURLOPT_USERAGENT:
- case CURLOPT_FTPPORT:
- case CURLOPT_COOKIE:
- case CURLOPT_SSLCERT:
- case CURLOPT_SSLCERTPASSWD:
- case CURLOPT_COOKIEFILE:
- case CURLOPT_REFERER:
- case CURLOPT_INTERFACE:
- case CURLOPT_KRB4LEVEL:
- case CURLOPT_RANDOM_FILE:
- case CURLOPT_EGDSOCKET:
- case CURLOPT_CAINFO:
- case CURLOPT_COOKIEJAR:
- case CURLOPT_SSL_CIPHER_LIST: {
- char *copystr = NULL;
+ case CURLOPT_INFILESIZE:
+ case CURLOPT_VERBOSE:
+ case CURLOPT_HEADER:
+ case CURLOPT_NOPROGRESS:
+ case CURLOPT_NOBODY:
+ case CURLOPT_FAILONERROR:
+ case CURLOPT_UPLOAD:
+ case CURLOPT_POST:
+ case CURLOPT_FTPLISTONLY:
+ case CURLOPT_FTPAPPEND:
+ case CURLOPT_NETRC:
+ case CURLOPT_FOLLOWLOCATION:
+ case CURLOPT_PUT:
+ case CURLOPT_MUTE:
+ case CURLOPT_TIMEOUT:
+ case CURLOPT_LOW_SPEED_LIMIT:
+ case CURLOPT_SSLVERSION:
+ case CURLOPT_LOW_SPEED_TIME:
+ case CURLOPT_RESUME_FROM:
+ case CURLOPT_TIMEVALUE:
+ case CURLOPT_TIMECONDITION:
+ case CURLOPT_TRANSFERTEXT:
+ case CURLOPT_HTTPPROXYTUNNEL:
+ case CURLOPT_FILETIME:
+ case CURLOPT_MAXREDIRS:
+ case CURLOPT_MAXCONNECTS:
+ case CURLOPT_CLOSEPOLICY:
+ case CURLOPT_FRESH_CONNECT:
+ case CURLOPT_FORBID_REUSE:
+ case CURLOPT_CONNECTTIMEOUT:
+ case CURLOPT_SSL_VERIFYHOST:
+ case CURLOPT_SSL_VERIFYPEER:
+ case CURLOPT_DNS_USE_GLOBAL_CACHE:
+ convert_to_long_ex(zvalue);
+ error = curl_easy_setopt(ch->cp, option, Z_LVAL_PP(zvalue));
+ break;
+ case CURLOPT_URL:
+ case CURLOPT_PROXY:
+ case CURLOPT_USERPWD:
+ case CURLOPT_PROXYUSERPWD:
+ case CURLOPT_RANGE:
+ case CURLOPT_CUSTOMREQUEST:
+ case CURLOPT_USERAGENT:
+ case CURLOPT_FTPPORT:
+ case CURLOPT_COOKIE:
+ case CURLOPT_SSLCERT:
+ case CURLOPT_SSLCERTPASSWD:
+ case CURLOPT_COOKIEFILE:
+ case CURLOPT_REFERER:
+ case CURLOPT_INTERFACE:
+ case CURLOPT_KRB4LEVEL:
+ case CURLOPT_RANDOM_FILE:
+ case CURLOPT_EGDSOCKET:
+ case CURLOPT_CAINFO:
+ case CURLOPT_COOKIEJAR:
+ case CURLOPT_SSL_CIPHER_LIST: {
+ char *copystr = NULL;
- convert_to_string_ex(zvalue);
- copystr = estrndup(Z_STRVAL_PP(zvalue), Z_STRLEN_PP(zvalue));
-
- error = curl_easy_setopt(ch->cp, option, copystr);
- zend_llist_add_element(&ch->to_free.str, ©str);
+ convert_to_string_ex(zvalue);
+ copystr = estrndup(Z_STRVAL_PP(zvalue), Z_STRLEN_PP(zvalue));
- break;
- }
- case CURLOPT_FILE:
- case CURLOPT_INFILE:
- case CURLOPT_WRITEHEADER:
- case CURLOPT_STDERR: {
- FILE *fp = NULL;
- int type;
- void * what;
-
- what = zend_fetch_resource(zvalue TSRMLS_CC, -1, "File-Handle", &type, 1, php_file_le_stream());
- ZEND_VERIFY_RESOURCE(what);
-
- if (FAILURE == php_stream_cast((php_stream *) what,
- PHP_STREAM_AS_STDIO,
- (void *) &fp,
- REPORT_ERRORS)) {
- RETURN_FALSE;
- }
+ error = curl_easy_setopt(ch->cp, option, copystr);
+ zend_llist_add_element(&ch->to_free.str, ©str);
- if (!fp) {
- RETURN_FALSE;
+ break;
}
-
- error = CURLE_OK;
- switch (option) {
case CURLOPT_FILE:
- ch->handlers->write->fp = fp;
- ch->handlers->write->method = PHP_CURL_FILE;
- break;
+ case CURLOPT_INFILE:
case CURLOPT_WRITEHEADER:
- ch->handlers->write_header->fp = fp;
- ch->handlers->write_header->method = PHP_CURL_FILE;
- break;
- case CURLOPT_INFILE:
- zend_list_addref(Z_LVAL_PP(zvalue));
- ch->handlers->read->fp = fp;
- ch->handlers->read->fd = Z_LVAL_PP(zvalue);
- break;
- default:
- error = curl_easy_setopt(ch->cp, option, fp);
- break;
- }
+ case CURLOPT_STDERR: {
+ FILE *fp = NULL;
+ int type;
+ void * what;
+
+ what = zend_fetch_resource(zvalue TSRMLS_CC, -1, "File-Handle", &type, 1, php_file_le_stream());
+ ZEND_VERIFY_RESOURCE(what);
- break;
- }
- case CURLOPT_RETURNTRANSFER:
- convert_to_long_ex(zvalue);
+ if (FAILURE == php_stream_cast((php_stream *) what,
+ PHP_STREAM_AS_STDIO,
+ (void *) &fp,
+ REPORT_ERRORS)) {
+ RETURN_FALSE;
+ }
- if (Z_LVAL_PP(zvalue)) {
- ch->handlers->write->method = PHP_CURL_RETURN;
- }
- break;
- case CURLOPT_BINARYTRANSFER:
- convert_to_long_ex(zvalue);
+ if (!fp) {
+ RETURN_FALSE;
+ }
+
+ error = CURLE_OK;
+ switch (option) {
+ case CURLOPT_FILE:
+ ch->handlers->write->fp = fp;
+ ch->handlers->write->method = PHP_CURL_FILE;
+ break;
+ case CURLOPT_WRITEHEADER:
+ ch->handlers->write_header->fp = fp;
+ ch->handlers->write_header->method = PHP_CURL_FILE;
+ break;
+ case CURLOPT_INFILE:
+ zend_list_addref(Z_LVAL_PP(zvalue));
+ ch->handlers->read->fp = fp;
+ ch->handlers->read->fd = Z_LVAL_PP(zvalue);
+ break;
+ default:
+ error = curl_easy_setopt(ch->cp, option, fp);
+ break;
+ }
- if (Z_LVAL_PP(zvalue)) {
- ch->handlers->write->type = PHP_CURL_BINARY;
+ break;
}
- break;
- case CURLOPT_WRITEFUNCTION:
- zval_add_ref(zvalue);
- ch->handlers->write->func = *zvalue;
- ch->handlers->write->method = PHP_CURL_USER;
- break;
- case CURLOPT_READFUNCTION:
- zval_add_ref(zvalue);
- ch->handlers->read->func = *zvalue;
- ch->handlers->read->method = PHP_CURL_USER;
- break;
- case CURLOPT_HEADERFUNCTION:
- zval_add_ref(zvalue);
- ch->handlers->write_header->func = *zvalue;
- ch->handlers->write_header->method = PHP_CURL_USER;
- break;
- case CURLOPT_PASSWDFUNCTION:
- zval_add_ref(zvalue);
- ch->handlers->passwd = *zvalue;
- error = curl_easy_setopt(ch->cp, CURLOPT_PASSWDFUNCTION, curl_passwd);
- error = curl_easy_setopt(ch->cp, CURLOPT_PASSWDDATA, (void *) ch);
- break;
- case CURLOPT_POSTFIELDS:
- if (Z_TYPE_PP(zvalue) == IS_ARRAY || Z_TYPE_PP(zvalue) == IS_OBJECT) {
- zval **current;
- HashTable *postfields;
- struct HttpPost *first = NULL;
- struct HttpPost *last = NULL;
- char *postval;
- char *string_key = NULL;
- ulong num_key;
- uint string_key_len;
-
- postfields = HASH_OF(*zvalue);
- if (! postfields) {
- php_error(E_WARNING,
- "%s(): Couldn't get HashTable in CURLOPT_POSTFIELDS",
- get_active_function_name(TSRMLS_C));
- RETURN_FALSE;
+ case CURLOPT_RETURNTRANSFER:
+ convert_to_long_ex(zvalue);
+
+ if (Z_LVAL_PP(zvalue)) {
+ ch->handlers->write->method = PHP_CURL_RETURN;
}
+ break;
+ case CURLOPT_BINARYTRANSFER:
+ convert_to_long_ex(zvalue);
- for (zend_hash_internal_pointer_reset(postfields);
- zend_hash_get_current_data(postfields, (void **) ¤t) == SUCCESS;
- zend_hash_move_forward(postfields)) {
+ if (Z_LVAL_PP(zvalue)) {
+ ch->handlers->write->type = PHP_CURL_BINARY;
+ }
+ break;
+ case CURLOPT_WRITEFUNCTION:
+ zval_add_ref(zvalue);
+ ch->handlers->write->func = *zvalue;
+ ch->handlers->write->method = PHP_CURL_USER;
+ break;
+ case CURLOPT_READFUNCTION:
+ zval_add_ref(zvalue);
+ ch->handlers->read->func = *zvalue;
+ ch->handlers->read->method = PHP_CURL_USER;
+ break;
+ case CURLOPT_HEADERFUNCTION:
+ zval_add_ref(zvalue);
+ ch->handlers->write_header->func = *zvalue;
+ ch->handlers->write_header->method = PHP_CURL_USER;
+ break;
+ case CURLOPT_PASSWDFUNCTION:
+ zval_add_ref(zvalue);
+ ch->handlers->passwd = *zvalue;
+ error = curl_easy_setopt(ch->cp, CURLOPT_PASSWDFUNCTION, curl_passwd);
+ error = curl_easy_setopt(ch->cp, CURLOPT_PASSWDDATA, (void *) ch);
+ break;
+ case CURLOPT_POSTFIELDS:
+ if (Z_TYPE_PP(zvalue) == IS_ARRAY || Z_TYPE_PP(zvalue) == IS_OBJECT) {
+ zval **current;
+ HashTable *postfields;
+ struct HttpPost *first = NULL;
+ struct HttpPost *last = NULL;
+ char *postval;
+ char *string_key = NULL;
+ ulong num_key;
+ uint string_key_len;
+
+ postfields = HASH_OF(*zvalue);
+ if (! postfields) {
+ php_error(E_WARNING,
+ "%s(): Couldn't get HashTable in CURLOPT_POSTFIELDS",
+ get_active_function_name(TSRMLS_C));
+ RETURN_FALSE;
+ }
- SEPARATE_ZVAL(current);
- convert_to_string_ex(current);
+ for (zend_hash_internal_pointer_reset(postfields);
+ zend_hash_get_current_data(postfields, (void **) ¤t) == SUCCESS;
+ zend_hash_move_forward(postfields)) {
+
+ SEPARATE_ZVAL(current);
+ convert_to_string_ex(current);
- zend_hash_get_current_key_ex(postfields, &string_key, &string_key_len, &num_key, 0, NULL);
+ zend_hash_get_current_key_ex(postfields, &string_key, &string_key_len, &num_key, 0, NULL);
- postval = Z_STRVAL_PP(current);
- if (*postval == '@') {
- error = curl_formadd(&first, &last,
- CURLFORM_COPYNAME, string_key,
- CURLFORM_NAMELENGTH, string_key_len - 1,
- CURLFORM_FILE, ++postval,
- CURLFORM_END);
+ postval = Z_STRVAL_PP(current);
+ if (*postval == '@') {
+ error = curl_formadd(&first, &last,
+ CURLFORM_COPYNAME, string_key,
+ CURLFORM_NAMELENGTH, string_key_len - 1,
+ CURLFORM_FILE, ++postval,
+ CURLFORM_END);
+ }
+ else {
+ error = curl_formadd(&first, &last,
+ CURLFORM_COPYNAME, string_key,
+ CURLFORM_NAMELENGTH, string_key_len - 1,
+ CURLFORM_PTRCONTENTS, postval,
+ CURLFORM_CONTENTSLENGTH, Z_STRLEN_PP(current),
+ CURLFORM_END);
+ }
}
- else {
- error = curl_formadd(&first, &last,
- CURLFORM_COPYNAME, string_key,
- CURLFORM_NAMELENGTH, string_key_len - 1,
- CURLFORM_PTRCONTENTS, postval,
- CURLFORM_CONTENTSLENGTH, Z_STRLEN_PP(current),
- CURLFORM_END);
+
+ SAVE_CURL_ERROR(ch, error);
+ if (error != CURLE_OK) {
+ RETURN_FALSE;
}
- }
- SAVE_CURL_ERROR(ch, error);
- if (error != CURLE_OK) {
- RETURN_FALSE;
+ zend_llist_add_element(&ch->to_free.post, &first);
+ error = curl_easy_setopt(ch->cp, CURLOPT_HTTPPOST, first);
}
+ else {
+ char *post = NULL;
- zend_llist_add_element(&ch->to_free.post, &first);
- error = curl_easy_setopt(ch->cp, CURLOPT_HTTPPOST, first);
- }
- else {
- char *post = NULL;
+ convert_to_string_ex(zvalue);
+ post = estrndup(Z_STRVAL_PP(zvalue), Z_STRLEN_PP(zvalue));
+ zend_llist_add_element(&ch->to_free.str, &post);
- convert_to_string_ex(zvalue);
- post = estrndup(Z_STRVAL_PP(zvalue), Z_STRLEN_PP(zvalue));
- zend_llist_add_element(&ch->to_free.str, &post);
-
- error = curl_easy_setopt(ch->cp, CURLOPT_POSTFIELDS, post);
- error = curl_easy_setopt(ch->cp, CURLOPT_POSTFIELDSIZE, Z_STRLEN_PP(zvalue));
- }
+ error = curl_easy_setopt(ch->cp, CURLOPT_POSTFIELDS, post);
+ error = curl_easy_setopt(ch->cp, CURLOPT_POSTFIELDSIZE, Z_STRLEN_PP(zvalue));
+ }
- break;
- case CURLOPT_HTTPHEADER:
- case CURLOPT_QUOTE:
- case CURLOPT_POSTQUOTE: {
- zval **current;
- HashTable *ph;
- struct curl_slist *slist = NULL;
-
- ph = HASH_OF(*zvalue);
- if (!ph) {
- php_error(E_WARNING,
- "%s(): You must pass either an object or an array with the CURLOPT_HTTPHEADER, "
- "CURLOPT_QUOTE and CURLOPT_POSTQUOTE arguments", get_active_function_name(TSRMLS_C));
- RETURN_FALSE;
- }
+ break;
+ case CURLOPT_HTTPHEADER:
+ case CURLOPT_QUOTE:
+ case CURLOPT_POSTQUOTE: {
+ zval **current;
+ HashTable *ph;
+ struct curl_slist *slist = NULL;
+
+ ph = HASH_OF(*zvalue);
+ if (!ph) {
+ php_error(E_WARNING,
+ "%s(): You must pass either an object or an array with the CURLOPT_HTTPHEADER, "
+ "CURLOPT_QUOTE and CURLOPT_POSTQUOTE arguments", get_active_function_name(TSRMLS_C));
+ RETURN_FALSE;
+ }
- for (zend_hash_internal_pointer_reset(ph);
- zend_hash_get_current_data(ph, (void **) ¤t) == SUCCESS;
- zend_hash_move_forward(ph)) {
- char *indiv = NULL;
+ for (zend_hash_internal_pointer_reset(ph);
+ zend_hash_get_current_data(ph, (void **) ¤t) == SUCCESS;
+ zend_hash_move_forward(ph)) {
+ char *indiv = NULL;
- SEPARATE_ZVAL(current);
- convert_to_string_ex(current);
+ SEPARATE_ZVAL(current);
+ convert_to_string_ex(current);
- indiv = estrndup(Z_STRVAL_PP(current), Z_STRLEN_PP(current) + 1);
- slist = curl_slist_append(slist, indiv);
- if (! slist) {
- efree(indiv);
- php_error(E_WARNING, "%s(): Couldn't build curl_slist", get_active_function_name(TSRMLS_C));
- RETURN_FALSE;
+ indiv = estrndup(Z_STRVAL_PP(current), Z_STRLEN_PP(current) + 1);
+ slist = curl_slist_append(slist, indiv);
+ if (! slist) {
+ efree(indiv);
+ php_error(E_WARNING, "%s(): Couldn't build curl_slist", get_active_function_name(TSRMLS_C));
+ RETURN_FALSE;
+ }
+ zend_llist_add_element(&ch->to_free.str, &indiv);
}
- zend_llist_add_element(&ch->to_free.str, &indiv);
- }
- zend_llist_add_element(&ch->to_free.slist, &slist);
+ zend_llist_add_element(&ch->to_free.slist, &slist);
- error = curl_easy_setopt(ch->cp, option, slist);
+ error = curl_easy_setopt(ch->cp, option, slist);
- break;
- }
+ break;
+ }
}
SAVE_CURL_ERROR(ch, error);